如果我在文档中遗漏了这个,但是可以使用私钥和密码(不是我的私钥的密码)连接到SFTP服务器,这表示道歉。
示例显示用户名/密码,用户名/密钥和用户名/密钥/密钥密码验证类型。
通过命令行连接时,我会收到密码的提示......
user@x.x.x.x的密码:
希望这个库可以解决这个问题吗?
否则是否有其他基于PHP的解决方案可能支持用户名/密钥和服务器密码身份验证?我在这里很灵活,如果需要可以安装模块。
修改
感谢您的帮助到目前为止......
我曾尝试过你提到的Neubert,但这似乎没有用。
为了验证连接到服务器的必要性,我在命令行上对此进行了测试
sftp key user@ip
- 按预期提示输入密码
sftp user@ip
- 提示输入密码,但输入正确后告知我“已通过部分成功验证”。
我认为如果我可以使用密钥然后使用密码,那么对目录和密钥的许可应该没问题。
我开始认为这个库不支持我需要的东西。
答案 0 :(得分:3)
phpseclib supports multi factor authentication。以下是如何执行此操作的示例:
<?php
include('Net/SSH2.php');
include('Crypt/RSA.php')
$rsa = new Crypt_RSA();
$rsa->loadKey(file_get_contents('/path/to/key.pem'));
$ssh = new Net_SSH2('www.domain.tld');
if (!$ssh->login('username', 'pass1', $rsa)) {
exit('Login failed');
}
// this does the same thing as the above
//if (!$ssh->login($username, 'pass1') && !$ssh->login('username', $rsa)) {
// exit('Login failed');
//}
echo $ssh->exec('pwd');
echo $ssh->exec('ls -la');
?>
但要注意的是:很多人将密码保护的私钥混淆为多因素(密码和公钥),而实际上并非如此。至少在SSH方面还远远不够。
答案 1 :(得分:2)
@MartinPrikryl的免责声明:此解决方案已过时,现在phpseclib supports multi-factor authentication natively - 请参阅answer by @BoukeVersteegh和@neubert。
我使用phpseclib为我的一个项目遇到了同样的问题。我尝试了几个建议无济于事,最后自己对库代码做了一些研究。我最后修改了它,虽然不是很多。
在SSH2.php私有方法'_privatekey_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;
}
我从代码的另一部分复制了键盘交互式调用,因此其中一些可能不是完全必要的。 虽然它可能不适用于所有服务器,但它在我的案例中运行得非常好。
答案 2 :(得分:1)
简单的简单回答:先用user + key登录,然后用user + pass登录。
$host = 'ftp.example.com';
$username = 'username';
$password = 'secret';
$key = new RSA();
$key->load(file_get_contents('~/.ssh/private_key.pem'));
$sftp = new SFTP($host);
if ($sftp->login($username, $key) || $sftp->login($username, $secret)) {
// success
} else {
// failed
}
是的,这已经提到了,但是长长的音符使它变得模糊不清,看起来很复杂。
答案 3 :(得分:0)
我决定删除我的另一个答案,因为事实证明我错了;你可以使用SSH进行多因素登录,而不是以标准方式。这些身份验证方法都不是本机的,也不是openssh内置的,因此没有标准的方法可以解决这个问题。大多数人使用Google身份验证器提供一次性密码,但存在差异。根据{{3}}推荐的内容,看起来它是通过在SSH服务器验证用户之后调用命令来完成的。查看phpseclib
方法中Net/SSH2.php
中的login()
源代码,它具有以下代码:
case NET_SSH2_MSG_USERAUTH_FAILURE:
// can we use keyboard-interactive authentication? if not then either the login is bad or the server employees
// multi-factor authentication
[...]
return false;
即使是phpseclib开发者也意识到多因素身份验证是可能的,但由于缺乏标准,他们并没有费心去编码。谷歌搜索您的错误代码
部分成功验证
表明这是您尝试连接的服务器的设置方式。如果您想编写特定于服务器设置的多因素身份验证,我不明白为什么它不可能。这是您需要编辑的文件。
答案 4 :(得分:-1)
您可以使用SSH2 bindings in PECL。它支持您提到的所有身份验证机制并且运行良好。