2011-01-14 15 views
6

私はSFTPアクセスの設定を自動化しようとしています。このスクリプトはsudo権限を持ちパスワードなしのユーザーとして実行されています。Pythonスクリプトからlinuxでユーザーのパスワードを設定するにはどうしたらいいですか?

私はそうのようなユーザを作成することができます

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

次へ]を、私は、ユーザーのパスワードを設定する必要がありますが、私はどのように把握することはできません。ここで私が試したことがあります。

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

私のPythonプログラムでは効果がありません。インタラクティブなインタプリタでは、最初の行の後にロックされます。

これを行うにはどうすればよいですか?

私はUbuntu lucidでPython 2.6を実行しています。

答えて

6

communicateのドキュメントは、あなたがcommunicateパラメータを経由して、標準入力にデータを送信している場合stdin=PIPEを追加する必要がありますと言っている:

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

私はここで、これは単なるスケルトンコードです感謝しますが、

  • あなたがそれかどうか以外のuseraddコマンドの出力に興味がない場合は、次の場合には、使用のものであり、他の小さなコメントの別のカップルです失敗したかどうかを確認するには、subprocess.check_callを使用するほうが良いでしょう。コマンドが0以外の値を返すと、例外が発生します。第2のケースで
  • 、あなたはprocess.returncodeあなたが

    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文はオプションである自動化を必要に応じて行いますコードの下communicate('test:password')

+0

コメントありがとうございます。実際のコードは実際より徹底していますが、それほど重要ではありません。 – Jake

1

あなたがこの忘れてしまった:プロセスにデータを送信するために

stdin=subprocess.PIPE 

を、あなたはstdinを必要としています。

だから、完全な声明は次のようになります。その後、

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

communicate('password')を呼び出します。

7

しようとするあなたの呼び出しの後に0であるかどうかを確認する必要があります。 Ubuntuで

1

、私は問題はあなたがsudoのための-Sオプションを忘れてしまったということだと思い

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

をusermodを使用しています。

関連する問題