SSHコマンドを使用するGUIを作成しています。サブプロセスモジュールを使用してsshを呼び出し、SSH_ASKPASS環境変数を設定して、アプリケーションがSSHパスワードを要求するウィンドウをポップアップできるようにしました。 SSH_ASKPASSコマンドを使用してsshにパスワードを読み取らせることはできません。DISPLAY、SSH_ASKPASS、TERM環境変数の設定方法や標準入出力のパイプ設定に関係なく、ターミナルウィンドウで常にプロンプトを表示します。 sshが現在のTTYから切り離されていることを確認して、指定されたプログラムを使用してパスワードを読み取るにはどうすればよいですか?SSH_ASKPASS変数を使用するようにサブプロセスモジュールでsshを呼び出す方法
私のテストコードはでした:
#!/usr/bin/env python
import os
import subprocess
env = dict(os.environ)
env['DISPLAY'] = ':9999' # Fake value (trying in OS X and Windows)
del env['TERM']
env['SSH_ASKPASS'] = '/opt/local/libexec/git-core/git-gui--askpass'
p = subprocess.Popen(['ssh', '-T', '-v', '[email protected]'],
stdin=subprocess.PIPE,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
env=env
)
p.communicate()
SSHは、それを呼び出したサブプロセスであなたにプロンプトを表示するので、 'Popen()'に 'p.stdin 'を使ってパスワードを送信するよう指示します。write() 'を実行するか、まったく単純化して、Paramikoのようなあなたのためにすでに書かれているSSHのやりとりのために何かを使用してください。 – jathanism
答えをありがとう。私はp.stdin.write()とp.communicate()を使ってパスワードを送信しようとしましたが、SSHはまだ実際のTTYを使ってパスワードを読み取っていました...そしてもう一つの問題は、SSHがパスワードを要求すると(これはSSHセッションの後半に出てくる異なる文字列で行うことができます) – gyim
自分でSSHプロセスにパスワードを「書き込む」ことがわかっているので、使用するオプションで自分の答えを更新しました'pexcpet'は、これでうまくいくでしょう。 – abyx