【问题标题】:PHP communicate with Shell ScriptPHP 与 Shell 脚本通信
【发布时间】:2016-06-15 15:58:09
【问题描述】:

这是一个 Ubuntu 系统,我需要 PHP 来执行一个具有特定用户名的程序,比如 userA。

我使用 php exec() 函数调用 sudo -Eu userA command_to_run_program,由于 Ubuntu 上缺少一些安全功能或环境变量,它没有工作。

所以我在想是否可以实现这种替代方式:

从后端,有一个带有固定 Pid 的 shell 脚本正在运行并等待信号。如果这个进程接收到一个特定的信号,它将执行程序。假设我使用 userA 手动启动了这个 shell 脚本。所以我假设当它接收到信号并执行程序时,程序是用userA执行的。

这台机器上有一个带有 PHP 的 apache 服务器。前端用户进入PHP页面,php程序将信号发送给正在运行的shell脚本,唤醒shell脚本,程序由userA执行。

如果可以实现,最好的做法是什么?

感谢您的帮助!

【问题讨论】:

  • 最佳实践可能是解决环境变量或安全功能,而不是构建复杂的信号和助手!

标签: php linux bash shell ubuntu


【解决方案1】:

换句话说,您需要从网络服务器的用户帐户向(特定?)不同的用户进行某种权限升级。这具有安全隐患,但我假设您已经考虑了可能性。

无论如何,以下步骤应该可以工作:

  • 创建一个运行相应代码的程序(尽管只是一个 shell 脚本)。
  • 将程序放到网络服务器可以访问的地方。
  • 使目标用户成为程序的所有者并设置 SUID 位。这样,执行它会导致它在用户帐户下运行。
  • 将 webserver 组设为程序的组,并且只允许它(而不是其他用户)通过可执行位运行程序。

有关详细信息,请参阅 chownchmod 的手册页。

【讨论】:

  • 感谢您的回复。你能解释一下为什么“让目标用户成为程序的所有者并设置 SUID 位”。将“那样,执行它将导致它在用户帐户下运行。” ?
  • 例如,将“whoami”放入一个shell脚本中。它不会总是输出 shell 的所有者,而是打印执行这个 shell 脚本的用户。
  • 我阅读了这些文章,但仍然不清楚如何做到这一点。你能举个例子吗?网络服务器的 usr/group 是 www-data:www-data。 shell 脚本的 usr/group 是 userA:userA。 shell 脚本中的命令只能用 userA 运行。那么如何为 shell 脚本设置 SUID 以便网络服务器可以在 userA 权限下执行呢?谢谢!
  • 以 wh​​oami 为例。如果我将 u+s 添加到 whoami 程序,那么它将打印程序所有者的用户名。但是,如果我将 whoami 放入 shell 脚本并执行 u+s,则不会打印 shell 脚本所有者的用户名..
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-20
  • 2011-07-27
  • 2012-11-23
相关资源
最近更新 更多