Pregunta

Necesito una manera de ejecutar el módulo os.system () tan diferentes UID. Se tendría que comportarse similar al siguiente código BASH (tenga en cuenta estos no son los comandos exactos Estoy ejecutando):

su user1
ls ~
mv file1
su user2
ls ~
mv file1

La plataforma de destino es GNU Linux genérico.

Por supuesto que podría simplemente pasar estos al módulo os.system, pero la forma de enviar la contraseña? Por supuesto que podría ejecutar el script como root, pero eso es descuidado e inseguro.

Preferiblemente me gustaría ver con sin requerir ninguna contraseña para poder estar en texto sin formato.

¿Fue útil?

Solución

La función que está buscando se llama os.seteuid. Me temo que probablemente no va a escapar de la ejecución de la secuencia de comandos como root, en cualquier caso, pero creo que se puede utilizar el marco capabilities(7) a 'valla en' la ejecución de un poco, de modo que pueda cambiar los usuarios - pero no lo hacen cualquiera de las otras cosas que el superusuario puede.

Como alternativa, podría ser capaz de hacer esto con PAM. Pero, en general, no hay manera 'ordenada' para hacer esto, y David Cournapeau tiene toda la razón de que es tradicional para las secuencias de comandos de administración para ejecutar con privilegios.

Otros consejos

Creo que no es trivial: se puede hacer eso con una concha, ya que cada comando se lanzó a su propio proceso, que tiene su propia identificación. Pero con pitón, todo va a tener el identificador de usuario del proceso de pitón interpretado (por supuesto, suponiendo que no ejecuta subprocesos utilizando el módulo de subproceso y co). No sé una manera de cambiar el usuario de un proceso - no sé si eso es posible - incluso si lo fuera, tendría al menos necesitará privilegios de administrador

.

¿Qué está tratando de hacer exactamente? Esto no suena como lo que hay que hacer para el propósito de administración, por ejemplo. En general, las secuencias de comandos de administración se ejecutan en un usuario privilegiado - porque nadie sabe la contraseña de usuario 2, a excepción de usuario 2 (en teoría). Al ser la raíz significa Do usuario siempre funciona para un usuario 'normal', sin solicitar la contraseña.

sudo tal vez puede ayudar aquí, de lo contrario debe ser root para ejecutar os.setuid

Alternativamente, si usted quiere tener la diversión que usted puede utilizar para hacer cosas pexpect algo parecido a esto, se puede mejorar con el presente

p = pexpect.spawn("su guest")
p.logfile = sys.stdout 
p.expect('Password:')
p.sendline("guest")

En algún lugar a lo largo de la línea, algún proceso o de otro tipo se van a necesitar un UID efectivo de 0 (raíz), porque sólo un proceso de este tipo puede establecer el UID efectivo a otro UID arbitraria.

En el shell, el comando su es un programa SUID root; es apropiadamente privilegiada (POSIX jerga) y puede fijar el UID real y efectiva. Del mismo modo, el comando sudo puede hacer el mismo trabajo. Con sudo, también puede configurar los comandos y UID están permitidos. La diferencia fundamental es que su requiere la contraseña del usuario de destino para poder entrar en; sudo requiere la contraseña del usuario que ejecuta la misma.

Hay, por supuesto, la cuestión de si un usuario debe conocer las contraseñas de otros usuarios. En general, ningún usuario debe conocer la contraseña de otro usuario.

Los cambios de secuencias de comandos UID es duro. Que puede hacer:

su altuser -c "commands to execute as altuser"
sudo -u altuser commands to execute as altuser

Sin embargo, su demandará una contraseña desde el terminal de control (y fallará si no hay un terminal de control). Si utiliza sudo, puede cachear credenciales (o puede ser configurado para hacerlo), de modo que sólo se les pidió una vez para una contraseña -., Pero se le pedirá la primera vez al igual que lo hace su

El trabajo en torno a la moción es difícil. Puede utilizar las herramientas paralela a expect que manejan pseudo-ttys para usted. Sin embargo, se enfrentan a continuación, al almacenamiento de contraseñas en secuencias de comandos (no es una buena idea) o de alguna manera esconder fuera de la vista.


La herramienta que utilizo para el trabajo es uno que escribí, llamado asroot. Me permite controlar con precisión el UID y GID atributos que el proceso hijo debe tener. Pero está diseñado para permitir que sólo yo la use - es decir, en tiempo de compilación, se especifica el nombre de usuario autorizado (por supuesto, que puede ser cambiado). Sin embargo, puedo hacer cosas como:

asroot -u someone -g theirgrp -C -A othergrp -m 022 -- somecmd arg1 ...

Esto establece el UID real y efectiva a 'alguien', establece el grupo primario a 'theirgrp', elimina todos los grupos auxiliares, y añade 'othergrp' (lo que el proceso pertenece a sólo dos grupos) y establece la máscara de usuario a 0222 ; A continuación, ejecuta 'somecmd' con los argumentos dados.

Para un usuario específico que necesita un acceso limitado (o no tan limitado) a otras cuentas de usuario, esto funciona bien. Como una solución general, no es tan caliente; sudo es mejor en muchos aspectos, pero todavía requiere una contraseña (que asroot no lo hace).

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