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