Python使用Netmiko连接设备时如何指定服务端源接口(socket)?
Netmiko指定源接口(socket)的实现方案
存在可直接使用的服务端指定源接口的方法,Netmiko支持透传自定义套接字对象给底层SSH连接,你可以先创建绑定了指定源接口/源IP的套接字,再传入ConnectHandler即可,具体实现如下:
from netmiko import ConnectHandler import socket # 手动创建绑定指定源IP的套接字 def build_source_socket(dest_ip, dest_port, source_ip): sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 源端口填0表示由操作系统自动分配可用端口 sock.bind((source_ip, 0)) sock.connect((dest_ip, dest_port)) return sock cisco_881 = { 'device_type': 'cisco_ios', 'host': '192.168.2.241', 'username': 'admin', 'password': 'admin', 'secret': 'admin', 'port': 22, # 传入自定义套接字,将192.168.3.2替换为你需要使用的源接口对应IP 'sock': build_source_socket('192.168.2.241', 22, '192.168.3.2') } net_connect = ConnectHandler(**cisco_881) output = net_connect.send_command('show interface') print(output)
注意事项
- 如果你使用的是Linux系统,需要直接绑定接口名而非源IP,可以通过socket的
SO_BINDTODEVICE选项实现,修改套接字创建逻辑即可:
import fcntl import socket def build_socket_bind_iface(dest_ip, dest_port, iface_name): sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # SO_BINDTODEVICE参数值为0x8913,仅Linux内核支持 fcntl.ioctl(sock.fileno(), 0x8913, iface_name.encode().ljust(16, b'\x00')) sock.connect((dest_ip, dest_port)) return sock
- 该功能需要Netmiko版本≥2.4.0,版本过低时需要先升级:
pip install --upgrade netmiko - 绑定的源IP必须是当前服务器上对应接口已配置的有效IP,否则会抛出绑定失败异常。
内容的提问来源于stack exchange,提问作者joseph rob
相关产品推荐
相关产品推荐

