Usando sudo con script Python
Estoy intentando escribir un pequeño script para montar una carpeta compartida de VirtualBox cada vez que ejecuto el script. Quiero hacerlo con Python, porque estoy tratando de aprenderlo para crear secuencias de comandos.
El problema es que necesito privilegios para iniciar el comando de montaje. Podría ejecutar el script como sudo, pero prefiero que lo haga solo.
Ya sé que no es seguro escribir tu contraseña en un archivo .py, pero estamos hablando de una máquina virtual que no es crítica en absoluto: solo quiero hacer clic en el script .py y hacerlo funcionar.
Este es mi intento:
#!/usr/bin/env python
import subprocess
sudoPassword = 'mypass'
command = 'mount -t vboxsf myfolder /home/myuser/myfolder'
subprocess.Popen('sudo -S' , shell=True,stdout=subprocess.PIPE)
subprocess.Popen(sudoPassword , shell=True,stdout=subprocess.PIPE)
subprocess.Popen(command , shell=True,stdout=subprocess.PIPE)
Mi versión de Python es 2.6
Muchas respuestas se centran en cómo hacer que su solución funcione, mientras que muy pocas sugieren que su solución es un enfoque muy malo . Si realmente quieres "practicar para aprender", ¿por qué no practicar usando buenas soluciones? ¡Codificar su contraseña es aprender el enfoque equivocado !
Si lo que realmente desea es una contraseña sin contraseña mount
para ese volumen, ¡tal vez sudo
no sea necesaria en absoluto ! ¿Puedo entonces sugerir otros enfoques?
Úselo
/etc/fstab
como sugiere Mensi . Utilice opcionesuser
ynoauto
permita que los usuarios habituales monten ese volumen.Úselo
Polkit
para acciones sin contraseña: configure un.policy
archivo para su secuencia de comandos<allow_any>yes</allow_any>
y suéltelo en/usr/share/polkit-1/actions
Edite
/etc/sudoers
para permitir que su usuario usesudo
sin escribir su contraseña. Como sugirió @Anders, puede restringir dicho uso a comandos específicos, evitando así privilegios ilimitados de root sin contraseña en su cuenta. Consulte esta respuesta para obtener más detalles sobre/etc/sudoers
.
Todo lo anterior permite privilegios de root sin contraseña, ninguno requiere que usted codifique su contraseña. Elija cualquier enfoque y puedo explicarlo con más detalle.
En cuanto a por qué es una muy mala idea codificar contraseñas, aquí hay algunos buenos enlaces para leer más:
- Por qué no debería codificar sus contraseñas al programar
- Cómo mantener secretos en secreto (alternativas a la codificación de contraseñas)
- ¿Qué es más seguro? ¿Codificar credenciales o almacenarlas en una base de datos?
- Uso de credenciales codificadas, un error de programación peligroso: CWE
- Las contraseñas codificadas siguen siendo una falla de seguridad clave
sudoPassword = 'mypass'
command = 'mount -t vboxsf myfolder /home/myuser/myfolder'
p = os.system('echo %s|sudo -S %s' % (sudoPassword, command))
Pruebe esto y avíseme si funciona. :-)
Y éste:
os.popen("sudo -S %s"%(command), 'w').write('mypass')