47
def exec_command(self, command, bufsize=-1):
    #print "Executing Command: "+command
    chan = self._transport.open_session()
    chan.exec_command(command)
    stdin = chan.makefile('wb', bufsize)
    stdout = chan.makefile('rb', bufsize)
    stderr = chan.makefile_stderr('rb', bufsize)
    return stdin, stdout, stderr

paramiko でコマンドを実行すると、exec_command を実行すると必ずセッションがリセットされます。sudo または su を実行できるようにしたいのですが、別の exec_command を実行するときにそれらの特権を引き続き使用したいと考えています。もう 1 つの例は、exec_command("cd /") を試行し、次に exec_command を再度実行して、ルート ディレクトリに置くことです。exec_command("cd /; ls -l") のようなことができることは知っていますが、別の関数呼び出しでそれを行う必要があります。

4

8 に答える 8

43

非インタラクティブなユースケース

これは非インタラクティブな例です... を送信cd tmpし、ls次にを送信しますexit

import sys
sys.stderr = open('/dev/null')       # Silence silly warnings from paramiko
import paramiko as pm
sys.stderr = sys.__stderr__
import os

class AllowAllKeys(pm.MissingHostKeyPolicy):
    def missing_host_key(self, client, hostname, key):
        return

HOST = '127.0.0.1'
USER = ''
PASSWORD = ''

client = pm.SSHClient()
client.load_system_host_keys()
client.load_host_keys(os.path.expanduser('~/.ssh/known_hosts'))
client.set_missing_host_key_policy(AllowAllKeys())
client.connect(HOST, username=USER, password=PASSWORD)

channel = client.invoke_shell()
stdin = channel.makefile('wb')
stdout = channel.makefile('rb')

stdin.write('''
cd tmp
ls
exit
''')
print stdout.read()

stdout.close()
stdin.close()
client.close()

インタラクティブなユースケース インタラクティブ
なユースケース がある場合、この回答は役に立ちません...私は個人的にインタラクティブなセッションにpexpectまたはを使用します。exscript

于 2011-06-01T15:41:20.480 に答える
21

文字で区切られたコマンド文字列を作成してみてください\n。それは私のために働いた。為に。例えばssh.exec_command("command_1 \n command_2 \n command_3")

于 2015-07-21T21:48:23.377 に答える
19

厳密に言えば、できません。ssh仕様によると:

セッションは、プログラムのリモート実行です。プログラムは、シェル、アプリケーション、システム コマンド、または何らかの組み込みサブシステムの場合があります。

これは、コマンドが実行されると、セッションが終了することを意味します。1 つのセッションで複数のコマンドを実行することはできません。ただし、できることは、リモート シェル (== 1 つのコマンド) を開始し、stdin などを介してそのシェルと対話することです... (python スクリプトの実行と対話型インタープリターの実行を考えてください)

于 2011-06-01T18:33:07.723 に答える
2

以下の手法を使用して、複数のコマンドを実行できます。セミコロンを使用して Linux コマンドを区切ります。例:

chan.exec_command("date;ls;free -m")
于 2021-01-12T17:45:54.543 に答える