Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Generate android apk using shell script from php?

I'm trying to generate Android apk files from shell script, I want to execute a shell script file from PHP. When I run the shell script in the terminal, it works perfectly. If I try to run the script using PHP, the shell script doesn't execute all the commands. The ls command in shell script works perfectly, but when executing using PHP, other commands doesn't work. I'm using xampp server in a Linux environment.

My shell script

cd /home/user/AndroidStudioProjects/msvep4247-inghamautogroup-pulse-and/
./gradlew assembleDebug
cp -fr app/build/outputs/apk/app-debug.apk /opt/lampp/htdocs/sample/apk
ls

Shell script ls output

app autolead_data_format.pdf build build.gradle cheek gradle gradle.properties gradlew gradlew.bat lib local.properties msvep4247-inghamautogroup-pulse-and.iml settings.gradle

My PHP script

   <?php
      echo shell_exec('ls');
      echo shell_exec('./generateApk.sh');
   ?>

PHP script ls output

generateApk.sh generate.php APK

Note: ls outputs file names in the folder

I set all the file permissions for shell script in the xampp server. Can anyone describe where I'm mistaken? Awaiting responses...

like image 217
Keerthivasan Avatar asked Apr 26 '17 11:04

Keerthivasan


2 Answers

Just use the full path to the script/executable, because the environment is different when running from php.

like image 61
TMS Avatar answered Oct 17 '22 11:10

TMS


It seems that PATH environment variable in PHP code that is executed in the web server is more limited than the one in the shell you're working in. But you can change environment variables in PHP, and the commands you start from it will see those changes.

<?php
// set content type so the output is more readable in the browser
header('Content-Type: text/plain');
// set $PATH to some limited value
putenv('PATH=/bin:/sbin');
// verify, note that we have to use full path to 'env'
print(shell_exec("/usr/bin/env|grep '^PATH='"));
// this command won't run (assuming its full path is /usr/bin/id)
print(shell_exec("id"));
// add more directories to $PATH
putenv('PATH=/bin:/sbin:/usr/bin:/usr/sbin');
// verify again, we can use env without specifying the path this time
print(shell_exec("env|grep '^PATH='"));
// this command will
print(shell_exec("id"));

So you have to write putenv('PATH=<your_shell_PATH_contents>'); at the top of your PHP script. Using full path to the shell script alone won't help if the script itself uses relative paths to binaries it starts.

like image 45
Macaronio Avatar answered Oct 17 '22 11:10

Macaronio