【问题标题】:Use PHP to run a shell script使用 PHP 运行 shell 脚本
【发布时间】:2016-10-03 00:24:33
【问题描述】:

现在我知道这个问题已经被问过好几次了,但我已经听从了大家的建议,但我仍然很困惑。

我有一个 shell 脚本 (/var/www/scripts/test.sh):

ssh_con="ssh-user@x.x.x.x"
key="/home/user/.ssh/key"

echo "export start"
ssh -i $key $ssh_con "php /file/location/ service:batch:job export --env=prod"
echo "export complete"

脚本具有以下权限:

-rwxrwxrwx 1 www-data     www-data     1792 Jun  3 10:44 bash_script.sh*

我在php中运行的代码是:

try { 
$outbuf=shell_exec("sh /var/www/scripts/test.sh");
echo "<pre>".$outbuf."</pre>";

}catch (Exception $e) { //while an error has occured
echo "==> Error: ".$e->getMessage();
exit();
}

当我从网络浏览器查看时,我得到:

export start
export complete

但是,ssh 没有运行。

我可以确认 php.ini 允许 execshell_exec

我觉得我错过了一些明显的东西。

【问题讨论】:

  • 您是否尝试在终端中运行您的 shell 脚本?
  • 是的..它可以正常工作。 @weigreen
  • 在打电话给shell_exec();之前试试putenv("PATH", "/bin:/usr/bin:/usr/local/bin:/sbin:/usr/sbin");
  • 是你完成的shell脚本吗?没有标题行?
  • 你的 php 在哪个用户上运行。它对你的 shell 脚本有权限吗?

标签: php shell ssh


【解决方案1】:

由于您的脚本已经是可执行的,您应该直接调用它。只需在上面放一个shebang,您就消除了一层复杂性。

接下来,将标准错误从 ssh 重定向到标准输出,以便 PHP 可以向您显示任何错误消息。

我敢打赌,您会发现 ssh 正在抱怨密钥。您需要将该密钥文件放在其他地方。用户目录中的 SSH 密钥通常具有 600 个权限。

最后,shell_exec() 不会抛出任何你能抓到的东西。如果您想知道该过程是否成功,您可以使用不同的功能。在这种情况下,传递重要的退出状态可能是个好主意。

所以,总结一下:

#!/bin/sh
ssh_con="ssh-user@x.x.x.x"
key="/home/user/.ssh/key"

echo "export start"
ssh -i "$key" "$ssh_con" "php /file/location/ service:batch:job export --env=prod" 2>&1
ssh_result=$?
echo "export complete"
exit ssh_result

然后:

<?php
exec("/var/www/scripts/test.sh", $outbuf, $result);
$outbuf = htmlspecialchars(implode("\n", $outbuf));
echo "Exited with code $result.";
echo "<pre>$outbuf</pre>";

【讨论】:

  • 我忘了key的权限,我想这可能是正确的答案。
  • $key 的权限问题。
  • @Mike 很高兴听到,您也应该看看其他建议的更改,它们将使您的系统更加健壮。
  • 我实施了您建议的所有更改。我还更改了脚本的权限,因此它们只能由 www-data 组执行。
【解决方案2】:

很可能,脚本没有正确执行,因为终端会话中存在的环境变量在通过 PHP 运行时可能不存在。所以调用sshphp 而没有它们出现在$PATH 将不起作用。

尝试在致电 shell_exec() 之前立即运行:

putenv("PATH", "/bin:/usr/bin:/usr/local/bin:/sbin:/usr/sbin");

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-01-15
    • 2014-10-10
    • 2013-04-20
    • 1970-01-01
    • 2012-03-28
    • 1970-01-01
    相关资源
    最近更新 更多