小编典典

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

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”)的操作,但是我需要在单独的函数调用中执行此操作。


阅读 291

收藏
2020-12-20

共1个答案

小编典典

非交互式用例

这是一个 非交互式 示例……它发送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用于交互式会话。

2020-12-20