【问题标题】:How to run an external command as a specific user in PHP如何在 PHP 中以特定用户身份运行外部命令
【发布时间】:2010-12-26 06:50:12
【问题描述】:

我想到了 suPHP,但这不是我需要的。以不同的用户身份运行整个 PHP 脚本不符合我的目的。我只需要以不同的用户身份运行一个 linux 命令行。

有可能吗?

【问题讨论】:

标签: php linux apache impersonation


【解决方案1】:

我认为您应该尝试另一种方法。 “setuid”。

http://en.wikipedia.org/wiki/Setuid

基本上,您要求文件以其所有者身份运行,而不是程序。

【讨论】:

  • 在链接中它说:“由于安全漏洞的可能性增加,许多操作系统在应用于可执行的 shell 脚本时会忽略 setuid 属性”。我需要运行一个 shell 脚本。 Linux有这个限制吗?
  • 不是默认情况下,但是只有当它的解释器也是 setuid 时,一个脚本才被允许运行 setuid。
  • 如果我编译一个 C 程序然后执行一个 shell 命令并为该 C 程序设置 setuid 标志怎么办?它会绕过这个限制吗?
  • 您的 C 程序需要调用 setuid(geteuid()) 才能退出 setuid 模式,但是可以。
【解决方案2】:

你可以试试shell_exec函数和sudo

编辑:看到 sudo 提示输入密码,您可能想使用proc_open,它允许您使用管道。有关如何创建自定义密码管道,请参阅 this comment

【讨论】:

  • 然后尝试 proc_open。有关如何使用管道,请参阅我链接到的手册页上的第一个示例。
  • @SteveKemp - 对于面向前的 Web 服务器来说,这似乎是个坏主意。也许 setuid 程序会是更好的选择。
  • 我假设您将允许您希望以随机用户身份执行的单个命令被执行,而不是打开任何东西以便可以执行任何操作任何用户!
【解决方案3】:

您可以使用该用户 CRON 来执行脚本。如果这是一个 Web 应用程序,那么您仅限于具有有限权限的 Apache/Nobody 用户。如果这只需要在某个时间运行,我会使用 CRON。

另一种方法是Sticky Bits

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-18
    • 2013-07-31
    • 2010-11-08
    • 1970-01-01
    • 2019-11-09
    • 1970-01-01
    相关资源
    最近更新 更多