使用 SSHpass 身份验证返回空字符串


return empty string using sshpass authentication

我是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"');

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

使用 exec()。请记住,如果ssh失败并且您可能期望它在php中的错误消息,ssh将其打印到stderr,php仅获取stdout并且这是空的。只需通过在命令末尾添加 2>&1 将 stderr 重定向到 stdout。正如 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";

你在网页中调用PHP吗?

sshpass 在路径中吗? 使用完整路径怎么样?

例如

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

*您需要确定您的 SSH 通行证在哪里

此外,您可能希望调查SSH密钥,而不是将这样的密码放在代码中 - 这可能是一个安全问题。(实际上我不知道你在做什么,你正在向本地主机发送sing,但也许你只是在测试?

请在某个变量中获取上述命令的输出并显示该变量。例如:

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

回声$output

这肯定会向您显示结果。

这是 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"');