You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Paramiko/Netmiko是否支持退出SSH会话后重连执行命令

问题根因

现有代码无法执行后续指令的原因很明确:

  • 你将exit与后续校验命令写在同一次exec_command的执行块中,会话执行到exit时就会直接终止当前SSH通道,后续写的NEXTCOMMANDS根本不会被投递到服务端执行
  • 如果你的SAVECOMMAND会触发SSH服务重启、网络栈重载这类操作,当前已经建立的SSH连接会直接被服务端重置,哪怕不写exit,原有连接也处于失效状态,无法再传输任何指令。

完全可以通过重新建立SSH会话的方式执行后续校验命令,不要把全流程命令塞在同一次连接里执行即可。

实现步骤

把整个流程拆成三个独立阶段处理:

  1. 第一次建立SSH连接,执行配置修改、保存触发重置的命令,确认命令投递成功后主动关闭第一次连接
  2. 增加等待重试逻辑,轮询检测服务器SSH端口是否恢复可连接状态,避免服务重启过程中直接连接失败
  3. 服务恢复后第二次建立全新SSH连接,执行日志留存所需的校验命令,收集输出完成后关闭连接
参考代码
import paramiko
import time
import socket

HOST = 'hostname'
USER = 'username'
PWD = 'password'
# 服务重启最大等待时长,可根据实际情况调整
MAX_WAIT = 120

def get_ssh_conn():
    """建立SSH连接的通用方法"""
    ssh = paramiko.SSHClient()
    ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    ssh.connect(HOST, username=USER, password=PWD, timeout=10)
    return ssh

# 第一阶段:下发配置、触发重置
ssh1 = get_ssh_conn()
# 注意不要把后续校验命令和exit写在一起,nohup保证SAVECOMMAND不会因为SSH会话退出被中断
stdin, stdout, stderr = ssh1.exec_command("""COMMAND1
COMMAND2
COMMAND3
nohup SAVECOMMAND > /tmp/save.log 2>&1 &
""")
# 等待配置命令执行完成再退出
stdout.channel.recv_exit_status()
ssh1.close()

# 第二阶段:等待服务重启、SSH恢复
start_ts = time.time()
ssh_ready = False
while time.time() - start_ts < MAX_WAIT:
    try:
        # 先测22端口是否通
        with socket.create_connection((HOST, 22), timeout=5):
            # 端口通了再试建立SSH连接
            test_ssh = get_ssh_conn()
            test_ssh.close()
            ssh_ready = True
            break
    except (socket.error, paramiko.SSHException):
        time.sleep(2)

if not ssh_ready:
    raise Exception(f"服务器{HOST}重启后SSH服务等待超时,无法连接")

# 第三阶段:重连执行校验命令
ssh2 = get_ssh_conn()
stdin, stdout, stderr = ssh2.exec_command("""YOUR_CHECK_COMMAND1
YOUR_CHECK_COMMAND2
YOUR_CHECK_COMMAND3
""")
# 读取校验结果做日志留存
print("=== 校验命令输出 ===")
for line in stdout.read().splitlines():
    print(line.decode('utf-8', errors='ignore'))

# 打印执行错误(如果有)
err = stderr.read().decode('utf-8', errors='ignore')
if err:
    print("=== 执行错误 ===")
    print(err)

ssh2.close()
注意事项
  • 给nohup执行的SAVECOMMAND加上日志重定向,避免命令无输出挂起,也方便后续排查配置保存失败的问题
  • 等待SSH恢复的轮询间隔、最大等待时长可以根据你服务器实际重启速度调整,不要刚触发重启就立刻发起重连
  • 如果是批量操作大量服务器,可以把单台服务器的执行逻辑封装成函数,加并发控制避免同时发起太多连接把服务器SSH连接数打满

内容的提问来源于stack exchange,提问作者deltch

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 18:31:04