我有一个包含的 PHP 脚本shell_exec()
,它执行的命令通常需要 sudo。我使用 visudo 编辑了 sudoers,使其包含以下内容:
www-data ALL = NOPASSWD: /var/root/node/npm/node_modules/less/
%users ALL = NOPASSWD: /var/root/node/npm/node_modules/less/
我认为两种方法都应该可行,但是为了确保万无一失,我选择了双重保险的方法。
我正在使用 vim 编辑 etc/sudoers,因此在添加这些行之后,我执行 :x,一切正常。我的 PHP 脚本按预期运行……大约 10-15 分钟。然后脚本停止工作。具体来说,停止shell_exec()
工作。
如果我sudo visudo
再次保存,我的新行仍然在那里。但只有当我再次保存时,脚本才会重新开始工作。
有人能告诉我为什么会发生这种情况吗?我有两个猜测不太好:
- 当我开始时会有某种宽限期,
sudo visudo
这允许我的脚本正常工作(但只能持续到它过期)。 - etc/sudoers 中的新数据保留在 sudoers.tmp(“锁定文件”)中...这些对我来说都不起作用。
编辑:
我认为我使用了错误的用户名...对于 MAMP 来说,apache 用户实际上是我的用户(而不是 www-data)。我知道这一点,因为我将其添加到我的 PHP 脚本中:echo = shell_exec("whoami");
我的用户名显示为:Emerson
。那么这是否意味着我应该将其添加Emerson ALL = NOPASSWD: /var/root/note/npm/node_modules/less/bin/lessc
到我的 sudoers 文件中?
编辑:
我已经在我的 sudoers 文件中使用它了。Emerson ALL=(ALL) NOPASSWD: ALL
它能工作,但我认为它不应该这样。除了一堆冗余之外,它也太宽容了。我把所有无用的东西都保留了下来,这样你就能看到我目前得到的结果。
#
# Host alias specification
# User alias specification
# Cmnd alias specification
# Defaults specification
Defaults env_reset
Defaults env_keep += "BLOCKSIZE"
Defaults env_keep += "COLORFGBG COLORTERM"
Defaults env_keep += "__CF_USER_TEXT_ENCODING"
Defaults env_keep += "CHARSET LANG LANGUAGE LC_ALL LC_COLLATE LC_CTYPE"
Defaults env_keep += "LC_MESSAGES LC_MONETARY LC_NUMERIC LC_TIME"
Defaults env_keep += "LINES COLUMNS"
Defaults env_keep += "LSCOLORS"
Defaults env_keep += "SSH_AUTH_SOCK"
Defaults env_keep += "TZ"
Defaults env_keep += "DISPLAY XAUTHORIZATION XAUTHORITY"
Defaults env_keep += "EDITOR VISUAL"
Defaults !requiretty
# Runas alias specification
# User privilege specification
root ALL=(ALL) ALL
%admin ALL=(ALL) ALL
Emerson ALL=(ALL) NOPASSWD: ALL
# Uncomment to allow people in group wheel to run all commands
# %wheel ALL=(ALL) ALL
# Same thing without a password
%wheel ALL=(ALL) NOPASSWD: ALL
# Samples
# %users ALL=/sbin/mount /cdrom,/sbin/umount /cdrom
# %users localhost=/sbin/shutdown -h now
#Allow PHP to compile .less files
www-data ALL = NOPASSWD: /var/root/node/npm/node_modules/less/bin/lessc
%users ALL = NOPASSWD: /var/root/node/npm/node_modules/less/bin/lessc
Emerson ALL =(ALL) NOPASSWD: /var/root/node/npm/node_modules/less/bin/lessc
apache ALL =(ALL) NOPASSWD: /var/root/node/npm/node_modules/less/bin/lessc
答案1
您所建议的任何事情都不是这里的问题。
您的 sudoers 文件中是否有 requiretty 行?这可以解释为什么它对您有效,但对您的 PHP 脚本无效。删除它可以解决问题。
Sudo 可能已配置为缓存您的密码 15 分钟,请检查 sudoers 文件中是否有类似“Defaults timestamp_timeout = XXXX”的行。
一个建议是,考虑将 sudo 限制为仅需要的文件。如果攻击者设法将恶意文件放入您的 node_modules/less/ 目录中怎么办?
答案2
您应该为 Web 用户禁用 requiretty
以下是 /etc/sudoers 的语法
Defaults:username !requiretty
不要使用 vim 编辑 /etc/sudo,请使用 visudo 命令
答案3
您必须在 sudoers 文件中授权您想要允许提升权限的用户。如果您的 Web 服务器正在运行,Emerson
那么
Emerson ALL = NOPASSWD: /var/root/note/npm/node_modules/less/bin/lessc
应该可以解决你的问题。