6

SFTP アクセスのセットアップを自動化しようとしています。このスクリプトは、sudo 権限を持ち、パスワードを持たないユーザーとして実行されています。

次のようにユーザーを作成できます。

>>> 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を実行しています。

4

5 に答える 5

8

自動化が必要な場合に実行される以下のコードを試してください

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ステートメントはオプションです。

于 2012-12-04T06:31:08.903 に答える
6

のドキュメントには、パラメーターを介して標準入力にデータを送信する場合communicateに追加する必要があると書かれています。stdin=PIPEcommunicate

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

これは単なるスケルトン コードであることを理解していますが、役に立つ場合に備えて、他のいくつかの小さなコメントを次に示します。

  • useraddコマンドが失敗したかどうか以外の出力に関心がないsubprocess.check_call場合は、コマンドがゼロ以外を返した場合に例外を発生させる which を使用する方がよい場合があります。
  • 2 番目のケースではprocess.returncode、呼び出し後に が 0かどうかを確認する必要があります。communicate('test:password')
于 2011-01-14T06:32:38.820 に答える
1

あなたはこれを忘れました:

stdin=subprocess.PIPE

プロセスにデータを送信するには、stdin.

したがって、完全なステートメントは次のとおりです。

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

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

于 2011-01-14T06:32:17.173 に答える