PHP脚本需要使用shell_exec()运行sudo命令的权限

我有一个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()停止工作。

如果我再做一次,我的新路线还在那里。 但是,只有当我再次保存时,脚本才能重新开始工作。

谁能告诉我为什么这可能会发生? 我有两个不是很好的猜测:

  1. 有一种宽限期开始于我sudo visudo ,这是什么让我的脚本工作(但直到它到期)。
  2. etc / sudoers中的新数据停留在sudoers.tmp(“locking文件”)中……这两者都不属于我。

编辑:

我想我使用了错误的用户名…看起来像MAMP,Apache用户实际上是我的用户(而不是www数据)。 我知道这是因为我把它添加到我的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 

这两件事都不是你提出的问题。

你的sudoers文件中有requiretty行吗? 这将解释为什么它适合你,但不是你的PHP脚本。 删除将解决这个问题。

Sudo可能已经被configuration为caching你的密码15分钟,检查你的sudoers文件中的'Defaults timestamp_timeout = XXXX'这样的行。

build议一句话,考虑限制sudo只有它所需要的文件。 如果攻击者设法将恶意文件放入node_modules / less /目录下怎么办?

您应该禁用Web用户的requiretty

这是/ etc / sudoers的语法

 Defaults:username !requiretty 

不要使用visudo命令编辑/ etc / sudo

您必须授权用户在sudoers文件中允许提升特权。 如果你的networking服务器是作为Emerson那么运行

 Emerson ALL = NOPASSWD: /var/root/note/npm/node_modules/less/bin/lessc 

应该解决你的问题。