使用PHP运行shell脚本

使用PHP运行shell脚本,php,shell,ssh,Php,Shell,Ssh,现在我知道这个问题已经被问过好几次了,但我已经听从了每个人的建议,我仍然感到困惑 我有一个shell脚本(/var/www/scripts/test.sh): 该脚本具有以下权限: -rwxrwxrwx 1 www-data www-data 1792 Jun 3 10:44 bash_script.sh* im在php中运行的代码是: try { $outbuf=shell_exec("sh /var/www/scripts/test.sh"); echo "<pr

现在我知道这个问题已经被问过好几次了,但我已经听从了每个人的建议,我仍然感到困惑

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

该脚本具有以下权限:

-rwxrwxrwx 1 www-data     www-data     1792 Jun  3 10:44 bash_script.sh*
im在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();
}
但是,
ssh
不会运行

我可以确认php.ini允许
exec
shell\u exec


我觉得我遗漏了一些明显的东西。

更有可能的是,脚本没有正确执行,因为终端会话中存在的环境变量在通过PHP运行时可能不正确。因此,调用
ssh
php
时,如果它们不在
$PATH
中,将无法工作

在调用
shell\u exec()
之前,尝试立即运行此命令:


更有可能的是,脚本没有正确执行,因为终端会话中存在的环境变量在通过PHP运行时可能不正确。因此,调用
ssh
php
时,如果它们不在
$PATH
中,将无法工作

在调用
shell\u exec()
之前,尝试立即运行此命令:


因为脚本已经是可执行的,所以应该直接调用它。只要在上面放一个shebang,你就去掉了一层复杂的东西

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

我敢打赌你会发现
ssh
正在抱怨密钥。你需要把那个密钥文件放到别的地方。用户目录中的SSH密钥通常具有600个权限

最后,
shell\u exec()
不会抛出任何可以捕获的内容。如果您想知道该过程是否成功,可以使用其他函数。在这种情况下,传递重要的退出状态可能是一个好主意

总而言之:

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


因为脚本已经是可执行的,所以应该直接调用它。只要在上面放一个shebang,你就去掉了一层复杂的东西

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

我敢打赌你会发现
ssh
正在抱怨密钥。你需要把那个密钥文件放到别的地方。用户目录中的SSH密钥通常具有600个权限

最后,
shell\u exec()
不会抛出任何可以捕获的内容。如果您想知道该过程是否成功,可以使用其他函数。在这种情况下,传递重要的退出状态可能是一个好主意

总而言之:

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


您是否尝试在终端中运行shell脚本?是。。它毫无疑问是有效的@Weigrentry
putenv(“路径”,“/bin:/usr/bin:/usr/local/bin:/sbin:/usr/sbin”)shell_exec()之前执行code>。这是完整的shell脚本吗?没有标题行?你的php运行在哪个用户。它对您的shell脚本有权限吗?您是否尝试在终端中运行shell脚本?是。。它毫无疑问是有效的@Weigrentry
putenv(“路径”,“/bin:/usr/bin:/usr/local/bin:/sbin:/usr/sbin”)shell_exec()之前执行code>。这是完整的shell脚本吗?没有标题行?你的php运行在哪个用户。它对您的shell脚本有权限吗?我忘了对
键的权限了,我想这可能是正确的答案。这是$key的权限问题。@Mike很高兴听到,您也应该看看其他建议的更改,它们将使您的系统更加健壮。我实现了您建议的所有更改。我还更改了脚本的权限,因此它们只能由www数据组执行。我忘记了
键的权限,我认为这可能是正确的答案。这是$key的权限问题。@Mike很高兴听到这个消息,您也应该看看其他建议的更改,它们将使您的系统更加健壮。我实现了您建议的所有更改。我还更改了脚本的权限,因此它们只能由www数据组执行。
putenv("PATH", "/bin:/usr/bin:/usr/local/bin:/sbin:/usr/sbin");
#!/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>";