2011-01-14 1 views
6

Ich versuche, das Setup von SFTP-Zugriff zu automatisieren. Dieses Skript wird als Benutzer mit sudo-Berechtigungen und ohne Kennwort ausgeführt.Wie kann ich ein Benutzerpasswort in Linux aus einem Python-Skript setzen?

kann ich einen Benutzer wie so erstellen:

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

Next ich das Kennwort des Benutzers einstellen müssen, aber ich kann nicht herausfinden, wie. Hier ist, was ich versucht habe.

In meinem Python-Programm hat es keine Wirkung, im interaktiven Interpreter stürzt es nach der ersten Zeile ab.

Was ist der beste Weg, dies zu tun?

Ich benutze Python 2.6 auf Ubuntu lucid.

Antwort

6

Die Dokumentation für communicate sagt, dass Sie stdin=PIPE hinzufügen benötigen, wenn Sie Daten auf der Standardeingabe über die communicate Parameter sind zu senden:

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

Ich schätze dies nur Skeleton-Code ist, aber hier sind noch ein paar andere kleine Bemerkungen, falls sie von nutzen sind:

  • Wenn Sie in der Ausgabe des useradd anderen Befehl als ob sie nicht interessiert sind gescheitert oder nicht, Sie könnten besser mit subprocess.check_call, die eine Ausnahme auslösen, wenn der Befehl nicht Null zurückgibt.
  • Im zweiten Fall sollten Sie prüfen, ob process.returncode 0 nach Ihrem Anruf unter Code communicate('test:password')
+0

Danke für die Kommentare. Der echte Code ist zwar gründlicher, wird aber trotzdem geschätzt. – Jake

1

du vergessen:

stdin=subprocess.PIPE 

Um Daten an den Prozess zu senden, benötigen Sie einen stdin.

So ist die vollständige Erklärung ist:

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

und dann communicate('password') nennen.

7

Versuchen, die, wie Sie Automatisierung

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 Aussagen sind optional erforderlich tun.

1

Unter Ubuntu 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

Ich denke, das Problem ist, dass Sie die Option -S für sudo vergessen.