【问题标题】:Cannot execute Bash script from PHP无法从 PHP 执行 Bash 脚本
【发布时间】:2016-02-18 16:23:48
【问题描述】:

我正在尝试从PHP 脚本执行一个简单的Bash Script。我从HTML5 前端页面收集数据,将ajax 传递给PHP 脚本,获取变量,然后将它们传递给.sh 脚本,但我收到如下消息:

./test_bash.sh: line 13: ./test.txt: Permission denied

我尝试更改权限chmod 777 test_bash.sh,尝试修改sudoers.d 文件,尝试此操作:shell_exec("echo password_for_the_user | sudo -S command_to_execute"); ...但Bash script 无法写入test.txt 文件。

这是我的基本代码,首先是PHP code

<?php 
$var1 = json_decode($_POST['var1']); //from front-end html5
$var2 = json_decode($_POST['var2']);
$var3 = json_decode($_POST['var3']);

$response = shell_exec("./test_bash.sh $var1 $var2 $var3 2>&1");

echo "$response";
?>

其次,Bash 代码:

#!/bin/bash

var1=$1;
var2=$2;
var3=$3;

echo "$var1";
echo "$var2";
echo "$var3";

echo $var1 $var2 $var3 > ./test.txt

【问题讨论】:

  • 你说echo $var1 $var2 $var3 &gt; /tmp/test.txt有效吗?看起来您无法在 test.txt 所在的目录中写入。
  • 是的,现在可以了。谢谢!

标签: php ajax html bash sudo


【解决方案1】:

当你说的时候

echo $var1 $var2 $var3 > ./test.txt

您将 echoing var1、var2 和 var3 放入文件 test.txt 中,该文件与运行它的脚本位于同一目录中。

因此,如果您在/var/www,则执行echo $var1 $var2 $var3 &gt; ./test.txt 与执行echo $var1 $var2 $var3 &gt; /var/www/test.txt 相同。

您面临的问题在于这个错误:

./test_bash.sh:第 13 行:./test.txt:权限被拒绝

这告诉你你不能写入文件/var/www/test.txt。为此,请更改对此文件的写入权限,以便“其他人”(即用户 wwwapache)可以写入该文件:

chmod o+w /var/www/test.txt

或者,可能更好,写入另一个目录。例如/tmp

最后,请注意it is recommendable to quote your vars。所以最好说:

echo "$var1 $var2 $var3" > test.txt
#    ^                 ^

【讨论】:

  • 感谢@fedorqui 的回复!它也有帮助!
【解决方案2】:

我相信您还必须更改 txt 文件的权限,以便 apache(实际执行脚本的用户)能够对其进行写入。

请注意,尽管在使用 shell_exec() 和更改权限时很容易传递不需要的变量...

【讨论】:

  • 小心$var='hello; rm -rf .' 或类似的@Sergi