使用Shell脚本不起作用,通过PHP运行MKDIR



我创建了一个看起来像这样的文件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命令...(IE sudo -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
  • 进行测试

我希望这会有所帮助

最新更新