带有 Paramiko 的嵌套 SSH 退出 while 循环

Posted

技术标签:

【中文标题】带有 Paramiko 的嵌套 SSH 退出 while 循环【英文标题】:Nested SSH with Paramiko exit while loop 【发布时间】:2020-04-27 07:36:33 【问题描述】:

我正在尝试使用 Paramiko 创建一个解决方案,该解决方案允许在输出中获取匹配标准的第一行。我添加了 while 循环以等待输出可用(有时命令将在一小时内运行更多)。 目前我有:

    连接跳转主机 调用 shell 和 ssh 到第二台主机 运行命令 等待(使用 while 循环)所需的输出可用。 另存为字符串。

但是在需要的输出可用后,我在中断 while 循环时遇到了问题。

这是我的代码。

import paramiko
from time import sleep

ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect('jumphost', username='User', password='Passw')
sleep(2)
channel = ssh.invoke_shell()
channel.send('ssh secondHost\n')
sleep(2)
channel.send('Command1\n')
#sleep(2)
buff=''

while channel.recv_ready():
    while not buff.endswith('$ '):
        resp = channel.recv(9999)
        for line in resp.split('\n'):
            if line.startswith('Line1'): 
               print(line)
               buff+=line
               break
    break
print 'buff', buff
ssh.close()

【问题讨论】:

【参考方案1】:

SSHClient.invoke_shell 用于实现交互式终端会话(例如,如果您正在实现自己的 SSH 终端客户端),而不是用于自动执行命令。终端是一个带有输入和输出的黑盒子。它没有任何 API 来执行命令并等待它完成。


使用SSHClient.exec_command 执行命令并使用Channel.recv_exit_statusChannel.exit_status_ready 等待它完成。

见Wait until task is completed on Remote Machine through Python。


当您在命令内执行命令时(ssh 内的Command1),您需要将Command1 发送到ssh 输入。

见Execute (sub)commands in secondary shell/command on SSH server in Python Paramiko。

【讨论】:

以上是关于带有 Paramiko 的嵌套 SSH 退出 while 循环的主要内容,如果未能解决你的问题,请参考以下文章

使用 Paramiko 和 RSA 密钥文件的嵌套 SSH

带有 SFTP 的 Paramiko SSH 客户端

python登陆ssh脚本无法完全退出

SSH与Python模块paramiko

如何在 paramiko 建立的 ssh 连接中将文件传输到 ssh 服务器?

Python paramiko模块(实现ssh)