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

I'm having as issue with running a script using shell_exec in PHP. When I log onto the server and run the script I get the correct output but when running it through the webpage it doesn't seem to be completing the commands.

The script is to use openssl to create .pem, .pfx and .p12 files from .crt and .key files.

Bash Script is below:

#!/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 is below:

<?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;
}
?>

The abundance of echo's in both was to aid in troubleshooting.

The webpage is a basic table with 2 inputs and a submit button.

When I Run this in the webpage it gets to the openssl command to create the .p12 and fails.

If I remove the set -o errexit so that it runs completely through regardless of errors I can see that it doesnt even try to create the directory or move the files, I just see all the echo's. Its as if it just runs the echos and ignores the commands.

I have an echo in before the command to create the p12 file and it shows that it is getting all the correct details.

I'm at a loss of where to go from here. Any help would be appreciated.

From the manual on shell_exec

Return Values

The output from the executed command or NULL if an error occurred or the command produces no output.

Note:

This function can return NULL both when an error occurs or the program produces no output. It is not possible to detect execution failures using this function. exec() should be used when access to the program exit code is required.

In debugging, echo, and print/print_r variations aren't very helpful, because they type cast null to a string. Instead you could use var_dump, which guarantees output for every input even if it is null.


As far as why it's failing there is a way to get back any information from STDERR by redirecting STDERR to STDOUT.

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

It's also important to note that you should escape any arguments passed to the shell via escapeshellarg

If I had to guess at why it's failing my best guess would be that whatever user PHP is running under (if you're doing this via your web server, for example, and using Apache httpd with mod_php, it probably doesn't have the necessary permissions to execute /home/<username>/ssl. You should be able to determine that for sure by checking permissions on the file and confirming with STDERR information back from the shell.