データをパスワード入力などの「getPass」にリダイレクトする方法は?
質問
コマンドを実行するためのPythonスクリプトを執筆しています。これらのコマンドの一部は、ユーザーにパスワードを入力する必要があります。私は彼らのstdinにデータを入力しようとしましたが、それは機能しません、ここでは2つの簡単なpythonプログラムを表しています問題を表します
input.py
import getpass
print raw_input('text1:')
print getpass.getpass('pass1:')
print getpass.getpass('pass2:')
put_data.py
import subprocess
import getpass
def run(cmd, input=None):
stdin=None
if input:
stdin=subprocess.PIPE
p = subprocess.Popen(cmd, shell=True, stdin=stdin)
p.communicate(input)
if p.returncode:
raise Exception('Failed to run command %r' % cmd)
input ="""text1
password1
password2
"""
run('python test.py', input)
そして、これが出力です
[guest@host01 ~]# python put_data.py
text1:text1
pass1:
Pass1フィールドで停止します。問題は次のとおりです。なぜデータをSTDINに配置してデータをパスワードフィールドにフィードできないのですか?パスワードフィールドにデータを書き込むにはどうすればよいですか?
解決
あなたが必要です pexpect そのような場合のモジュール。
Pexpectは、子どものアプリケーションを産み、自動的に制御するためのPythonモジュールです。 PEXpectは、SSH、FTP、PassWD、Telnetなどのインタラクティブアプリケーションを自動化するために使用できます。
他のヒント
このようなものを作るために2つのクラスが必要ではありません。あなたがする必要があるのは、put_data.pyで別の方法を作成することだけです 初期化_()そして、次の行に沿って何かをします:
x = raw_input('text1:')
y = getpass.getpass('pass1:')
z = getpass.getpass('pass2:')
次に、PEXpectを使用して残りを行うことができます。
child = pexpect.spawn(x, timeout=180)
while True:
x = child.expect(["(current)", "new", "changed", pexpect.EOF, pexpect.TIMEOUT])
if x is 0:
child.sendline(y)
time.sleep(1)
if x is 1:
child.sendline(z)
time.sleep(1)
if x is 2:
print "success!"
break
田田!おそらく、そのようなコードで大量のエラーが発生する可能性があります。 Linuxを使用している場合は、提供されたメソッドを常に利用する必要があります。OS.System( "PassWD")を実行しやすく、シェルに残りの世話をさせます。また、可能な限り常にgetPassの使用を避けている場合、それはファンキーな時代遅れの方法であり、道を台無しにする可能性があります。