web-dev-qa-db-ja.com

ParamikoとPseudo-ttyの割り当て

Paramikoを使用してリモートホストに接続し、いくつかのテキストファイル置換を実行しようとしています。

i, o, e = client.exec_command("Perl -p -i -e 's/" + initial + "/" 
                              + replaced + "/g'" + conf);

これらのコマンドの一部はSudoとして実行する必要があり、その結果、次のようになります。

Sudo:申し訳ありませんが、Sudoを実行するにはttyが必要です

-tスイッチとsshを使用して疑似tty割り当てを強制できます。

Paramikoを使用して同じことを行うことは可能ですか?

21
Jon

SSHClientオブジェクトのinvoke_Shellメソッドが必要だと思います(URLを指定したいのですが、 lag.net のparamikoドキュメントはフレームが多くてちょうどドキュメント内の特定のスポットの特定のURLは表示されません)-Channelが表示され、exec_commandなどを実行できますが、疑似的に実行されます-ターミナル(ターミナルタイプと行と列の数を完備!-)これはあなたが求めているもののようです。

14
Alex Martelli

実際、それは非常に簡単です。ただ:

stdin, stdout, stderr = client.exec_command(command,  get_pty=True)
36

次のコードは私のために働きます:

#!/usr/bin/env python
import paramiko

ssh = paramiko.SSHClient()
ssh.set_missing_Host_key_policy(paramiko.AutoAddPolicy())
ssh.connect('localhost',username='root',password='secret')
chan = ssh.get_transport().open_session()
chan.get_pty()
chan.exec_command('tty')
print(chan.recv(1024))

これは、オンラインでいくつかの例を見て組み立てられたばかりです...それが「正しい」方法かどうかはわかりません。

22
David

須藤のマンページによると:

-S(stdin)オプションを使用すると、Sudoは端末デバイスではなく標準入力からパスワードを読み取ります。パスワードの後に​​は改行文字を続ける必要があります。

これはwrite()を使用したファイルオブジェクトであるため、stdinに書き込むことができます。

import paramiko

client = paramiko.client.SSHClient()
client.set_missing_Host_key_policy(paramiko.client.AutoAddPolicy())
client.connect(hostname='localhost', port=22, username='user', password='password')
stdin, stdout, stderr = client.exec_command('Sudo -S aptitude update')
stdin.write('password\n')
stdin.flush()
# print the results
print stdout.read()
client.close()
7
ksaylor11