2011-03-04 18 views
19

Tengo un problema. Estoy escribiendo una pieza de software, que se requiere para realizar una operación que requiere que el usuario esté en modo sudo. ejecutar 'sudo python filename.py' no es una opción, lo que me lleva a mi pregunta. ¿Hay una manera de cambiar a mitad de camino sudo a través de un script en Python, la seguridad no es un problema ya que el usuario va a saber la contraseña sudo debe ejecutar el programa de la siguiente manera para ilustrar el tema del programaCambiar a sudo usuario dentro de una secuencia de comandos python

  1. funcionando como usuario normal
  2. ...... realizar operaciones
  3. usuario introduce la contraseña sudo
  4. usuario cambió a sudo
  5. programa sub que requiera permiso sudo se ejecuta
  6. en el gatillo incluso (fin de programa sub) user se convierte en el usuario normal de nuevo
  7. ...... operaciones que realizan

Mi problema radica en el paso 3, los punteros o marcos que podría sugerir que sería de gran ayuda.

Saludos

Chris

+0

Una solución perfecta, creo, tendría las siguientes cualidades, independientemente de si es posible: 1. No implica reiniciar el script. 2. No implica llamar a un segundo script de Python dentro de un script de Python. 3. Los privilegios de administrador solo se aplican a una parte específica del script (y no al principio, y no necesariamente al final). – Shule

Respuesta

2

Use Tcl and Expect, más subproceso para elevarse usted mismo. Así que básicamente es la siguiente:

sudo.tcl

spawn sudo 
expect { 
    "Password:" { 
     send "password" 
    } 
} 

sudo.py

import subprocess 
subprocess.call(['tclsh', 'sudo.tcl']) 

y luego ejecutar sudo.py.

+0

Obtengo' nombre de comando inválido "spawn" 'cuando ejecuto el script de Python (con todo exactamente como lo tienes aquí) . ¿Qué debería hacer de manera diferente? – Shule

+0

Quizás usar el módulo 'pexpect' de Python y la clase' pexpect.spawnu' sea útil para crear una solución de Python completa. Si sabe cómo usarlo, siéntase libre de editarlo en su respuesta. (No es que necesite una solución completa para Python. Siempre y cuando me funcione, es genial.) – Shule

+0

Necesito una solución de Python para esto. ¿Tienes uno? – answerSeeker

8

No tratar de hacer usted mismo sudo simplemente comprobar si se encuentra y de error si no

class NotSudo(Exception): 
    pass 

if os.getuid() != 0: 
    raise NotSudo("This program is not run as sudo or elevated this it will not work") 
+3

¿No debería ser 'os.geteuid()! = 0'? –

+15

Esta no es una solución muy buena. ¿Qué pasa si solo partes del script requieren root? – Timmmm

+1

@Timmmm Por ejemplo, esto fue hace más de un año. Por otro lado, si una sola parte de la secuencia de comandos requiere sudo, la secuencia de comandos fallará, es mejor que se produzca un error de error. –

0

Puede usar setuid para establecer el UID usuarios. Pero por obvias razones de seguridad solo puede hacer esto si es root (o el programa tiene derechos de root suid). Ambas son probablemente una mala idea.

En este caso necesita derechos de sudo para ejecutar un programa específico. En ese caso simplemente suba a "sudo theprogram" en su lugar.

17

Es mejor ejecutar la menor cantidad de programa posible con privilegios elevados. Puede ejecutar la parte pequeña que necesita más privilegios a través de la función subprocess.call(), p.

import subprocess 
returncode = subprocess.call(["/usr/bin/sudo", "/usr/bin/id"]) 
4

Hace poco resolví este problema al hacer una secuencia de comandos de instalación del sistema. Para cambiar a permisos de superusuario, solía subprocess.call() con 'sudo':

#!/usr/bin/python 

import subprocess 
import shlex 
import getpass 

print "This script was called by: " + getpass.getuser() 

print "Now do something as 'root'..." 
subprocess.call(shlex.split('sudo id -nu')) 

print "Now switch back to the calling user: " + getpass.getuser() 

Tenga en cuenta que es necesario utilizar shlex.split() para hacer su comando utilizable para subprocess.call(). Si desea utilizar la salida de un comando, puede usar subprocess.check_output(). También hay un paquete llamado 'sh' (http://amoffat.github.com/sh/) que puede usar para este propósito.

0

Si puede encapsular solo la funcionalidad necesaria que requiere privilegios elevados en un ejecutable independiente, puede usar el bit de setuid en el programa ejecutable, y llamarlo desde su secuencia de comandos python de nivel de usuario.

De esta manera, solo la actividad en el ejecutable setuid se ejecuta como root, sin embargo, al ejecutar esto NO es necesario sudo, es decir, privilegios de root. Solo crear/modificar el ejecutable setuid requiere sudo.

Existen algunas implicaciones de seguridad, como asegurar que su programa ejecutable setuid desinfecte correctamente cualquier entrada de usuario (por ejemplo, parámetros), para que no pueda engañarse y hacer algo que no debería (problema del diputado confundido).

ref: http://en.wikipedia.org/wiki/Setuid#setuid_on_executables

edición: setuid sólo parece funcionar para ejecutables compilados (binarios), y secuencias de comandos no interpretados, por lo que puede que tenga que utilizar un envoltorio setuid compilado.

-4

¿Está hablando de tener la contraseña de entrada del usuario a la mitad de su ejecución? raw_input() puede tomar una entrada de usuario desde la consola, pero no enmascara la contraseña.

>>>> y = raw_input() 
somehting 
>>> y 
'somehting' 
+0

No. Estamos hablando de permisos, aunque los programas que otorgan permisos tienden a pedir contraseñas (pero ese no es el elemento clave). (Como usar algo 'sudo' a mitad de camino de un programa sin usar un segundo script, o tal.) – Shule

0
import subprocess 
subprocess.check_output("sudo -i -u " + str(username) + " ls -l", shell=True).decode("utf-8").strip() 
+1

Aunque no veo nada incorrecto con su respuesta, es posible que desee centrarse en responder preguntas más recientes; este tiene 5 años –

Cuestiones relacionadas