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

原文由 Takkun 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.4k
2 个回答

非交互式用例

这是一个 非交互式 示例……它发送 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()

交互式用例

如果您有交互式 ssh 用例, paramiko 可以处理它…我个人会使用 scrapli 来驱动交互式 ssh 会话。

列出我能想到的所有交互使用 paramiko 的方法:

我可能错过了一些使用 paramiko 的库,但应该清楚的是 paramiko 被控制 ssh 会话的 python 库广泛使用。

原文由 Mike Pennington 发布,翻译遵循 CC BY-SA 4.0 许可协议

尝试创建一个由 \n 字符分隔的命令字符串。它对我有用。为了。例如 ssh.exec_command("command_1 \n command_2 \n command_3")

原文由 Sandeep 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏