不要问我为什么,但我必须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我的问题是无用的,我敢打赌,这不是一个普遍的情况。
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维基进一步参考。