22

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

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

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

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

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

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

4

4 に答える 4

40

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

stdin, stdout, stderr = client.exec_command(command,  get_pty=True)
于 2015-02-03T22:58:57.240 に答える
22

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

#!/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))

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

于 2011-09-30T15:58:29.237 に答える
14

invoke_shellオブジェクトのメソッドが必要だと思います(URLを指定したいのですが、 lag.netSSHClientのparamikoドキュメントはフレームが多く、ドキュメント内の特定の場所の特定のURLを表示しません)-それはあなたにあなたがすることができるなどをあなたに与えます、しかしあなたが求めているものであるように思われる疑似端末(端末タイプと行と列の数で完全です!-)を通してそれをします。Channelexec_command

于 2010-05-26T02:24:46.543 に答える
9

sudoのマンページによると:

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

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

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()
于 2014-08-26T06:49:37.137 に答える