使用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
添加到sudo命令。。。(即sudo-t…)-A
- 在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
查找完整脚本路径的实际外观?