2

抱歉,如果我在文档中遗漏了这一点,但是否可以使用私钥和密码(不是我的私钥的密码)连接到 SFTP 服务器。

这些示例显示了用户名/密码、用户名/密钥和用户名/密钥/密钥密码验证类型。

通过命令行连接时,我会收到输入密码的提示...

用户@xxxx 的密码:

希望这个库可以处理这个?

否则是否有任何其他基于 PHP 的解决方案可能支持用户名/密钥和服务器密码身份验证?我在这里很灵活,可以根据需要安装模块。

编辑

到目前为止,感谢您的帮助...我已经尝试过您提到的 Neubert 但这似乎不起作用。为了验证连接到服务器所需的内容,我在命令行上对此进行了测试。
sftp key user@ip- 按预期
sftp user@ip提示输入密码 - 提示输入密码,但输入正确时告诉我“已通过部分成功验证”。

如果我可以使用密钥然后密码进入,我认为目录和密钥的权限应该没问题。

我开始认为这个库不支持我需要的东西。

4

5 回答 5

3

phpseclib支持多因素身份验证。以下是如何执行此操作的示例:

<?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 而言不是这样。

于 2012-12-10T21:17:36.020 回答
2

@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;
}

我从代码的另一部分复制了键盘交互调用,因此其中一些可能不是完全必要的。虽然它可能不适用于所有服务器,但在我的情况下它工作得很好。

于 2013-02-06T22:08:43.423 回答
1

简短的简单回答:首先使用用户+密钥登录,然后使用用户+密码登录。

$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
}

是的,这已经被提到了,但是长的注释使它变得晦涩难懂并且看起来很复杂。

于 2016-11-23T12:58:30.190 回答
0

我决定删除我的另一个答案,因为事实证明我错了;您可以使用 SSH 进行多因素登录,但不是以标准方式。这些身份验证方法都不是原生的或内置于 openssh 的,因此没有标准的方法来解决它。大多数使用 Google Authenticator 提供一次性密码,但也有区别。根据该站点的建议,看起来它是通过在用户通过 SSH 服务器身份验证之后调用命令来完成的。查看方法中的源phpseclib代码,它具有以下代码:Net/SSH2.phplogin()

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 开发人员也意识到多因素身份验证是可能的,但由于缺乏标准,他们没有费心编写它。谷歌搜索你的错误代码

部分成功认证

表明这是您尝试连接的服务器的设置方式。如果您想编写特定于服务器设置的多因素身份验证,我不明白为什么这是不可能的。这是您需要编辑才能执行此操作的文件。

于 2012-12-11T19:18:42.123 回答
-2

您可以在 PECL 中使用 SSH2 绑定。它支持您提到的所有身份验证机制并且运行良好。

于 2012-12-10T18:17:41.157 回答