Не спрашивайте меня, почему, но я должен найти способ разрешить пользователю Apache www-data
монтировать и размонтировать устройства во время выполнения в хост-системе. К таким устройствам относятся, например, внешние USB-накопители на /dev/sdaXY
отформатирован с файловой системой NTFS.
Я запускаю веб-службу на машине Debian, используя Apache 2.2 и PHP 5.3. Когда я пытаюсь запустить mount
команда через PHP exec()
У меня, очевидно, есть сообщение об ошибке:
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. Но я уверен, что есть способ, обходной путь, чтобы моя задача стала возможной. Я не знаю, с чего начать: поиск в Google моего вопроса бесполезен, держу пари, что это не общий сценарий.
user
.Я решил использовать pmount
. После того, как я нашел этот инструмент, мне он показался самым простым решением (нет sudoers
правки, нет fstab
прочее, ничего).
pmount
- монтировать произвольные устройства с возможностью горячего подключения как обычный пользователь
pmount
("установка политики") - это оболочка вокруг стандартного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
flag может помочь: создать скрипт, который монтирует ваш диск, владеть им корень, установить setuid
отметьте его и вызовите этот скрипт из apache ..
Вы можете установить необходимые разрешения (setuid и exec) с помощью этой команды:
chmod 4711 <your/script>
где первый 4 это setuid ...
см. вики по setuid для получения дополнительной информации.