2011-01-14 20 views
6

Estoy tratando de automatizar la configuración del acceso SFTP. Esta secuencia de comandos se ejecuta como un usuario con permisos sudo y sin contraseña.¿Cómo puedo establecer una contraseña de usuario en Linux desde un script de python?

que puede crear un usuario de esta manera:

>>> import subprocess 
>>> process = subprocess.Popen(['sudo', 'useradd', 'test'], shell=False, stdout=subprocess.PIPE, stderr=subprocess.PIPE) 
>>> process.communicate() 
('', '') 

siguiente que necesita para establecer la contraseña del usuario, pero no puedo encontrar la manera. Esto es lo que he intentado.

>>> process = subprocess.Popen(['sudo', 'chpasswd'], shell=False, stdout=subprocess.PIPE, stderr=subprocess.PIPE) 
>>> process.communicate('test:password') 

En mi programa python no tiene ningún efecto, en el intérprete interactivo se bloquea después de la primera línea.

¿Cuál es la mejor manera de hacerlo?

Estoy ejecutando python 2.6 en Ubuntu lúcido.

Respuesta

6

La documentación para communicate dice que tendrá que añadir stdin=PIPE si va a enviar datos a través de la entrada estándar communicate parámetro:

http://docs.python.org/release/2.6/library/subprocess.html#subprocess.Popen.communicate

aprecio esto es solo código esqueleto, pero aquí son otro par de otros comentarios pequeñas, en caso de que sean de uso:

  • Si usted no está interesado en el resultado del comando useradd distinta si se fallado o no, es mejor que utilices subprocess.check_call, lo que generará una excepción si el comando devuelve un valor distinto de cero.
  • En el segundo caso, se debería comprobar si process.returncode es 0 después de su llamada a communicate('test:password')
+0

Gracias por los comentarios. El código real es de hecho más completo, pero apreciado no obstante. – Jake

1

olvidaras:

stdin=subprocess.PIPE 

Para enviar los datos al proceso, se necesita un stdin.

Así que la declaración completa es:

process = subprocess.Popen(['sudo', 'chpasswd'], stdout=subprocess.PIPE, stdin=subprocess.PIPE, stderr=subprocess.PIPE) 

y luego llamar communicate('password').

7

Try a continuación código que va a hacer como que necesita la automatización

from subprocess import Popen, PIPE, check_call 
check_call(['useradd', 'test']) 
proc=Popen(['passwd', 'test'],stdin=PIPE,stdout=PIPE,stderr=PIPE) 
proc.stdin.write('password\n') 
proc.stdin.write('password') 
proc.stdin.flush() 
stdout,stderr = proc.communicate() 
print stdout 
print stderr 

print declaraciones son opcionales.

1

En Ubuntu, utilice usermod

class SomeClass 
    def userPasswd(self, login, password): 
     encPass = crypt.crypt(password) 
     command = "usermod -p '{0:s}' {1:s}".format(encPass, login) 
     result = os.system(command) 
     if result != 0: 
      logging.error(command) 
     return result 
1

supongo que el problema es que se le olvidó la opción -S sudo.

Cuestiones relacionadas