如何从Web服务远程安装和卸载设备

不要问我为什么,但我必须find一种方法来允许Apache用户www-data在主机系统上运行时装载和卸载设备 。 例如,这样的设备是在/dev/sdaXY用NTFS文件系统格式化的外部USB驱动器。

我使用Apache 2.2和PHP 5.3在Debian机器上运行Web服务。 当我尝试通过PHP的exec()运行mount命令时,我显然有这样的错误信息:

 exec('mount /dev/sda1 /media/usb_flash'); // -> mount: only root can do that exec('sudo mount /dev/sda1 /media/usb_flash'); // -> sudo: no tty present and no askpass program specified exec('sudo -n mount /dev/sda1 /media/usb_flash'); // -> sudo: sorry, a password is required to run sudo 

我知道只有root可以做到这一点(事实上,从SSH,我总是需要安装sudo ),并且www-data不能成为一个sudoer 。 但是我相信有一个办法,一个解决办法,使我的任务成为可能。 我不知道从哪里开始看:谷歌search我的问题是无用的,我敢打赌,这不是一个普遍的情况。

  1. 在sudoers中尝试选项requiretty。
  2. 另一种方法是在屏幕中运行sudo。
  3. 如果挂载点是静态的(并且不存在其他用户对此有害的风险),则可以使用选项user为这些挂载创build一个fstab条目。

我解决了使用pmount 。 find这个工具后,它看起来是最简单的解决scheme(没有sudoers编辑,没有fstab东西,什么都没有)。

pmount – 以普通用户身份挂载任意可热插拔的设备
pmount (“policy mount”)是标准mount程序的一个包装,它允许普通用户在不匹配/ etc / fstab条目的情况下挂载可移动设备。

正如手册所述,在Debian上,执行pmount的权限仅限于系统组plugdev成员。 我必须运行以下命令一次对SSH,将Apache usar添加到plugdev组:

 sudo adduser www-data plugdev 

我重新启动Apache,现在我可以挂载和卸载我的USB驱动器从PHP没有sudo

 exec('pmount /dev/sda1 usb_flash'); // Mounted on /media/usb_flash exec('ls -al /media/usb_flash'); // List files, owned by www-data:600 exec('pumount usb_flash'); // Unmounted 

setuid标志可能会诀窍:创build脚本挂载你的驱动器,拥有它的 ,设置setuid标志,并从apache调用此脚本..

您可以使用此命令设置所需的权限(setuid和exec):

 chmod 4711 <your/script> 

第一个4是setuid …

请参阅setuid维基进一步参考。