我创建了一个文件test.sh
,如下所示:
#!/bin/sh
mkdir /testDir
如果我在命令行上运行脚本,例如:sudo /path/to/test.sh
,它就会成功创建目录。
我在visudo
:
www-data ALL=NOPASSWD: /path/to/test.sh
我在我的.php文件中运行这样的脚本:
shell_exec('sh /path/to/test.sh');
但是没有创建目录!
我做错了什么?!
当我在php文件上运行shell_exec('whoami')
时,我得到:
www-data
我通过添加一个echo语句测试了shell脚本,如:
#!/bin/sh
mkdir /testDir
echo "hello"
当我运行.php
命令时:
echo shell_exec('sh /path/to/test.sh');
.php
页面返回
你好
我也试过test.sh
:
output=$( mkdir /testDir )
echo "$output"
但没有返回任何内容
如果我将其添加到visudo
:
www-data ALL=(ALL) NOPASSWD: ALL
它有效!! 但是当我这样做时:
www-data ALL=(ALL) NOPASSWD: /path/to/test.sh
它没有...正如你所知道的那样。
通过将PHP更改为
,我找到了一种很好的调试方法echo shell_exec('sh /path/to/test.sh 2>&1 1> /dev/null');
并返回错误:
sudo:没有tty存在且没有指定askpass程序
所以我尝试过:
将Defaults:www-data !requiretty
添加到visudo
但没有运气!!!!
将-t
和-A
添加到sudo命令...(即sudo -t ...
)
在sudo命令之前添加export SUDO_ASKPASS=/usr/lib/openssh/gnome-ssh-askpass
,然后只会导致一个全新的错误世界。
我不知道这个requiretty
,因为它似乎不在我的ubuntu系统上。在visudo
?
有人可以告诉我,如果我这样做会遇到什么问题:
www-data ALL=(ALL) NOPASSWD: ALL
答案 0 :(得分:0)
如果
www-data ALL=(ALL) NOPASSWD: ALL
有效,但
www-data ALL=(ALL) NOPASSWD: /path/to/test.sh
没有,那么显然执行的命令与/path/to/test.sh
不匹配
看看你的代码,你实际上不调用/path/to/test.sh
:
sh /path/to/test.sh
您正在调用sh
!以/path/to/test.sh
作为第一个参数,但仍然
您需要直接调用脚本(如果可行):
shell_exec('/path/to/test.sh');
或相应地更新您的sudoers文件(请注意sh
的完整路径):
www-data ALL=(ALL) NOPASSWD: /bin/sh /path/to/test.sh
答案 1 :(得分:0)
这对我有用:将此添加到我的ubuntu> sudoers文件www-data ALL=/etc/path-to-my/script.sh
希望这也能解决你的问题
答案 2 :(得分:0)
我会尝试一些技巧:
我希望这对您有帮助