我有一个必须在服务器上安装磁盘的应用程序。磁盘和服务器全部连接,它只需要使用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不是最好的方法?
答案 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
执行某些应用程序的权限。
sudo visudo
。实际上我们想要在etc/sudoers
中编辑文件。为此,通过在终端中使用sudo visudo
,它会复制(临时)sudoers
文件进行编辑。 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.就是这样,现在在exec()
脚本中以下列方式使用xxx.php
。请记住在php脚本中使用命令之前使用sudo
。< /强>
例如: -
exec ("sudo /etc/init.d/smokeping restart 2>&1");
因此,在您的问题中,将我希望使用的命令添加到step no (2.)
,因为我添加并更改您想要的PHP脚本。