Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/258.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
当密钥不存在时,如何判断phpseclib sftp响应是否是密码请求的质询';不匹配_Php_Sftp_Phpseclib - Fatal编程技术网

当密钥不存在时,如何判断phpseclib sftp响应是否是密码请求的质询';不匹配

当密钥不存在时,如何判断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-&

最近有人无意中将用于我的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内置了密码重置机制。我对的理解意味着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进入服务器而不是SFTP进入服务器时才看到此错误。如果不执行
    $ssh->exec()
    $ssh->write()
    ,则可能看不到错误。此时,“错误”可以通过stderr或stdout传递给您

  • 要确定,我必须查看SSH日志。phpseclib日志可能足够,也可能不够。我的意思是你可以做
    $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