使用PHP运行shell脚本

时间:2016-06-03 04:19:01

标签: php shell ssh

现在我知道这个问题已被问过几次,但我已经按照每个人的建议而且我仍然难过。

我有一个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

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

2 个答案:

答案 0 :(得分:3)

由于您的脚本已经可执行,因此您应该直接调用它。只需将一个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>";

答案 1 :(得分:0)

很可能,脚本没有正常执行,因为终端会话中存在的环境变量可能不是通过PHP运行时。因此,如果ssh中没有php$PATH,则调用shell_exec()putenv("PATH", "/bin:/usr/bin:/usr/local/bin:/sbin:/usr/sbin"); 将无效。

请在致电var re=new RegExp(); re = /^(([^<>()\[\]\.,;:\s@\"]+(\.[^<>()\[\]\.,;:\s@\"]+)*)|(\".+\"))@(([^<>()[\]\.,;:\s@\"]+\.)+[^<>()[\]\.,;:\s@\"]{2,})$/i; if(re.test(Email_Value)){ alert("valid email"); } 之前立即尝试运行:

<->