Cambio de usuario en python

Estoy escribiendo un script simple que reinicia un esclavo hadoop. En el script, tengo que hacer algunos cambios iniciales como usuario root. Después de eso tengo que cambiar al usuario “hadoop” y ejecutar un conjunto de comandos. Estaba usando os.system para ejecutar comandos, pero dudo que funcione bien. Por ejemplo:

uid=pwd.getpwnam('hadoop')[2] os.setuid(uid) os.system('whoami') os.chdir('/home/hadoop/hadoop/') os.system('bin/hadoop-daemon.sh stop tasktracker') 

Una vez más, tengo que ejecutar algunos comandos como root después de esto y otra vez me convierto en usuario “hadoop” y ejecuto:

 os.system('bin/hadoop-daemon.sh stop tasktracker') 

Tengo tres preguntas aquí,

  1. Es os.system el mejor comando que puedo usar para emitir comandos de linux?

  2. Puedo cambiar de usuario root a hadoop con los comandos anteriores, pero no puedo cambiar a usuario root (puedo entender que habrá problemas de seguridad si lo permiten, quiero saber si existe alguna posibilidad de hacerlo). , al menos pasando la contraseña)?

  3. ¿Funciona os.setuid ()? whoami imprime el usuario hadoop pero el proceso “tasktracker” no se detiene al usar esos comandos, pero si ejecuto los mismos comandos manualmente, funciona bien (uso “su hadoop” en lugar de setuid mientras lo bash manualmente).

Gracias por toda tu ayuda.

  • Sethu

usted podría utilizar:

 os.system('sudo -u hadoop bin/hadoop-daemon.sh stop tasktracker') 

o si no tienes sudo, pero tienes su

 os.system('su hadoop -c "bin/hadoop-daemon.sh stop tasktracker"') 

Es una idea mucho mejor usar “su” que cambiar la ID de usuario usando os.setuid ().

¿Por qué?

  • “su” configurará las credenciales de inicio de sesión correctamente, incluida la identificación del grupo y los grupos complementarios
  • “su” también hará otras cosas útiles, como establecer variables de entorno (particularmente si usa su -). Quizás también establezca límites de ulimit de acuerdo con limits.conf.

Este tipo de scripts se puede implementar de forma mucho más limpia con el uso de la biblioteca de estructuras: http://docs.fabfile.org/en/1.3.1/index.html Además, proporciona una interfaz de línea de comandos y capacidades de administración de servidores remotos a través de ssh . Todo el python está disponible para que pueda conectarse a bases de datos, por ejemplo, o importar lo que necesite.

Exactamente la pregunta sobre la ejecución de comandos como otro usuario puede implementarse con sudo comando con usuario arg: http://docs.fabfile.org/en/1.3.1/api/core/operations.html#fabric.operations.sudo

No lo he hecho yo mismo, pero veo varias funciones de sistema operativo que pueden aplicarse. Comienzan aquí: http://docs.python.org/library/os.html#os.setegid

Además, había un hilo en la lista de tutores que abordaba el tema: http://mail.python.org/pipermail/tutor/2002-December/018981.html

El enfoque os.system es limitado porque solo devuelve un código de error. El conjunto de herramientas subprocess.Popen es más flexible.