我遇到了在PHP中使用shell_exec运行脚本的问题。 当我登录服务器并运行脚本时,我得到了正确的输出,但是当它通过网页运行时,似乎没有完成命令。
该脚本使用openssl从.crt和.key文件创建.pem,.pfx和.p12文件。
Bash脚本如下:
#!/bin/bash
#Script to create all the SSL certs needed from the .key and .crt files
set -o errexit
echo "Starting script....<br><br>"
echo "openssl pkcs12 -export -in $1.crt -inkey $1.key -out $1.p12 -passout pass:$2"
openssl pkcs12 -export -in $1.crt -inkey $1.key -out $1.p12 -passout pass:$2
echo "P12 Complete.<br><br>"
openssl pkcs12 -in $1.p12 -nodes -out $1.pem -passin pass:$2 -passout pass:$2
echo "PEM Complete.<br><br>"
openssl pkcs12 -inkey $1.pem -in $1.crt -export -out $1.pfx -passout pass:$2
echo "PFX complete.<br><br>"
mkdir $1_certs
mv $1.key $1_certs/$1.key
mv $1.crt $1_certs/$1.crt
mv $1.pem $1_certs/$1.pem
mv $1.p12 $1_certs/$1.p12
mv $1.pfx $1_certs/$1.pfx
echo "Password: " $2 >> $1_certs/password.txt
echo "ZIPing files.<br><br>"
zip $1_certs.zip $1_certs
echo "COMPLETE<br><br>"
PHP如下:
<?php
if (isset($_GET['cert_name'])) {
$cert_name = $_GET['cert_name'];
$password = $_GET['password'];
echo "/home/<username>/ssl $cert_name $password <br><br>";
$message=shell_exec("/home/<username>/ssl $cert_name $password");
echo $message;
}
?>
两者中丰富的回声都有助于排除故障。
网页是一个包含2个输入和提交按钮的基本表格。
当我在网页中运行它时,它会转到openssl命令来创建.p12并失败。
如果我删除set -o errexit
以便它完全运行而不管错误我可以看到它甚至没有尝试创建目录或移动文件,我只看到所有的回声。就像它只是运行回声并忽略命令一样。
我在创建p12文件的命令之前有一个echo,它显示它正在获取所有正确的详细信息。
我不知道从哪里开始。任何帮助,将不胜感激。
答案 0 :(得分:0)
返回值
执行命令的输出或
NULL
如果发生错误或命令没有产生输出。注意:
当发生错误或程序没有输出时,此函数可以返回
NULL
。使用此功能无法检测执行失败。当需要访问程序退出代码时,应使用exec()。
在调试中,echo
和print
/ print_r
变体不是很有用,因为它们会将强制转换null
输入到字符串中。相反,您可以使用var_dump,即使它是null
,也可以保证每个输入的输出。
至于为什么失败,有一种方法可以通过将STDERR
重定向到STDERR
来取回STDOUT
中的任何信息。
$message = shell_exec("/home/<username>/ssl $cert_name $password 2>&1");
同样重要的是要注意你应该通过escapeshellarg
如果我不得不猜测为什么它失败了我最好的猜测就是无论用户运行什么PHP(例如,如果你通过你的网络服务器这样做,并且使用带有mod_php的Apache httpd,它可能不会' t具有执行/home/<username>/ssl
所需的权限。您应该能够通过检查文件的权限并通过shell确认STDERR
信息来确定这一点。