@MartinPrikryl 的免责声明:此解决方案已过时,因为phpseclib 本身支持多因素身份验证- 另请参阅@BoukeVersteegh和@neubert的答案。
我在使用 phpseclib 的一个项目中遇到了同样的问题。我尝试了几个建议都无济于事,最后自己对库代码进行了一些研究。我最终修改了它,虽然不是很多。
在SSH2.php私有方法'_privatekey_login'(有key时从login方法调用)中,方法末尾有处理认证失败的代码。
extract(unpack('Ctype', $this->_string_shift($response, 1)));
switch ($type) {
case NET_SSH2_MSG_USERAUTH_FAILURE:
// either the login is bad or the server employs multi-factor authentication
return false;
case NET_SSH2_MSG_USERAUTH_SUCCESS:
$this->bitmap |= NET_SSH2_MASK_LOGIN;
return true;
}
输入一些日志后,我发现我从服务器返回的响应确实是“密码,键盘交互”。
我修改了所有登录方法(在 SFTP 和 SSH2 类中)以获取第二个密码,并将其一直传递给“_privatekey_login”方法。然后我将上面的部分更改为以下内容:
extract(unpack('Ctype', $this->_string_shift($response, 1)));
switch ($type) {
case NET_SSH2_MSG_USERAUTH_FAILURE:
// Possible multi-factor authentication.
if ($password && $this->_keyboard_interactive_login($username, $password)) {
$this->bitmap |= NET_SSH2_MASK_LOGIN;
return true;
}
// the login is bad.
return false;
case NET_SSH2_MSG_USERAUTH_SUCCESS:
$this->bitmap |= NET_SSH2_MASK_LOGIN;
return true;
}
我从代码的另一部分复制了键盘交互调用,因此其中一些可能不是完全必要的。虽然它可能不适用于所有服务器,但在我的情况下它工作得很好。