2011-03-07 46 views
16

Estoy haciendo un proyecto en Linux a nivel de sistema en Python. Así que, quiero saber que si estoy ejecutando mi código como un usuario normal y si estoy accediendo a los archivos del sistema, entonces debe tener permisos de root para ello, , entonces ¿cómo puedo solicitar la contraseña de root y ejecutar código adicional como superusuario. Quiero saber que, cómo ejecutar el script de Python como superusuario con la solicitud de contraseña para ello ...autenticación en el script de Python para ejecutar como root

Cualquier ayuda será apreciada. gracias de antemano ..

Respuesta

26

La otra cosa que puede hacer se tiene la secuencia de comandos automáticamente invocan sudo si no se ejecuta como root:

import os 
import sys 

euid = os.geteuid() 
if euid != 0: 
    print "Script not started as root. Running sudo.." 
    args = ['sudo', sys.executable] + sys.argv + [os.environ] 
    # the next line replaces the currently-running process with the sudo 
    os.execlpe('sudo', *args) 

print 'Running. Your euid is', euid 

salida:

Script not started as root. Running sudo.. 
[sudo] password for bob: 
Running. Your euid is 0 

Use sudo -k para probar, para borrar su sello de fecha y hora de sudo así que la próxima vez que se ejecute el script requerirá la contraseña nuevamente.

+0

Si la aplicación tiene una GUI (supongo que tanto, ya que la pregunta está etiquetada con pygtk), gksudo probablemente debería usarse en su lugar. La mejor opción, sin embargo, para los SO que lo admitan, sería usar [PolicyKit] (http://en.wikipedia.org/wiki/PolicyKit). –

+1

Prefiero la excepción sin formato a esta táctica de elevación. –

+1

Creo que este tipo de técnica está bien en el contexto correcto. Si está creando un instalador basado en GUI que requiere permisos de raíz para realizar ciertas operaciones, puede iniciar el diálogo apropiado para informar al usuario y obtener la raíz. Tomemos el sistema operativo Mac OS, por ejemplo, donde la instalación del software está principalmente guiada por la GUI y la mayoría de los usuarios probablemente desconozcan que la CLI existe. Plantear una excepción en ese contexto no es una opción. – samplebias

5
import os 
euid = os.geteuid() 
if euid != 0: 
    raise EnvironmentError, "need to be root" 
    exit() 

Esto no le pedirá en el medio de la escritura, sino que más bien obligar al usuario a volver a ejecutar con sudo o como root

+1

Prefiero esta respuesta más. –

+0

Bien, lo tengo, pero ¿qué ocurre si quiero autenticar al usuario para que lo ejecute como superusuario? No quiero darle privilegios de SU sin darle una contraseña. Está bien, puedo solicitar la contraseña usando el código anterior, pero cómo ¿Puedo identificar que la contraseña dada es correcta y, si es correcta, cómo puedo ejecutar mi código adicional como SU? Tenga en cuenta que, quiero hacer eso en tiempo de ejecución para el usuario normal. –

+0

deje sudo/su maneje gettign la contraseña correcta, verifique si el EUID es 0, entonces sabrá que funcionó. @samplebias mostró cómo hacerlo mientras continúa el mismo programa, mi respuesta obliga al usuario a volver a invocar el script como root – loosecannon

Cuestiones relacionadas