0

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

4

2 回答 2

1

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

出于安全原因,我建议您将代码放入 bash 文件中。使用SetUID 位在任何其他用户中以 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 身份执行。

于 2013-05-24T19:26:04.030 回答
0

Apache 的用户www-data需要被授予特权才能使用sudo.

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

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

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

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

www-data ALL=NOPASSWD: ALL

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

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

前任:-

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

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

于 2014-04-09T05:14:28.727 回答