使用 Paramiko 实现 SSH 远程连接和命令执行
创作时间:
作者:
@小白创作中心
使用 Paramiko 实现 SSH 远程连接和命令执行
引用
CSDN
1.
https://blog.csdn.net/weixin_53742691/article/details/142602926
在现代网络管理中,远程管理设备变得越来越重要。本文将详细介绍如何使用 Python 的 Paramiko 库通过 SSH 连接到交换机,并执行命令以获取其状态。我们将分析代码的每个部分,以及使用该代码的实际场景。
一、代码概述
我们编写的代码主要实现了以下功能:
- 通过 SSH 连接到网络设备(如交换机)。
- 发送命令并获取设备的响应。
- 将设备状态记录到日志中。
代码结构
代码由几个主要部分组成:
- 导入模块:
import paramiko
import time
import logging
paramiko
:用于实现 SSH 连接。time
:用于控制延迟和超时。logging
:用于记录日志,便于后续审查。
- 日志设置:
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
这里我们设置了日志级别和格式,使得日志输出更易于阅读和分析。
- 发送命令的函数:
def send_command(remote_conn, command, timeout=2):
该函数的主要任务是向远程设备发送命令并接收其输出。它通过循环检查输出是否准备好,并在必要时实现超时机制,以避免长时间等待。
- 获取交换机状态的函数:
def get_switch_status(ip, username, password):
该函数通过提供的 IP 地址、用户名和密码连接到交换机,并发送命令以获取交换机版本信息。连接失败时会记录错误日志。
- 交换机列表和批量检查:
switches = [("192.168.249.100", "root", "888888")]
在这个例子中,我们只连接了一个交换机,但可以轻松扩展为多个设备。
二、代码分析
1. 连接和会话
通过 paramiko.SSHClient
创建 SSH 客户端并连接设备。使用 invoke_shell()
方法获取一个交互式会话,允许我们发送命令并接收输出。
2. 发送命令
send_command
函数中使用 remote_conn.send(command + "\n")
发送命令。接下来,通过循环检查 recv_ready()
方法来获取命令输出。
3. 超时控制
为了避免在接收命令输出时陷入无限等待,我们实现了一个简单的超时机制,确保程序在指定时间内完成。
4. 错误处理
通过 try-except-finally
块处理可能的异常,确保即使发生错误也能正常关闭 SSH 连接并记录日志。
三、使用场景
这种 SSH 远程管理的方案适合于多种场景,例如:
- 网络设备监控:在大型网络环境中,管理员需要定期检查设备状态。使用该脚本可以轻松获取交换机的版本信息,确保设备正常运行。
- 自动化运维:在日常运维中,管理员可以将此脚本集成到更复杂的自动化工作流中,实现设备配置、状态检查等操作的自动化。
- 故障排除:当网络出现问题时,快速获取设备状态可以帮助管理员迅速定位问题源。
四、完整代码
以下是完整的代码实现:
# -*- coding: utf-8 -*-
import paramiko
import time
import logging
# 设置日志
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
def send_command(remote_conn, command, timeout=2):
"""发送命令并接收响应"""
remote_conn.send(command + "\n")
time.sleep(1) # 等待命令执行
output = ""
# 可能需要多次接收来确保获取完整的输出
while True:
if remote_conn.recv_ready():
data = remote_conn.recv(65535).decode('utf-8')
if not data:
break
output += data
else:
# 设置超时以避免无限等待
time.sleep(0.1)
timeout -= 0.1
if timeout <= 0:
break
return output
def get_switch_status(ip, username, password):
client = paramiko.SSHClient()
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
try:
client.connect(ip, username=username, password=password, look_for_keys=False, allow_agent=False, timeout=10)
remote_conn = client.invoke_shell()
time.sleep(1) # 等待会话稳定
# 发送命令并接收输出
output = send_command(remote_conn, "display version")
# 打印输出
logging.info(f"====== {ip} ======")
logging.info(output)
logging.info("===================")
except Exception as e:
logging.error(f"Failed to connect to {ip}: {str(e)}")
finally:
client.close()
# 交换机列表
switches = [
("192.168.249.100", "root", "888888")
]
# 批量检查交换机状态
for ip, username, password in switches:
get_switch_status(ip, username, password)
五、总结
本文介绍了如何使用 Python 的 Paramiko 库通过 SSH 远程连接和管理网络设备。代码实现简单高效,适用于多种网络管理场景。希望这篇博客能帮助你更好地理解如何使用 Python 进行网络设备管理。
热门推荐
北柱楼饭庄的历史变迁及历史上老济南著名的鲁菜馆一览
《剑来》世界观深度解析:四大天下势力格局与运行机制
1~10成语大全四个字 意思是什么
四台铯原子钟环球飞行验证了相对论,如今的GPS是最直接应用!
如何在苹果双卡设备上停止某张SIM卡的数据流量?
宫廷之外的绝代风华:揭秘宋徽宗与李师师的传奇情缘
四种经典辣卤配方及制作过程详解
轮胎扎钉后还能跑多远?要不要拔?90%车主都不知道!
腰椎间盘突出运动康复指导 | 运动即良药
从批评与攻击中成长:如何将负面情绪转化为自我提升的动力
那些“少儿不宜”的书,该不该放任孩子看?
《无所畏惧2》罗英子领证新婚,夏舒郝磊幸福美满,而邱华最凄惨
王阳明奏疏“边务八策”
泉州两日游攻略:文化古迹与海丝美食的完美邂逅
专科与本科教育的区别及选择指南:适合你的发展路径是什么?
项目时间管理的六大过程详解
如何生动描写演唱会现场气氛?从人群、音乐到灯光的全方位解析
人工智能的训练数据正在枯竭,合成数据引发巨大争议
小巨角河战役:卡斯特将军的覆灭与疯马的传奇
什么是法律合规性
鱼油与卵磷脂如何搭配食用
想游黄山但不想走路?黄山索道攻略帮您解决!
最全全屋装修开关插座布局图,49个点位个个实用
王宝强:时代中的老实人,一位战士,不可思议。
小儿腹泻的全面护理:从饮食到肠道健康
拔了智齿后多久可以在拔牙的那一侧进食?了解恢复期间的饮食注意事项
水肿的中医分型及症状
大型船舶发电机保护装置应具备的功能、作用
荨麻疹自己可以痊愈吗
朱孝远:哥白尼的天文学革命,如何拉开了现代科学发展的序幕?