我创建了一个看起来像这样的文件test.sh
:
#!/bin/sh
mkdir /testDir
如果我在命令行上运行脚本,例如:sudo /path/to/test.sh
它成功创建了目录。
我在visudo
中添加了这样的Sudo权限:
www-data ALL=NOPASSWD: /path/to/test.sh
我在.php文件中运行这样的脚本:
shell_exec('sh /path/to/test.sh');
但没有创建目录!
我在做什么错?!
正确的用户sudo权限?
当我在PHP文件上运行shell_exec('whoami')
时,我会得到:
www-data
从PHP?
正确通往脚本的路径我通过添加一个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命令...(IEsudo -t ...
)在sudo命令之前添加
export SUDO_ASKPASS=/usr/lib/openssh/gnome-ssh-askpass
,然后才会导致一个全新的错误世界。我对此
requiretty
一无所知,因为它似乎没有我的Ubuntu系统上的任何地方。在visudo
中没有提及一次?我花了很长时间!
有人可以告诉我,如果我做的话,我会遇到什么问题:
www-data ALL=(ALL) NOPASSWD: ALL
?
如果
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
这对我有用:将其添加到我的ubuntu> sudoers file www-data ALL=/etc/path-to-my/script.sh
希望这也解决了您的
我会尝试的一些技巧:
- 尝试使用exec而不是shell_exec
- 如果启用了Selinux,请尝试禁用
- 尝试删除/bin/sh前缀,然后在脚本内使用shebang
- 成为www-data(su www-data -s/bin/bash),对CLI 进行测试
我希望这会有所帮助