当密钥不存在时,如何判断phpseclib sftp响应是否是密码请求的质询';不匹配
最近有人无意中将用于我的ssh/sftp的密钥文件更改为远程服务器。当我试图从命令行ssh连接到服务器时,我推断出了这一点,我收到了一个密码请求,这表明密钥不再被识别 如何让我的php程序检测到意外的密码挑战?目前我有:当密钥不存在时,如何判断phpseclib sftp响应是否是密码请求的质询';不匹配,php,sftp,phpseclib,Php,Sftp,Phpseclib,最近有人无意中将用于我的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-&
$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内置了密码重置机制。我对的理解意味着SSH\u MSG\u USERAUTH\u PASSWD\u CHANGEREQ数据包只应在响应“密码”SSH\u MSG\u USERAUTH\u请求时发送,但谁知道OpenSSH开发人员如何解释RFC的该部分 由于您正在执行公钥身份验证,phpseclib将发送一个“公钥”SSH\u MSG\u USERAUTH\u请求,因此SSH\u MSG\u USERAUTH\u PASSWD\u CHANGEREQ似乎不是有效的响应,但谁知道呢 如果服务器确实响应了SSH_MSG_USERAUTH_PASSWD_CHANGEREQ数据包,那么您可以执行
$sftp->getErrors()
(而不是getSFTPErrors
)并查找以SSH_MSG_USERAUTH_PASSWD_CHANGEREQ:
开头的数据包。甚至可以执行$sftp->getLastError()
getSFTPErrors
返回SFTP层错误,而不是SSH2层错误。作为一种协议,SFTP不知道身份验证——这完全由SSH层处理。您想查看的不是SFTP错误,而是SSH错误
参考代码:
其他可能的密码请求机制
密码请求可能不是来自SSH的内置身份验证机制。您可能从“publickey”SSH\u MSG\u USERAUTH\u请求获得SSH\u MSG\u USERAUTH\u成功响应
在这一点上,我可以看到两种可能性:
$sftp->getBannerMessage()
来获取这些信息$ssh->exec()
或$ssh->write()
,则可能看不到错误。此时,“错误”可以通过stderr或stdout传递给您$sftp->exec('pwd')代码>或$sftp->读取(“[提示]”)但我猜你还没有这么做。如果你想走这条路,你可以做define('NET\u SSH2\u LOGGING',2)然后在执行$sftp->exec()
或$sftp->read()
之后回显$sftp->getLog()
油灰原木可能更有用。要获取它们,您可以转到PuTTY->Session->Logging,选中“SSH数据包”单选按钮,然后像往常一样连接
不幸的是,据我所知,OpenSSH没有记录原始/解密的SSH2数据包,因此OpenSSH在这里不会太有用。谢谢。我添加了$errors=$sftp->getErrors()$last_error=$sftp->getLastError()
但在登录尝试失败后,这两个都是空的。@NickWeavers-我更新了我的答案。特别要注意第二部分,因为听起来您的服务器没有使用SSH\u MSG\u USERAUTH\u PASSWD\u CHANGEREQ
。