在服务器上运行时,通过shell_exec运行脚本不提供相同的输出

时间:2015-07-29 03:05:35

标签: php bash shell-exec

我遇到了在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,它显示它正在获取所有正确的详细信息。

我不知道从哪里开始。任何帮助,将不胜感激。

1 个答案:

答案 0 :(得分:0)

来自shell_exec

上的手册
  

返回值

     

执行命令的输出或NULL如果发生错误或命令没有产生输出。

     
    

注意:

         

当发生错误或程序没有输出时,此函数可以返回NULL。使用此功能无法检测执行失败。当需要访问程序退出代码时,应使用exec()。

  

在调试中,echoprint / print_r变体不是很有用,因为它们会将强制转换null输入到字符串中。相反,您可以使用var_dump,即使它是null,也可以保证每个输入的输出。

至于为什么失败,有一种方法可以通过将STDERR重定向到STDERR来取回STDOUT中的任何信息。

$message = shell_exec("/home/<username>/ssl $cert_name $password 2>&1");

同样重要的是要注意你应该通过escapeshellarg

转义传递给shell的任何参数

如果我不得不猜测为什么它失败了我最好的猜测就是无论用户运行什么PHP(例如,如果你通过你的网络服务器这样做,并且使用带有mod_php的Apache httpd,它可能不会' t具有执行/home/<username>/ssl所需的权限。您应该能够通过检查文件的权限并通过shell确认STDERR信息来确定这一点。