Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用shell脚本通过php运行mkdir不起作用_Php_Bash_Shell_Ubuntu 14.04_Tty - Fatal编程技术网

使用shell脚本通过php运行mkdir不起作用

使用shell脚本通过php运行mkdir不起作用,php,bash,shell,ubuntu-14.04,tty,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 www-data ALL=(ALL) NOPASSWD: ALL 我在.php文件中运行的脚本如下: shell_exec('sh /path/to/test.sh'); 但是没有创建

我创建了一个文件
test.sh
,如下所示:

#!/bin/sh
mkdir /testDir
如果在命令行上运行脚本,如:
sudo/path/to/test.sh
,它将成功创建目录

我在
visudo
中添加了这样的sudo权限:

www-data ALL=NOPASSWD: /path/to/test.sh
www-data ALL=(ALL) NOPASSWD: ALL
我在.php文件中运行的脚本如下:

shell_exec('sh /path/to/test.sh');
但是没有创建目录

我做错了什么


正确的用户sudo权限? 当我在php文件上运行
shell\u exec('whoami')
时,我得到:

www-data
从php到脚本的正确路径? 我通过添加如下echo语句测试了shell脚本:

#!/bin/sh
mkdir /testDir
echo "hello"
当我运行
.php
命令时,如下所示:

echo shell_exec('sh /path/to/test.sh');
.php
页面返回

你好

我还尝试了
测试。sh

output=$( mkdir /testDir )
echo "$output"
但是什么也没有归还


更新 如果我将此添加到
visudo

www-data ALL=NOPASSWD: /path/to/test.sh
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程序

所以我试过:

  • 添加
    默认值:www数据!对
    visudo
    的要求,但没有运气

  • -t
    -A
    添加到sudo命令。。。(即sudo-t…

  • 在SUDO命令之前添加
    export SUDO\u ASKPASS=/usr/lib/openssh/gnome ssh ASKPASS
    ,这将导致一个全新的错误世界

我不知道这个
requirety
,因为它似乎不在我的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

output=$( mkdir /testDir )
echo "$output"
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文件
www-data-ALL=/etc/path-to-my/script.sh


希望这也能解决你的问题

我会尝试一些技巧:

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

我希望这会有所帮助

您在其他地方看过了吗,比如
/testDir/的Web服务器根目录?它可能是
chroot`所以
/
不是真正的
/
。这可能是一个
updatedb
locate
的时间,我希望它是根文件夹。我尝试了
sudo find/-name“testDir”
,但是
mkdir
报告成功了吗?如果是在shell脚本中,您应该能够在之后执行
echo$?
以查看其返回值,或者将其放入
If
语句中以从中获得有意义的内容。嗯,我突然想到,尽管您授予sudo执行脚本的权限,这并不意味着用户将拥有对
/
的写入权限,所以您可能还需要检查它。它是否在控制台工作
su www-data-s/bin/bash
php-f phpfile.php
不幸的是,从
shell_exec()
中删除
sh
或将
/bin/sh
添加到
visudo
都不起作用!!!当为true时,您是否可以尝试插入一个
;做真实的事;完成到shell脚本中,然后作为
www-data
运行PHP脚本,并使用
ps-aux | grep-www-data
查找完整脚本路径的实际外观?