Estos días pasados he estado peleándome con lo siguiente: necesitaba que un programa en PHP (ejecutado en máquina llamada RH5, que corre sobre un Red Hat 5) fuera capaz de montar una unidad de cd/dvd remota (más en concreto, de un equipo local Windows XP SP3).
Os comento, un poco por encima, los pasos a seguir para conseguir esto:
- Compartir la unidad del equipo windows con nombre de usuario apache (para ello el usuario apache debe existir en el sistema W’s y en este ejemplo, tendrá contraseña=
apache). Supongamos que la máquina Windows tiene ip=IPW y el nombre del recurso compartido esE. - Verificar que tenemos el cliente samba instalado en la máquina RedHat5. Para ello podemos comprobar, una vez realizado el paso (1), que desde línea de comandos podemos montar la unidad remota, en, por ejemplo
/mnt/miunidadremota(evidentemente, este directorio debe existir en nuestra máquina RH5). Ejecutamos:/bin/mount -t cifs //IPW/E /mnt/miunidadremota -o user=apache,pass=apache,uid=apache,gid=apache ls /mnt/miunidadremota
Una vez ejecutados los dos comandos de arriba deberíamos ver los ficheros del cd. Si no lo vemos, hay algo mal en los puntos (1) y (2). Revísalos.
- Habilitar en
/etc/sudoersque el usuarioapachepueda montar y desmontar la unidad remotaE(Si no sabes qué essudoersomounto para qué se utiliza, googlea man sudo y man moun).Evidentemente, el usuario
apachedebe existir en el sistema RH5. Para comprobar que existe, ejecuta:
more /etc/passwd | grep apache
Y deberías ver algo asi:
apache:x:48:48:Apache:/var/www:/bin/bash
Nota que el usuario apache tiene shell! (/bin/bash, para más señas).Continuamos editando
/etc/sudoers. Lo puedes hacer con el comandovisudo, o directamente editando/etc/sudoers(este último método no lo recomiendo). Una vez editado, añade al final las siguientes líneas:
apache ALL = NOPASSWD: /bin/mount apache ALL = NOPASSWD: /bin/umount apache ALL = /sbin/mount.cifs apache ALL = /sbin/umount.cifs
- A continuación, comprueba si tienes activado SELinux. En mi caso está desactivado. Si sigues todos los pasos restantes y al final no te funciona, chequea
/var/messagespara ver qué está pasando…y seguramente encontrarás que SELinux te está impidiendo realizar el montado de la unidad remota… - Haz un
more /etc/sudores | grep requiretty
comprueba que esa línea está comentada, esto es:
#Defaults requiretty.
Si la tienes descomentada no funcionará. - Crea tu programa en PHP para montar la unidad remota!

En mi caso es algo asi (las líneas 8 y 10 son las que importan):
1 2 3 4 5 6 7 8 9 10 11
include("functions.php"); include("config.php"); echo "Librerias cargadas...<br />"; if (isset($ipCD)){ // es un rec externo... montarlo! echo "Montando unidad remota..."; $mountlike = 'sudo /bin/mount -t cifs //'.$ipCD.'/'.$unidadCD.' '.$rutaEntrada.' -o user='.$userCD.',pass='.$passCD.',uid=apache,gid=apache'; echo $mountlike.'<br />'; exec($mountlike, $out, $retval); }
Esto es todo amigos!
Si consideras que se puede hacer mejor, o ves algún fallo que yo no veo… (dejemos la seguridad al margen
), deja un comentario.

Eres un maquina, llevaba mas de una semana con este problema. Mil garacias.
De nada hombre, para eso estamos