使用shell脚本无法正常运行mkdir

时间:2015-05-06 00:21:11

标签: php bash shell ubuntu-14.04 tty

我创建了一个文件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命令...(即sudo -t ...

  • 在sudo命令之前添加export SUDO_ASKPASS=/usr/lib/openssh/gnome-ssh-askpass,然后只会导致一个全新的错误世界。

我不知道这个requiretty,因为它似乎不在我的ubuntu系统上。在visudo

中没有提到过一次

我花了太长时间!

有人可以告诉我,如果我这样做会遇到什么问题:

www-data ALL=(ALL) NOPASSWD: ALL

3 个答案:

答案 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)

我会尝试一些技巧:

  • 尝试使用exec而不是shell_exec
  • 尝试禁用selinux(如果已启用)
  • 尝试删除/ bin / sh前缀并改用脚本内的shebang
  • 成为www-data(su www-data -s / bin / bash)并在CLI上进行测试

我希望这对您有帮助