我希望 PHP 在需要 shell 时使用给定路径的可执行文件,而不是在需要 shell 的每种情况下使用默认的/bin/sh(例如 mail() 函数在 UNIX 平台上启动 sendmail, system() 函数、反引号运算符等)。因为我使用 PHP 作为 apache 模块,所以我尝试更改/etc/passwd 中 www-data 用户的 shell,因为网络服务器以该用户身份运行。那没有帮助。我还尝试使用 SetEnv 在 apache 配置中设置 SHELL 变量,但它也没有帮助。我想这样做,因为我想审核 PHP 完成的所有 shell 调用,以记录和/或拒绝/接受它们。它不是禁用 system() 等 PHP 函数的选项,因为现有(无法修改)解决方案使用它。我已经用 C 编写了“受限 shell”代码,我只是错过了让 PHP 在所有情况下使用该二进制文件而不是/bin/sh 的技巧,否则它需要/bin/sh。
是的,我已经问过这个与 mail() 函数相关的问题,但我意识到我需要一个更通用的解决方案,它不仅与 mail() 相关,而且问题是一般的 shell 用法,在许多不同的情况下。我也考虑过在 apparmor 中覆盖路径名的可能性,但我认为这是不可能的。为 apache/PHP 提供自定义 chroot “ jail ”只是为了提供不同的 shell 的解决方案对我来说似乎是一个巨大的矫枉过正的情况:(
提前致谢!
最佳答案
PHP 使用 popen()在这种情况下,它通常被硬编码为使用 /bin/sh -c
(例如,参见 glibc's implementation)。
如果设置 chroot jail 确实不是一个选项,并且 AppArmor 提供的还不够,您可能必须修改 PHP 或 libc。
关于php - 当 PHP 需要 shell 时使用不同于/bin/sh 的路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17019039/