从 www-data 用户运行 root 脚本

从 www-data 用户运行 root 脚本

我在 apache 服务器上通过 php 运行需要 root 权限的命令时遇到问题

  1. 我向 sudoers 添加了一个命令,这样它就不需要用户密码

视觉:

#
# This file MUST be edited with the 'visudo' command as root.
#
# Please consider adding local content in /etc/sudoers.d/ instead of
# directly modifying this file.
#
# See the man page for details on how to write a sudoers file.
#
Defaults env_reset
Defaults mail_badpass
Defaults secure_path = "/ usr / local / sbin: / usr / local / bin: / usr / sbin: / usr / bin: / sbin: / bin"

# Host alias specification

# User alias specification
# Cmnd alias specification

# User privilege specification
root ALL = (ALL: ALL) ALL

# Allow members of group sudo to execute any command
% sudo ALL = (ALL: ALL) ALL

# See sudoers (5) for more information on "#include" directives:

#includedir /etc/sudoers.d

www-data ALL = NOPASSWD: / sbin / iw
  1. 我尝试执行的 PHP 脚本,我还检查返回的错误
<? php
echo '<pre>';
$ last_line = system ('sudo / sbin / iw wlan0 scan 2> & 1', $ retval);
// Printing additional info
echo '
</pre>
<hr /> Last line of the output: '. $ last_line. '
<hr /> Return value: '. $ retval;
?>

php脚本返回

sh: 1: sudo: not found

Last line of the output: sh: 1: sudo: not found Return value: 127

sudo 已安装,当我从其他用户执行时工作正常

whoami 返回“www-data”,因此用户正常

www-数据属于

sudo group

groups www-data
www-data: www-data sudo

答案1

首先,这一行是完全错误的:

www-data ALL = NOPASSWD: / sbin / iw

如果您曾经visudo编辑过 sudoers 文件,您会收到类似以下的警告(对于行号XXX):

>>> /etc/sudoers: syntax error near line XXX <<<

它告诉你语法错误。确实,应该是这样的:

www-data ALL = NOPASSWD: /sbin/iw

但是,除了语法之外,让 Web 应用程序拥有完全和不受限制的访问权限iw似乎不是一个好主意。通常的方法是编写一个辅助脚本,该脚本只执行调用者期望的一两件事,仅此而已。例如,如果您只对扫描感兴趣,则不要允许脚本执行除扫描之外的任何其他操作。该www-data帐户将被授予此脚本的 root 权限,而不是iw,这样即使有人设法突破您的 Web 应用程序,他们也只能执行 Web 服务器可以执行的任何操作。

其次,这一行也是错误的:

last_line = system ('sudo / sbin / iw wlan0 scan 2> & 1', $ retval);

我不确定为什么您会认为这/ sbin / iw是一个有意义的命令,并且运行此命令会出现错误:

sudo / sbin / iw wlan0 scan 2> & 1
-bash: syntax error near unexpected token `&'

使用正确的语法:

sudo /sbin/iw wlan0 scan 2>&1

第三,你没有说明它在哪个主机上运行,​​但你的www-data帐户可能没有访问权限/usr/bin/sudo。如果没有额外的信息,诊断这个问题会比较困难。

相关内容