【问题标题】:PHP SSH Connection via exec works when called from commandline but not via apache通过 exec 的 PHP SSH 连接在从命令行调用但不通过 apache 时有效
【发布时间】:2012-10-12 00:38:16
【问题描述】:

我的情况与PHP shell_exec running a shellscript with ssh类似,但不一样。

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

测试一: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 调用正常工作。

【问题讨论】:

  • 首先尝试通过使用2>&1 生成 SSH 来获取更多信息错误,例如$retval = shell_exec("/path/to/ssh ... 2>&1");,以便您可以检查$retval。这可能会告诉你一些简单的解决方法。否则我会尝试一个“诊断”的答案。
  • 感谢提示,非常好:返回主机密钥验证失败。所以虽然它在命令行上与 www-data 一起工作,但主机验证在这里不起作用很奇怪......
  • Gern geschehen :-)。那是什么?
  • 我重新检查了我将 www-data 的主目录更改为我创建 ssh 密钥 www-data:x:33:33:www-data:/home/www-data 的主文件夹:/bin/sh
  • 我发现了一个类似的问题,所以如果它可以帮助其他人......我可以在命令行上 ssh,但不能从脚本运行。问题是当我登录到我正在执行 ssh 的机器 时,我打开了代理转发(在 Putty 中),所以我的证书有问题(这是我没有得到的)权限)没有出现,因为它使用了我的转发密钥。我必须关闭代理转发才能看到脚本可能也收到但未在输出中捕获的错误消息。

标签: php ssh exec


【解决方案1】:

通用

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

$retval = shell_exec("/path/to/ssh ... 2>&1");

并检查$retval。

更新

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

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

在 SSH 的情况下,可以使用 -vvv 非常详细的选项来执行它,然后通过千字节的输出来解析 known_hosts 文件的来源。 shell_exec 诊断命令也很有用,例如

$ret = shell_exec('set');

查看HOME变量的值。

【讨论】:

  • 好的好的开始,我的系统上一定有权限错误我为 www 用户创建了 /home/www-data 并将其更改为 www-data:www-data 但是当我更改为 www -data "su www-data" 并在主目录 "ls: cannot open directory .: Permission denied" 上尝试和 ls -all,尽管权限在 0755
  • APACHE_LOCK_DIR='/var/lock/apache2' APACHE_LOG_DIR='/var/log/apache2' APACHE_PID_FILE='/var/run/apache2.pid' APACHE_RUN_DIR='/var/run/apache2' APACHE_RUN_GROUP='www-data' APACHE_RUN_USER='www-data' IFS=' ' LANG='C' OPTIND='1' PATH='/usr/local/bin:/usr/bin:/bin'
  • read_passphrase: 无法打开 /dev/tty: 没有这样的设备或地址
  • 很好的答案——帮助我解决了我自己的 shell_exec() 和 SSH 问题。谢谢!
  • 2>&1 很有帮助。
猜你喜欢
  • 2011-12-29
  • 1970-01-01
  • 2014-07-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多