Назад | Перейти на главную страницу

Как подключать и отключать устройства удаленно из веб-службы

Не спрашивайте меня, почему, но я должен найти способ разрешить пользователю 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 моего вопроса бесполезен, держу пари, что это не общий сценарий.

  1. Попробуйте опцию requiretty в sudoers.
  2. Альтернативой является запуск sudo на экране.
  3. Если точки монтирования статичны (и нет риска, что другие пользователи причинят им вред), вы можете создать запись fstab для каждой из этих точек монтирования с опцией 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 для получения дополнительной информации.