Paramikoを使用してリモートホストに接続し、いくつかのテキストファイル置換を実行しようとしています。
i, o, e = client.exec_command("Perl -p -i -e 's/" + initial + "/"
+ replaced + "/g'" + conf);
これらのコマンドの一部はSudoとして実行する必要があり、その結果、次のようになります。
Sudo:申し訳ありませんが、Sudoを実行するにはttyが必要です
-tスイッチとsshを使用して疑似tty割り当てを強制できます。
Paramikoを使用して同じことを行うことは可能ですか?
SSHClient
オブジェクトのinvoke_Shell
メソッドが必要だと思います(URLを指定したいのですが、 lag.net のparamikoドキュメントはフレームが多くてちょうどドキュメント内の特定のスポットの特定のURLは表示されません)-Channel
が表示され、exec_command
などを実行できますが、疑似的に実行されます-ターミナル(ターミナルタイプと行と列の数を完備!-)これはあなたが求めているもののようです。
実際、それは非常に簡単です。ただ:
stdin, stdout, stderr = client.exec_command(command, get_pty=True)
次のコードは私のために働きます:
#!/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))
これは、オンラインでいくつかの例を見て組み立てられたばかりです...それが「正しい」方法かどうかはわかりません。
須藤のマンページによると:
-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()