【发布时间】:2015-07-15 22:06:39
【问题描述】:
我创建了一个文件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但没有运气!!!! -
在 sudo 命令中添加
-t和-A...(即sudo -t ...) -
在 sudo 命令之前添加
export SUDO_ASKPASS=/usr/lib/openssh/gnome-ssh-askpass,然后只会导致一个全新的错误世界。
我不知道这个requiretty,因为它似乎不在我的 ubuntu 系统上的任何地方。 visudo中没有提到一次?
我在这方面花了太长时间!
谁能告诉我如果我这样做会遇到什么问题:
www-data ALL=(ALL) NOPASSWD: ALL
?
【问题讨论】:
-
您是否查看过其他地方,例如
/testDir/? It may bechroot 的网络服务器根目录,所以/并不是真正的/。这可能是updatedb和locate的时间 -
我希望它成为根文件夹。我试过
sudo find / -name "testDir"但没有运气 -
mkdir报告成功了吗?如果这是在 shell 脚本中,您应该能够在之后执行echo $?以查看其返回值,或者将其放入if语句中以从中获取有意义的信息。 -
嗯,我突然想到,尽管您授予 sudo 执行脚本的权限,但这并不意味着用户将拥有对
/的写入权限,因此您可能还想检查一下. -
它在控制台工作吗?
su www-data -s /bin/bash和php -f phpfile.php
标签: php bash shell ubuntu-14.04 tty