【问题标题】:return empty string using sshpass authentication使用 sshpass 身份验证返回空字符串
【发布时间】:2016-11-30 09:32:57
【问题描述】:

我是 Linux-SA 服务器自动化工具环境的新手。我正在尝试对sshpass 进行身份验证,如下所示:

在 linux 环境中,我在终端中使用以下代码并正确获取文件列表:

sshpass -p Password ssh -o StrictHostKeyChecking=no root@localhost "ls /root" 

但是如果我尝试从 PHP 中获取结果,它会返回一个空字符串:

shell_exec('sshpass -p Password ssh -o StrictHostKeyChecking=no root@localhost "ls /root"');

【问题讨论】:

  • 如果你不明白,你可能想试试phpseclib.sourceforge.net。 sshpass 将密码验证作为键盘交互进行,而不向用户提供实际提示。 phpseclib 也这样做。检查示例以获取详细信息。祝你好运!

标签: php linux ssh shell-exec


【解决方案1】:

如果您是第一次通过 ssh 连接到此服务器,则需要手动执行一次。因此 RSA 密钥被添加到已知主机。遇到同样的问题。这很有帮助。

【讨论】:

    【解决方案2】:

    使用exec()。请记住,如果ssh 失败并且您可能会在 php 中看到它的错误消息,ssh 会将其打印到 stderr,php 只会获取 stdout,并且它是空的。只需在命令末尾添加2>&1 即可将stderr 重定向到stdout。正如manpage of sshpass 所述,使用 -p 选项时应了解安全注意事项

    $ssh_host = "localhost";
    $ssh_port = "22";
    $ssh_user = "root";
    $ssh_pass = "Password";
    $command = "ls /root";
    $connection = "/usr/bin/sshpass -p $ssh_pass /usr/bin/ssh -p $ssh_port -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null $ssh_user@$ssh_host";
    $output = exec($connection." ".$command." 2>&1");
    echo "Output: $output";
    

    【讨论】:

      【解决方案3】:

      您是在网页中调用 PHP 吗?

      路径中有 sshpass 吗?如何使用完整路径?

      例如

      shell_exec('/usr/local/bin/sshpass -p Password ssh -o StrictHostKeyChecking=no root@localhost "ls /root"');
      

      *你需要弄清楚你的 sshpass 在哪里

      另外,您可能想要调查 ssh 密钥,而不是在您的代码中输入这样的密码 - 这可能是一个安全问题..(实际上我不知道您在做什么,您正在 ssh 到 localhost,但也许你只是在测试?)

      【讨论】:

      • 感谢 Jon Soong,是的,我们正在测试,但我们需要检查输入的密码是否正确,还有一件事我需要从我们的应用程序访问位于根文件系统中的几个文件。注意:我们的应用程序在根目录下有单独的文件系统。
      【解决方案4】:

      请将上述命令的输出放入某个变量中并显示该变量。 例如:

      $output = shell_exec('sshpass -p Password ssh -o StrictHostKeyChecking=no root@localhost "ls /root"');

      回声$输出

      这肯定会告诉你结果。

      【讨论】:

        【解决方案5】:

        这是 sshpass 和 apache 用户(在我的例子中是 www-data)之间的权限问题。

        在 sudoers (/etc/sudoers) 中包含这一行

        www-data ALL=(ALL) NOPASSWD: /usr/bin/sshpass -> 更改为您的系统和 Apache 用户的 sshpass 位置。

        并在 sshpass 前加上“sudo”

        shell_exec('sudo /usr/local/bin/sshpass -p Password ssh -o StrictHostKeyChecking=no root@localhost "ls /root"');
        

        【讨论】:

          猜你喜欢
          • 2015-12-26
          • 1970-01-01
          • 2020-03-07
          • 2018-09-07
          • 1970-01-01
          • 2021-01-01
          • 2012-12-25
          • 1970-01-01
          相关资源
          最近更新 更多