2011-01-14 9 views
6

Sto tentando di automatizzare l'impostazione dell'accesso SFTP. Questo script è in esecuzione come utente con autorizzazioni sudo e nessuna password.Come posso impostare una password utente in linux da uno script python?

posso creare un utente in questo modo:

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

successivo ho bisogno di impostare la password dell'utente, ma non riesco a capire come. Ecco cosa ho provato.

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

Nel mio programma python non ha alcun effetto, nell'interprete interattivo si blocca dopo la prima riga.

Qual è il modo migliore per farlo?

Sto eseguendo Python 2.6 su Ubuntu lucid.

risposta

6

La documentazione per communicate dice che è necessario aggiungere stdin=PIPE se si sta inviando dati a standard input attraverso il parametro communicate:

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

Apprezzo questo è il codice solo scheletro, ma qui sono un altro paio di altri piccoli commenti, nel caso in cui essi sono di uso:

  • Se non siete interessati al risultato del comando useradd diverso da quello che si tratti fallito o no, potrebbe essere meglio usare subprocess.check_call che genererà un'eccezione se il comando restituisce un valore diverso da zero.
  • Nel secondo caso, si dovrebbe verificare se process.returncode è 0 dopo la vostra chiamata a communicate('test:password')
+0

Grazie per i commenti. Il codice reale è in realtà più completo, ma apprezzato non meno. – Jake

1

avete dimenticato questo:

stdin=subprocess.PIPE 

per inviare i dati al processo, è necessario un stdin.

Quindi la dichiarazione completa è:

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

e quindi chiamare communicate('password').

7

Prova sottostante Codice che farà come voi ha richiesto l'automazione

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 dichiarazioni sono opzionali.

1

Su Ubuntu, utilizzare 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

Credo che il problema è che si è dimenticato l'opzione -S per sudo.

Problemi correlati