データをパスワード入力などの「getPass」にリダイレクトする方法は?

StackOverflow https://stackoverflow.com/questions/4826732

質問

コマンドを実行するための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の使用を避けている場合、それはファンキーな時代遅れの方法であり、道を台無しにする可能性があります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top