现在我知道这个问题已被问过几次,但我已经按照每个人的建议而且我仍然难过。
我有一个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允许exec
和shell_exec
。
我觉得我错过了一些明显的东西。
答案 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");
}
之前立即尝试运行:
<->