【问题标题】:running mkdir through php using shell script not working使用 shell 脚本通过 php 运行 mkdir 不起作用
【发布时间】: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 be chroot 的网络服务器根目录,所以 / 并不是真正的 /。这可能是 updatedblocate 的时间
  • 我希望它成为根文件夹。我试过sudo find / -name "testDir" 但没有运气
  • mkdir 报告成功了吗?如果这是在 shell 脚本中,您应该能够在之后执行 echo $? 以查看其返回值,或者将其放入 if 语句中以从中获取有意义的信息。
  • 嗯,我突然想到,尽管您授予 sudo 执行脚本的权限,但这并不意味着用户将拥有对 / 的写入权限,因此您可能还想检查一下.
  • 它在控制台工作吗? su www-data -s /bin/bashphp -f phpfile.php

标签: php bash shell ubuntu-14.04 tty


【解决方案1】:

如果

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

【讨论】:

  • 不幸的是,从shell_exec() 中删除sh 或将/bin/sh 添加到visudo 都不起作用!!!
  • 您能否尝试将while true; do true; done; 插入到您的shell 脚本中,然后以www-data 运行PHP 脚本并使用ps aux | grep www-data 来查找您的完整脚本路径实际上是什么样的?
【解决方案2】:

这对我有用:将此添加到我的 ubuntu > sudoers 文件 www-data ALL=/etc/path-to-my/script.sh

希望这也能解决你的问题

【讨论】:

    【解决方案3】:

    我会尝试一些技巧:

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

    希望对你有帮助

    【讨论】:

      猜你喜欢
      • 2021-03-07
      • 2019-02-08
      • 2011-07-27
      • 1970-01-01
      • 2018-01-31
      • 1970-01-01
      • 2021-04-24
      • 2016-10-03
      • 1970-01-01
      相关资源
      最近更新 更多