Pregunta

¿Es posible pedir una contraseña de root sin almacenarla en mi memoria de script y ejecutar algunos de los comandos os. * como root?

Mi script

  1. escanea algunas carpetas y archivos para verificar si puede hacer el trabajo
  2. realiza algunos cambios en / etc / ...
  3. crea una carpeta y archivos que deberían ser propiedad del usuario que ejecutó el script

(1) se puede hacer como usuario normal. Puedo hacer (2) reemplazando el script, pero luego la carpeta y los archivos en (3) serán root.

El problema es que uso muchos os.makedirs, os.symlink, etc., lo que me impide hacer que sea ejecutable por un usuario normal.

Tanques 2 todos para sugerencias

La solución hasta ahora es:

# do all in sudo
os.chown(folder, int(os.getenv('SUDO_UID')), int(os.getenv('SUDO_GID')))

gracias a gnibbler por la pista.

¿Fue útil?

Solución 5

gnibbler dio una pista en os.chown . El problema era saber la identificación del usuario detrás de sudo. Esa información se almacena en las variables de entorno SUDO_ * :

os.chown, (some_path, int(os.getenv('SUDO_UID')), int(os.getenv('SUDO_GID')))

Dividir el código en 3 archivos podría ser una solución, pero el código ya está mezclado, por lo que no es adecuado.

Otros consejos

Tal vez pueda poner (2) en una secuencia de comandos separada, decir script2.py , y en la secuencia de comandos principal llame a sudo script2.py con un popen ?

De esta manera solo (2) se ejecutará como root.

yourscript.py :

run_part_1()
subprocess.call(['sudo', sys.executable, 'part2.py'])
run_part_3()

part2.py :

run_part_2()

¿Consideraría usar Linux PAM ? Es posible que desee echar un vistazo a Guía del desarrollador de aplicaciones Linux-PAM y API de Python para PAM

Debe ejecutar su script como root y hacer los cambios adecuados a los permisos para (3) usando os.chmod y os.chown.

Le sería posible ejecutar otro script con derechos de root a través de sudo, pero eso también requeriría almacenar la contraseña de su usuario en el script para pasar a sudo, lo cual es una idea terrible desde el punto de vista de la seguridad.

Por lo tanto, su problema es obtener los permisos correctos en algunos archivos / carpetas. Primero, ingrese o codifique el UID / nombre de usuario de su usuario habitual. Luego use os.chown para cambiar el propietario y os.chmod para cambiar los permisos. También hay métodos alternativos de chown / chmod en el paquete del sistema operativo que debe consultar: http: // docs .python.org / library / os.html

Una nota final: no tiene que preocuparse por los permisos de los enlaces simbólicos. Tienen los permisos de lo que señalan.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top