php - 通过 PHP 运行 bash 命令,更改目录然后执行二进制文件

标签 php linux bash centos centos6

这就是我想要做的。我正在尝试通过 PHP 脚本在另一个用户下启动二进制文件。 Apache 具有 sudo 访问权限。当通过以“测试”身份登录的 putty 运行时,该命令工作正常。

passthru('bash -c "sudo -u test cd /home/test/cs/ ; ./hlds_run"');

我还可以补充一点吗

passthru('bash -c "sudo -u test ./home/test/cs/hlds_run"');

由于二进制文件的编写方式而无法工作(它不会找到它的资源,除非你 cd 到之前的文件夹,在终端上测试)

最佳答案

如果每个人都可以访问/home/test/cs:

passthru('cd /home/test/cs && sudo -u test ./hlds_run');

如果只有用户 test 有权访问该目录:

passhtru('sudo -u test sh -c "cd /home/test/cs && ./hlds_run"');

要进行第二次调用,您应该已经熟悉 systemexecve 语义(由 passthrusudo 使用 分别)。

  1. 这是我们需要以特定用户身份运行的经过测试的 shell 字符串:

    cd/home/test/cs && ./hlds_run

  2. 我们可以通过 sudo 确保它始终作为特定用户运行,但是 sudo 使用 execve 语义。我们必须将 shell 字符串转换为 execve 数组,并且由于此命令 A. 依赖 shell 功能,如 cd 和 B. 不包括动态值,最好的方法要做到这一点,只需简单地调用一个 shell 来逐字解释它:

    { sh, -c, cd/home/test/cs && ./hlds_run }

  3. 我们现在可以应用 sudo 作为我们的特定用户运行:

    { sudo, -u, test, sh, -c , cd/home/test/cs && ./hlds_run

  4. passthru 作为 shell 运行,所以现在我们必须将上面的 execve 数组转换回 shell 字符串,特别注意引用以确保shell 会将其解析为上面的确切参数列表。幸运的是,这是一个相对简单的案例:

    sudo -u test sh -c "cd/home/test/cs && ./hlds_run"

  5. 我们现在可以将它交给passthru:

    passthru('sudo -u test sh -c "cd/home/test/cs && ./hlds_run"');

关于php - 通过 PHP 运行 bash 命令,更改目录然后执行二进制文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29083389/

相关文章:

linux - Bash 函数忽略 set -e

python - 从 python 在后台运行 "linux" sleep

PHP-Laravel : How to save without time overlapping in DB

php - 从两个或多个具有某些列名的 sql 表中选择

php - nginx 不转发 POST 到 @fallback

c++ - 使用 libudev 在 Linux 中获取有关已安装驱动器的信息

php - 使用更改配置安装 debian 软件包

linux 在目录中查找内容为给定字符串的文件

c++ - Mac 和 Linux 上的 SDL IMG_Load() 为同一图像返回不同的 BitsPerPixel

json - 在 bash 中使用 curl 以环境变量作为数据执行 HTTP POST