从PHP执行Bash脚本

时间:2015-07-16 05:00:40

标签: php linux bash

我从PHP调用bash脚本,但是我遇到了一个奇怪的问题,即只能传递给bash的特定参数值才能成功执行:

我的PHP代码很简单:

$result = shell_exec("/scripts/createUser.sh $uname");

Bash脚本代码:

#!/bin/bash

export PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

usrname=$1
echo -e "Username: $1"

deploy="/wordpress.tar.gz"
dest="/data/$usrname"

mkdir -p $dest

cd $dest

tar zxvf $deploy -C $dest >/dev/null 2>&1

ls $dest

但是这个脚本只能成功mkdir,提取wordpress.tar.gz并列出文件夹当$ uname ==' test' 时,否则什么都不会发生(甚至不能mkdir )。

我将脚本chown给www用户并授予执行权限,没有帮助。并且已经尝试通过控制台以root身份运行这些命令,它们运行良好:

/scripts/createUser.sh admin
php deploy.php // in this script $uname == 'admin'

怎么会发生这种情况?谢谢你的想法!

1 个答案:

答案 0 :(得分:0)

我最近发布了一个项目,允许PHP获取真正的Bash shell并与之交互(如果需要,可以作为root),它解决了exec()和shell_exec()的限制。在此处获取:https://github.com/merlinthemagic/MTS

下载后,您只需使用以下代码:

$shell    = \MTS\Factories::getDevices()->getLocalHost()->getShell('bash', false);
$return1  = $shell->exeCmd("/scripts/createUser.sh " . $uname);
//the return will be a string containing the return of the command
echo $return1;

但是因为你只是触发一堆bash命令,所以只需使用这个项目逐个发出它们。这样你就可以处理异常并确切地看到哪个命令返回了意外的东西,即权限问题。

对于长时间运行的命令,您必须更改超时:

//is one hour enough?
$timeout = 3600000;
$return1  = $shell->exeCmd("/scripts/createUser.sh " . $uname, null, $timeout);