[英]How to tell if phpseclib sftp response is a challenge with a password request when key doesn't match
最近有人無意中將用於我的 ssh/sftp 的密鑰文件更改為遠程服務器。 當我嘗試從命令行通過 ssh 連接到服務器時,我推斷出這一點,並且我收到了密碼請求的挑戰,這表明密鑰不再被識別。
如何讓我的 php 程序檢測到意外的密碼挑戰? 目前我有這個:
$sftp = new SFTP(self::DOMAIN_NAME);
$Key = new RSA();
$private_rsa_key = file_get_contents('/home/ddfs/.ssh/' . self::KEY_FILE);
$Key->loadKey($private_rsa_key);
$rc = $sftp->login(self::USER, $Key);
$errors = $sftp->getSFTPErrors();
目前我看到 $rc 設置為 FALSE 並且 $errors 是一個空數組。
SSH 發起的密碼更改請求
SSH 有一個內置的密碼重置機制。 我對RFC4252 § 8 的閱讀意味着 SSH_MSG_USERAUTH_PASSWD_CHANGEREQ 數據包應該只在響應“密碼”SSH_MSG_USERAUTH_REQUEST 時發送,但誰知道 OpenSSH 開發人員如何解釋 RFC 的該部分。
由於您正在進行公鑰身份驗證,phpseclib 將發送一個“公鑰” SSH_MSG_USERAUTH_REQUEST 所以看起來 SSH_MSG_USERAUTH_PASSWD_CHANGEREQ 不會是一個有效的響應,但同樣,誰知道呢。
如果服務器確實以 SSH_MSG_USERAUTH_PASSWD_CHANGEREQ 數據包響應,那么您可以執行$sftp->getErrors()
(而不是getSFTPErrors
)並查找以SSH_MSG_USERAUTH_PASSWD_CHANGEREQ:
開頭的數據包。 甚至可以做$sftp->getLastError()
。
getSFTPErrors
返回 SFTP 層的錯誤 - 而不是 SSH2 層。 SFTP 作為協議不知道身份驗證 - 這完全由 SSH 層處理。 IE。 您要查看的不是 SFTP 錯誤,而是 SSH 錯誤。
參考代碼: https : //github.com/phpseclib/phpseclib/blob/1.0.7/phpseclib/Net/SSH2.php#L2219
其他可能的密碼請求機制
密碼請求可能不是來自 SSH 的內置身份驗證機制。 您可能會從“公鑰”SSH_MSG_USERAUTH_REQUEST 獲得 SSH_MSG_USERAUTH_SUCCESS 響應。
在這一點上,我可以看到兩種可能性:
它可能是您看到的橫幅消息。 您可以通過執行$sftp->getBannerMessage()
來獲得這些。
當您通過 SSH 進入服務器而不是 SFTP 進入服務器時,您可能只會看到此錯誤。 IE。 除非您$ssh->exec()
或$ssh->write()
否則您可能看不到錯誤。 此時,“錯誤”可以通過 stderr 或 stdout 傳達給您。
要確定我必須查看 SSH 日志。 phpseclib 日志可能足夠也可能不夠。 我的意思是你可以做$sftp->exec('pwd');
或$sftp->read('[prompt]');
但我的猜測是你還沒有這樣做。 如果你想走那條路,你可以define('NET_SSH2_LOGGING', 2);
然后在執行$sftp->exec()
或$sftp->read()
后echo $sftp->getLog()
$sftp->read()
。
PuTTY 日志可能更有用。 要獲取它們,您可以轉到 PuTTY->Session->Logging,選中“SSH 數據包”單選按鈕,然后照常連接。
不幸的是,據我所知,OpenSSH 不會記錄原始/解密的 SSH2 數據包,因此 OpenSSH 在這里不會太有用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.