【问题标题】:How to run a shell script as different user with PHP on Nginx?如何在 Nginx 上使用 PHP 以不同用户身份运行 shell 脚本?
【发布时间】:2014-10-21 08:10:59
【问题描述】:

尝试使用 POST 请求(由 nginx 处理)触发 shell 脚本。目前没有成功。

我有什么:

exec('whoami'); // nginx

nginx:x:220:498:Nginx web server:/var/lib/nginx:/sbin/nologin

我们可以看到,nginx 用户没有 shell。这会是个问题吗?接下来,

nginx ALL=(user) NOPASSWD: /path/to/script.sh

如果我将nginx 更改为我的真实用户,我可以在没有密码提示的情况下运行sudo -u user /path/to/script.sh,但由于某种原因,如果我运行su -s /bin/bash -c /path/to/script.sh user,我仍然需要输入密码。也许,后一种调用更适合nginx 用户,因为他有nologin shell。

所以每当我运行exec('sudo -u user /path/to/script.sh'); 或通过PHP 运行包含该行的一些包装脚本时——什么都没有发生。我什至无法确定什么不起作用,因为没有抛出任何错误。

任何帮助将不胜感激。

【问题讨论】:

  • 将2>&1 添加到命令末尾以获取错误输出。此外,如果您想执行/bin/bash,则需要将其作为sudoers 文件中的条目。或者,您可能想要创建一个包装器脚本,nginx 可以简单地执行并且可以处理 sudo(如果它适合您的需要)
  • 将nginx 添加到sudoers 只会授予它sudo 权限,而不是su。两者是相关的,因为它们执行相似的目的,但仍然是分开的。从历史上看,sudo 是 su 的包装器,具有额外的可用性功能和访问控制机制。
  • “没有抛出错误”不正确;您应该在系统日志中找到一条错误消息。传统上,sudo 错误记录到auth.log,在现代 LSB 系统上位于/var/log。 (现在我们希望你有读取权限:-)
  • 哇,@fejese,感谢2>&1。现在它立即显示sudo: sorry, you must have a tty to run sudo。是的,我已经尝试过包装脚本,它做了完全相同的事情sudo -u ...,但是,现在,由于我有错误显示,我可以进一步挖掘。

标签: php bash shell nginx


【解决方案1】:

感谢@fejese 和@triplee,我终于想通了。我必须在 sudoers 文件中添加 requiretty 参数,然后将其更改为...

#Defaults   requiretty
#Defaults   !visiblepw

...一切顺利!

【讨论】:

  • 别忘了接受你自己的答案! :) 现在我只想说,你的问题回答了我的问题,这很有趣!哈哈
猜你喜欢
  • 2011-03-10
  • 1970-01-01
  • 1970-01-01
  • 2018-01-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-11
  • 1970-01-01
相关资源
最近更新 更多