希望有人可以帮助我。尝试使用exec()
运行任何命令都会返回126并显示相同的错误消息。我把它缩小到这个非常小的测试用例。
root@test:~ $ sudo -u asterisk php -r 'exec("ls /", $out, $result); var_dump($result);'
sh: /bin/ls: Permission denied
int(126)
root@test:~ $ sudo -u asterisk ls /
bin boot dev etc home lib lib64 lost+found media mnt opt proc root sbin selinux srv sys tmp usr var
root@test:~ $ su -lc 'php -r '\''exec("ls /", $out, $result); var_dump($result);'\' asterisk
This account is currently not available.
/
,/bin/
和/bin/ls
adduser -d /var/lib/asterisk -M -r -s /sbin/nologin asterisk
每次运行任何命令的尝试都会返回权限被拒绝,126返回$?
。 PHP配置几乎与它一样(Scientific Linux 6.7,PHP 5.4通过Remi包。)
会很感激一些帮助(最好是需要一些神秘知识的那种,而不是那种意味着我错过了一些令人眼花缭乱明显的东西!)
编辑:如果我向用户提供登录shell,我可以使用su
让它工作:
root@test:~ $ usermod -s /bin/bash asterisk
root@test:~ $ su -c 'php -r '\''exec("ls /", $out, $result); var_dump($result);'\' asterisk
int(0)
但是,这不是我的代码,因此不太可能将sudo
的所有用途更改为su
。此外,如果没有登录shell,不应该阻止PHP运行它。
答案 0 :(得分:1)
您可能已启用sudo
选项NOEXEC
。
当此选项处于活动状态时,您可以运行具有高权限的命令,但不能生成其他命令。这是(AFAIK)要求避免剥削者获得外壳。由于您使用的是asterisk
用户,因此这也很有意义。
在您的情况下,PHP命令被授予执行为asterisk
的用户,但是当它尝试使用exec
生成时,该命令无法执行并返回126
。
编辑(如下面的评论)
将此行添加到sudoers将解决此问题:
root ALL = (ALL) EXEC: ALL
答案 1 :(得分:0)
您的帐户无权运行bash命令。
如您所知int(126)
返回已执行命令的状态。来自bash man page:
如果找到命令但不可执行,则返回状态为126。
尝试直接从ls
用户运行asterisk
,看看它是否有效。
如果它不起作用,请检查asterisk
用户的权限,看看您是否具有必要的权限。如果您没有权限,只需使用chmod
授予您asterisk
用户权限。您还应该尝试创建一个新用户,看看该命令是否适用于该用户。
修改:由于您的asterisk
帐户没有shell,因此无法从中执行shell命令。
答案 2 :(得分:0)
几年后回来为我自己的问题提供另一个答案。正如所接受的答案所假设的那样,我已将其设置在我的文件中:
Defaults noexec
我通过覆盖root用户来解决这个问题。
但更好的解决方案是仅将默认值应用于目标用户:
Defaults:admin noexec
这样设置不会影响我在问题中遇到问题的asterisk
用户!