如何在Paramiko的单个会话中执行多个命令? (python)

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时仍然具有这些权限。 另一个例子是尝试exec_command(“cd /”),然后再次运行exec_command并将其放在根目录中。 我知道你可以做一些像exec_command(“cd /; ls -l”),但我需要在单独的函数调用。

非交互式用例

这是一个非交互式的例子…它发送cd tmpls然后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() 

交互式用例
如果你有一个互动的用例,这个答案不会有帮助…我个人会使用pexpectexscript进行交互式会话。

严格地说,你不能。 根据ssh规范:

会话是程序的远程执行。 该程序可能是一个shell,一个应用程序,一个系统命令或一些内置的子系统。

这意味着,一旦命令执行完毕,会话就完成了。 您不能在一个会话中执行多个命令。 你可以做什么,但是,启动一个远程shell(==一个命令),并通过stdin等与该shell交互…(想想执行一个python脚本与运行交互式解释器)

尝试创build由\n字符分隔的命令string。 它为我工作。 对于。 例如ssh.exec_command("command_1 \n command_2 \n command_3")

 cmd = 'ls /home/dir' self.ssh_stdin, self.ssh_stdout, self.ssh_stderr = self.ssh.exec_command(cmd) print self.ssh_stdout.read() cmd2 = 'cat /home/dir/test.log' self.ssh_stdin2, self.ssh_stdout2, self.ssh_stderr2 = self.ssh.exec_command(cmd2) print self.ssh_stdout2.read()