Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/256.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.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-我可以使用用户名、密钥和密码(不是密钥密码短语)进行连接吗_Php_Ssh_Passwords_Sftp_Phpseclib - Fatal编程技术网

phpseclib-我可以使用用户名、密钥和密码(不是密钥密码短语)进行连接吗

phpseclib-我可以使用用户名、密钥和密码(不是密钥密码短语)进行连接吗,php,ssh,passwords,sftp,phpseclib,Php,Ssh,Passwords,Sftp,Phpseclib,抱歉,如果我在文档中遗漏了这一点,但是否可以使用私钥和密码(不是私钥的密码短语)连接到SFTP服务器 示例显示用户名/密码、用户名/密钥和用户名/密钥/密钥密码短语身份验证类型 当通过命令行连接时,我会得到输入密码的提示 user@x.x.x.x的密码: 希望这个图书馆能处理这个问题 否则,还有其他基于PHP的解决方案可能支持用户名/密钥和服务器密码身份验证吗?我在这里很灵活,如果需要可以安装模块 编辑 谢谢你到目前为止的帮助。。。 我试过你提到的纽伯特,但这似乎不起作用。 为了验证连接到服务器

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

示例显示用户名/密码、用户名/密钥和用户名/密钥/密钥密码短语身份验证类型

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

user@x.x.x.x的密码:

希望这个图书馆能处理这个问题

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

编辑

谢谢你到目前为止的帮助。。。 我试过你提到的纽伯特,但这似乎不起作用。 为了验证连接到服务器所需的功能,我在命令行上测试了此功能。
sftp密钥user@ip
-按预期提示输入密码
sftpuser@ip
-提示输入密码,但正确输入后告知我“已通过部分成功的身份验证”

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

我开始觉得这个库不支持我需要的东西。

您可以使用。它支持您提到的所有身份验证机制,并且运行良好。

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

我决定删除我的另一个答案,因为结果证明我错了;您可以使用SSH进行多因素登录,但不是以标准方式。这些身份验证方法都不是openssh的本机或内置方法,因此没有标准的方法。大多数人使用Google Authenticator提供一次性密码,但存在差异。根据建议,这似乎是通过在SSH服务器对用户进行身份验证后调用命令来完成的。查看
login()
方法中
Net/SSH2.php
中的
phpseclib
源代码,它有以下代码:

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

认证部分成功

显示这是您尝试连接到的服务器的设置方式。如果您想针对服务器的设置编写多因素身份验证代码,我不明白为什么不可能。这是您需要编辑的文件。

免责声明@MartinPrikryl:此解决方案已过时,现在-另请参阅和


我在使用phpseclib的一个项目中遇到了同样的问题。我尝试了几条建议,但都无济于事,最后我自己对库代码做了一些研究。我最终修改了它,虽然不是很多

在SSH2.php私有方法“_privatekey_login”(有密钥时从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;
}
我从代码的另一部分复制了键盘交互调用,因此其中一些可能不是完全必要的。
虽然它可能不适用于所有服务器,但在我的情况下,它工作得非常出色。

简单的回答:首先使用user+键登录,然后使用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
}

是的,这一点已经提到了,但是长注释使它变得模糊和复杂。

看到私钥的前x个字符,直到base64编码的blob,仍然会很有趣。另外,查看phpseclib日志也很有趣。就像是SSH服务器在说“部分成功地进行了身份验证”还是客户端?您可以按照中的描述进行操作。注意define()和$ssh->getLog()调用$sftp->login()&&$sftp->login()。如果正在使用多因素身份验证,并且密码身份验证返回false,那么只要有一个身份验证方法返回true,就可以了。我已经更新了我的原始帖子。@neubert看到我对你的回答的评论了吗?我想问题在于多因素身份验证方法需要密码和密钥。执行上述代码只会在客户端对您进行身份验证(为您提供两个单独的“particial success”错误),而不会在远程SFTP服务器上进行身份验证。我甚至不确定验证客户端意味着什么lol。查看源代码两次登录(),一次是密码,一次是密钥,将导致向服务器发送两个NET_SSH2_MSG_USERAUTH_请求。你试过了吗?我认为它会起作用。我所说的仅在客户端进行身份验证的意思是,如果
login()
方法每次调用时都与服务器建立一个新连接,那么您将有两个单独的连接,都是“partial success”。在客户端,我们知道密码和密钥是好的,因为它们都经过了部分身份验证,但在服务器上则没有,因为它们是在单独的连接中发送的。如果它不创建新连接,并且您可以轻松地按现有密码发送密码,那么我可能完全错了,但由于我在问题中试图将密码留给OP,因此需要进行编码。为了回答您的另一个问题,不,我没有尝试,因为我没有配置这样的服务器来测试它。连接是创建的