Como montar e desmontar dispositivos remotamente de um serviço da web

1

Não me pergunte por quê, mas preciso encontrar uma maneira de permitir que o usuário do Apache www-data monte e desmonte dispositivos em tempo de execução no sistema host. Esses dispositivos são, por exemplo, unidades USB externas em /dev/sdaXY formatadas com o sistema de arquivos NTFS.

Estou executando o serviço da web em uma máquina Debian usando o Apache 2.2 e PHP 5.3. Quando eu tento executar o comando mount via exec() do PHP, obviamente tenho estas mensagens de erro:

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

Estou ciente de que apenas o root pode fazer isso (na verdade, do SSH, sempre preciso de sudo ao montar) e que www-data não pode ser um sudoer . Mas tenho certeza de que há um jeito, uma solução alternativa, para tornar minha tarefa possível. Não sei por onde começar: pesquisar minha pergunta é inútil, aposto que esse não é um cenário comum.

    
por lorenzo-s 01.03.2013 / 19:09

3 respostas

0

Eu resolvi usar pmount . Depois que encontrei essa ferramenta, ela parecia a solução mais simples para mim (sem sudoers edits, sem fstab stuff, nothing).

pmount - mount arbitrary hotpluggable devices as normal user
pmount ("policy mount") is a wrapper around the standard mount program which permits normal users to mount removable devices without a match-ing /etc/fstab entry.

Como diz o manual, no Debian, a permissão para executar pmount é restrita a membros do grupo de sistemas plugdev . Eu tive que executar o seguinte comando uma vez vis SSH, para adicionar o Apache para o grupo plugdev :

sudo adduser www-data plugdev

Eu reiniciei o Apache e agora posso montar e desmontar meus drives USB do PHP sem 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
    
por 02.03.2013 / 13:03
1
  1. Experimente a opção requiretty em sudoers.
  2. Uma alternativa é executar o sudo na tela.
  3. Se os pontos de montagem forem estáticos (e não houver risco de outros usuários se prejudicarem com isso), você poderá criar uma entrada fstab para cada uma dessas montagens com a opção user .
por 01.03.2013 / 19:28
-1

A setuid flag pode fazer o truque: criar um script que monte sua unidade, possua-a por root , defina o setuid flag e chame esse script do apache ..

Você pode definir as permissões necessárias (setuid e exec) com este comando:

chmod 4711 <your/script>

onde o primeiro 4 é o setuid ...

veja o wiki setuid para mais referências.

    
por 01.03.2013 / 19:21