无法从PHP执行Bash脚本

7

我想从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脚本无法写入test.txt文件。

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

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

1
如果你输入 echo $var1 $var2 $var3 > /tmp/test.txt,它能正常工作吗?看起来你不能在存放 test.txt 的目录中写入文件。 - fedorqui
是的,现在它可以工作了。谢谢! - Sergi
2个回答

2

我相信您需要更改txt文件的权限,以便apache(实际执行脚本的用户)能够写入它。

但是,当使用shell_exec()并更改权限时,请小心传递不必要的变量...


1
要小心 $var='hello; rm -rf .' 或类似的东西 @Sergi - orestiss

1
当你说的时候
echo $var1 $var2 $var3 > ./test.txt

您正在将变量var1、var2和var3的输出echo到与运行脚本相同目录下的test.txt文件中。
因此,如果您在/var/www目录中执行"echo $var1 $var2 $var3 > ./test.txt",这与说"echo $var1 $var2 $var3 > /var/www/test.txt"是相同的。
您面临的问题是出现了以下错误:
./test_bash.sh: line 13: ./test.txt: Permission denied
这告诉您无法写入文件/var/www/test.txt。要能够这样做,请更改该文件的写入权限,以便“其他人”(即用户www或apache)可以写入它。
chmod o+w /var/www/test.txt

或者更好的方法是将其写入另一个目录。例如/tmp
最后,注意建议引用您的变量。因此最好这样说:
echo "$var1 $var2 $var3" > test.txt
#    ^                 ^

1
感谢回复,@fedorqui!这也很有帮助! - Sergi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接