在服务器端环境中工作时,经常会遇到需要执行外部命令行程序的情况来自 PHP 脚本。但是,运行 PHP 的默认用户可能没有足够的权限或访问某些应用程序。
考虑一个场景,您在本地主机上运行 Apache 并尝试控制 Rhythmbox 播放来自以 www 用户身份运行的 PHP 脚本。执行命令 Rhythmbox-client --pause 手动运行时效果很好,但以 www-user 身份执行时失败,因为 Rhythmbox 无法识别或访问用户的实例。
一个有效的方法解决方案是利用 sudo 命令,允许您以特定用户身份执行外部程序。这涉及修改 sudoers 文件 (visudo) 以授予 Web 服务器用户(例如 wwwuser)运行特定命令的权限:
wwwuser ALL=/usr/bin/rhythmbox-client
这限制了 Apache 只执行必要命令的能力,从而防止潜在的安全风险.
在这种特殊情况下,Rhythmbox 可能仍然无法识别用户的实例,因为 PHP 是以 www 用户身份运行的。为了解决这个问题,创建一个调用 Rhythmbox-client 的 bash 脚本,并从执行用户的环境中检索 DBUS_SESSION_BUS_ADDRESS:
<code class="bash">#! /bin/bash DBUS_ADDRESS=`grep -z DBUS_SESSION_BUS_ADDRESS /proc/*/environ 2>> /dev/null| sed 's/DBUS/\nDBUS/g' | tail -n 1` if [ "x$DBUS_ADDRESS" != "x" ]; then export $DBUS_ADDRESS /usr/bin/rhythmbox-client --pause fi</code>
这个 bash 脚本可以由 PHP 作为 wwwuser 执行,从而允许您控制 Rhythmbox 播放作为 PHP 应用程序的用户。
以上是如何在 PHP 中以特定用户身份执行外部命令?的详细内容。更多信息请关注PHP中文网其他相关文章!