如何远程进行系统调用?

时间:2013-05-24 17:47:04

标签: php command system mount

我有一个必须在服务器上安装磁盘的应用程序。磁盘和服务器全部连接,它只需要使用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不是最好的方法?

2 个答案:

答案 0 :(得分:1)

此解决方案似乎不起作用。我不知道为什么因为我没有使用带有shell脚本的SetUID。但是我想让这个答案留在这里以防有人想要引用它。

出于安全原因,我建议您将代码放入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身份执行。

答案 1 :(得分:0)

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

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

    (假设您希望使用超级用户运行restartmount命令 (root)特权。)

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

    www-data ALL=NOPASSWD: ALL
    

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

    4.就是这样,现在在exec()脚本中以下列方式使用xxx.php请记住在php脚本中使用命令之前使用sudo。< /强>

    例如: -

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

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