47

paramiko を介して対話型コマンドを実行しようとしています。cmd を実行するとパスワードの入力が求められますが、paramiko の exec_command でパスワードを入力する方法がわかりません。実行がハングします。cmd の実行でインタラクティブな入力が必要な場合に、端末に値を送信する方法はありますか?

ssh = paramiko.SSHClient()
ssh.connect(server, username=username, password=password)
ssh_stdin, ssh_stdout, ssh_stderr = ssh.exec_command("psql -U factory -d factory -f /tmp/data.sql")

これに対処する方法を知っている人はいますか?ありがとうございました。

4

7 に答える 7

32

完全な paramiko ディストリビューションには、多くの優れたデモが付属しています。

demos サブディレクトリには、demo.py完全interactive.pyな対話型 TTY の例がありますが、これはおそらくあなたの状況では過剰です。

上記の例ssh_stdinでは、標準の Python ファイル オブジェクトのように機能するssh_stdin.writeため、チャネルがまだ開いている限り機能するはずです。

標準入力に書き込む必要はありませんでしたが、コマンドが終了するとすぐにチャネルが閉じられることがドキュメントで示唆されているため、標準的なstdin.write方法を使用してパスワードを送信してもおそらく機能しません。チャネル自体には、より詳細な制御を可能にする低レベルの paramiko コマンドがあります。詳細については、SSHClient.exec_commandメソッドがどのように実装されているかを確認してください。

于 2008-12-17T07:12:19.363 に答える
12

Paramiko のフォークであるsshを使用してインタラクティブな ssh セッションを作成しようとすると、同じ問題が発生しました。

私は掘り下げて、この記事を見つけました:

更新されたリンク(リンクが 404 を生成する前の最後のバージョン): http://web.archive.org/web/20170912043432/http://jessenoller.com/2009/02/05/ssh-programming-with-paramiko-completely -違う/

例を続けるには、次のことができます

ssh_stdin, ssh_stdout, ssh_stderr = ssh.exec_command("psql -U factory -d factory -f /tmp/data.sql")
ssh_stdin.write('password\n')
ssh_stdin.flush()
output = ssh_stdout.read()

この記事では、exec_command に関する完全にインタラクティブなシェルについて詳しく説明しています。これは、ソースの例よりもはるかに使いやすいことがわかりました。

元のリンク: http://jessenoller.com/2009/02/05/ssh-programming-with-paramiko-completely-different/

于 2012-09-14T19:58:35.053 に答える
5

両方の世界 (expect と ssh ラッパー) を最大限に活用するには、Pexpect が必要です。

于 2010-06-22T18:51:33.310 に答える
3

私はparamikoに精通していませんが、これはうまくいくかもしれません:

ssh_stdin.write('input value')
ssh_stdin.flush()

標準入力に関する情報:

http://docs.python.org/library/sys.html?highlight=stdin#sys.stdin

于 2008-12-17T05:44:53.377 に答える