当从命令行调用时,通过 exec 的 PHP SSH 连接可以工作,但不能通过 apache 调用

Duk*_*ing 1 php ssh exec

我的情况类似于PHP shell_exec 使用 ssh 运行 shellscript,但不一样。

情况:我在两台服务器之间交换了 ssh 密钥,切换到www-data用户并通过 SSH 连接到第二台服务器,无需密码。

测试 1:ssh user@10.8.0.6 Documents/run.sh list 在 shell 中执行时工作正常

测试 2:将简单的 PHP Exec 放入 PHP 文件中效果很好。它返回一个数组并且Retval为0

测试 3:将 exec 放入“大”PHP 脚本中并调用它会导致 Retval 255(致命错误?!?!?)

所以目前我真的不明白为什么它不起作用。我试图找出有关 retval 255 的更多详细信息,但没有走得太远。

PHP5 与 PHP5 cli 之间的差异一定存在于某个地方。但在我不得不使用 OpenVPN 之前,它通过正常的 Apache 调用也可以正常工作。

LSe*_*rni 5

通用的

问题诊断的第一级shell_exec是尝试通过生成添加 2>&1 的相同命令来获取更多信息错误,例如在您的情况下

$retval = shell_exec("/path/to/ssh ... 2>&1");
Run Code Online (Sandbox Code Playgroud)

并检查$retval.

更新

“主机密钥验证失败”意味着~/.ssh/known_hosts运行 Apache 的用户包含不同的密钥。签入文件中的主机名和 IP 密钥;在紧要关头,删除两者,以用户身份登录www-data并通过手动连接恢复密钥。

如果使用主机名连接,也有可能由于 DHCP 或不同的 VPN 隧道启动而导致 IP 发生变化,而这不是您要查找的主机。

对于 SSH,可以使用-vvv非常冗长的选项来执行它,然后解析数千字节的输出,搜索文件的源known_hosts。它对于诊断命令也很有用,shell_exec例如

$ret = shell_exec('set');
Run Code Online (Sandbox Code Playgroud)

查看HOME变量的值。