【问题标题】:How to make a system call remotely?如何远程进行系统调用?
【发布时间】:2013-05-20 09:34:58
【问题描述】:

我有一个必须在服务器上安装磁盘的应用程序。磁盘和服务器都连接了,它只需要使用 linux 'mount' 命令。

我写了一个简单的php:

<?
exec("/var/www/MountTheDisk.sh");
?>

我添加了 bash 脚本:MountTheDisk.sh

#!/bin/bash

diskutil mount /dev/xvdb1 /mnt/theDisk/
echo trying to mount

现在,如果我运行那个 php,我不会得到任何结果。什么都没有回显,也没有安装磁盘。如何远程运行此命令?也许php不是最好的方法?

【问题讨论】:

  • 运行 PHP 的用户是否有 sudo 权限?
  • 我只是通过将网站导航到 url 来运行文件:ip.address/MountDisk.php 有没有更好的方法来完成这个?或者我如何在登录时远程运行文件?
  • 1.您的命令需要作为字符串发送,并且您缺少结束分号。 exec('sudo mount /dev/xvdb1 /mnt/thisDisk/'); 2. 正如 Mike Brant 所建议的,运行 PHP 的用户(可能是 Apache 或您正在运行的任何 Web 服务器)必须具有 sudo 权限。
  • 是的,我确实忘记了冒号,好电话。我的 sunders 文件显示 ALL,这是否意味着权限正常?
  • 另外,也许它不需要是一个 sudo 调用?

标签: php command system mount


【解决方案1】:

此解决方案似乎不起作用。我不知道为什么,因为我没有将 SetUID 与 shell 脚本一起使用。但我让这个答案留在这里,以防有人想参考它。

出于安全原因,我建议您将代码放入 bash 文件中。使用SetUID-bit 在任何其他用户中以root 身份执行bash 文件。这样,除了 root 之外的任何其他人都无法写入您的文件,并且您不需要使用 sudo 处理。否则,您允许您的 php 进程以 root 身份执行代码,这在大多数情况下是一个非常糟糕的主意。

您没有收到任何输出的原因可能是因为它要求输入密码而 exec 无法输入密码。

编辑: 将您的 php 调用更改为:

<?
exec("/var/www/MountTheDisk.sh");
?>

比创建一个包含类似内容的 bash 文件 (/var/www/MountTheDisk.sh)

#!/bin/sh

// this script will be executed as root
diskutil mount /dev/xvdb1 /mnt/theDisk/
echo trying to mount

现在设置 SetUID 位并将所有者更改为 root。 (必须通过 root shell 完成)

// make script executable
chmod +x /var/www/MountTheDisk.sh

// setuid bit
chmod u+s /var/www/MountTheDisk.sh

// change owner to root
chown root:root /var/www/MountTheDisk.sh

注意:任何用户都可以运行此文件。任何调用都将导致它以 root 身份执行。

【讨论】:

  • 看来我可以弄清楚如何做到这一点 - 我会试一试。如何在不进入终端窗口的情况下执行 bash 文件?从网络浏览器导航到文件似乎只是回显文件。
  • @Rossi 如果您想从 PHP 执行 bashscript,您可以简单地调用 exec("sh /path/to/yourbashfile.sh"); 或 exec("/path/to/yourbashfile.sh);(如果您设置了 bashscript 的执行位)。如果你对 bashscript 不是很熟悉,你应该先看看 linux 是如何识别如何运行一个可执行文件的。
  • 我已经像你说的那样修改了我的文件并添加了一个 bash 脚本。而且我认为这就是您设置 uid-bit 的方式,我对此进行了一些研究,但并不完全有信心。得到了相当多的信息。还是不掷骰子。这一切看起来像你在谈论吗? (您可以在上面编辑过的问题中看到)非常感谢您的帮助!
  • @Rossi 不要将该位与setuid 命令混用。 SetUID 位是需要通过终端设置的。它是一种文件的探测(如可执行文件)。如果设置了该位,则对相应脚本的任何执行都将导致它作为文件的所有者执行。所以你必须做的是:将你的 bash 脚本的所有者更改为 root (chown root:root file.sh),然后设置 SetUID 位和可执行文件 (chmod u+s file.sh)。您必须通过 root shell 执行此操作。还要确保文件是可执行的,并将您的调用更改为exec("/var/www/MountTheDisk.sh"); 查看编辑。
  • 好的,我试过了 - 非常感谢。我仍然没有看到结果。我按照您解释的将用户设置为该文件的 root 的步骤进行操作。任何最后的想法让这个运行?我最新版本的文件在顶部 -
【解决方案2】:

Apache 的用户www-data 需要被授予权限才能使用sudo 执行某些应用程序。

  1. 运行命令sudo visudo。实际上我们想编辑etc/sudoers中的文件。为此,通过在终端中使用sudo visudo,它复制(临时)sudoers文件进行编辑。
  2. 在文件的末尾,添加以下ex:-如果我们想使用命令重新启动smokeping并使用mount命令进行其他操作,

www-data ALL=NOPASSWD: /etc/init.d/smokeping/restart, /bin/mount

(假设您希望使用超级用户运行restart 和mount 命令 (root) 权限。)

但是,如果您希望使用 超级用户权限,然后添加以下内容而不是上面的内容。您可能不想这样做,而不是ALL 命令,非常危险。

www-data ALL=NOPASSWD: ALL

3.编辑sudoers文件后(通过visudo我们编辑sudoers的临时文件,所以保存并退出临时文件(visudo)写入sudoers文件。(wq!)

4.就是这样,现在在您的xxx.phpscript 中按以下方式使用exec()。请记住在php脚本中使用命令之前使用sudo。

例如:-

exec ("sudo /etc/init.d/smokeping restart 2>&1");

因此,在您的问题中,将您希望使用的命令添加到step no (2.),因为我添加并根据您的需要更改您的 php 脚本。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-09
    • 2011-06-29
    • 1970-01-01
    • 1970-01-01
    • 2012-06-20
    相关资源
    最近更新 更多