2012-06-15 205 views
41

我有一个bash脚本,我通过命令行运行是这样的:运行bash命令从PHP

./script.sh var1 var2 

我试图执行上面的命令,我叫了一定PHP文件之后。

我有现在的问题是:

$output = shell_exec("./script.sh var1 var2"); 
echo "<pre>$output</pre>"; 

但doesn't工作。我也尝试过使用execsystem,但脚本从未执行过。

但是,当我尝试运行shell_exec("ls");它确实有效,并且$output是所有文件的列表。

我不确定这是因为我使用的VPS的限制还是问题在其他地方?

+1

你在什么路径上运行它?pwd返回什么? – alex

+1

你的脚本是由'apache'还是'www-data'用户执行? – core1024

+2

这个bash脚本和你的PHP脚本在同一个目录下吗? php脚本的工作目录是否在同一目录下? –

回答

58

在调用脚本之前,您可能需要将chdir更改为正确的目录。这样,您可以确保脚本的目录“在”之前调用shell命令。

$old_path = getcwd(); 
chdir('/my/path/'); 
$output = shell_exec('./script.sh var1 var2'); 
chdir($old_path); 
+0

我认为这个伎俩!至少我用一个简单的测试脚本来处理它。为了最终验证它,我必须等待服务器主机让我知道脚本的确切路径。尽管如此,我现在要标记答案。谢谢! – Andrej

+0

@Andrej:或者使用脚本的绝对路径而不是相对路径。 –

+0

@Andrej如果您运行的是PHP 5.3,您可以使用'chdir(__ DIR __)'将目录更改为包含该脚本的目录。或者对于PHP 5.2或更低版本,'dirname(__ FILE __)'将会起作用。 –

5

您的shell_exec由www-data用户从其目录执行。 您可以尝试

putenv("PATH=/home/user/bin/:" .$_ENV["PATH"].""); 

如果你的脚本位于/家庭/用户/箱 以后你可以

$output = "<pre>".shell_exec("scriptname v1 v2")."</pre>"; 
echo $output; 

要显示命令的输出。 (或者,如果没有导出路径,请尝试给脚本的整个路径,而不是仅仅./script.sh

+0

这是没有必要改变'PATH'环境变量。当前的工作目录应该改变(参见[我的答案](http://stackoverflow.com/a/11052453/24950))。 –

+1

是的。谢谢。我在我的代码中使用了路径设置,因为我在多个位置有不同的自定义可执行文件,我希望输入框作为控制台工作,所以我可以从这些文件中调用任何命令。如果仅用于单个文件执行,我们可以使用shell_exec('/ entire/path/to/file /'); – Hrishikesh

0

检查没有设置在php.ini或域的.htaccess一个open_basedir的你用什么。这将监狱您在您的域名和PHP的目录将只得到在这个目录下执行access。