赞
踩
通过云来连接本地主机和eNSP中的设备,保证双方能互相通信。IP地址规划入图中所示,现在通过python连接到SW1、SW2、SW3上做配置修改。
版本:python3.9
在SW1上配置了telnet,现在通过telnetlib模块连接到SW1并创建一个Loopback0接口,ip地址为1.1.1.1/32。代码如下:
#导入telnetlib模块 import telnetlib #设置SW1的管理地址,用户名和密码三个变量 host = "192.168.56.11" user = "prin" password = "Huawei@123" #调用telnetlib的telnet函数,连接SW1,并将值赋予tn tn = telnetlib.Telnet(host) #调用read_until()函数,告诉python读到Username时输入user变量的值 tn.read_until(b"Username:") tn.write(user.encode('ascii')+b"\n") #调用read_until()函数,告诉python读到PassWord时输入password变量的值 tn.read_until(b"Password:") tn.write(password.encode('ascii')+b"\n") #通过write()函数输入配置的命令,完成后退出telnet tn.write(b"sys \n") tn.write(b"int l0 \n") tn.write(b"ip address 1.1.1.1 32 \n") tn.write(b"return \n") tn.write(b"quit\n")
最终结果:可以看到在SW1上创建了Loopback0接口,并且有了IP地址。
在SW2上配置了SSH,现在通过netmiko模块连接到SW2并创建一个Loopback0接口,ip地址为2.2.2.2/32。
交换机SSH配置命令:
# 创建秘钥 [sw2]dsa local-key-pair create ## 配置SSH认证类型(密码/其他) [sw2]ssh user prin authentication-type password [sw2]ssh user prin service-type stelnet [sw2]stelnet server enable ## 配置认证模式 [sw2]user-interface vty 0 4 [sw2-ui-vty0-4]authentication-mode aaa //配置认证模式 [sw2-ui-vty0-4]protocol inbound ssh //允许 ssh 连接虚拟终端 ## 配置本地用户信息 [sw2]aaa [sw2-aaa] local-user prin password cipher Huawei@123 [sw2-aaa]local-user prin privilege level 15 [sw2-aaa] local-user prin service-type ssh
代码如下:
#netmiko需要通过pip下载 from netmiko import ConnectHandler #设备类型为huawei,除此之外,还支持绝大多数主流厂商的设备,这也是netmiko的优势;其余上参数分别为SW2的IP,SSH的用户名和密码 SW2 ={ 'device_type': 'huawei', 'ip': '192.168.56.22', 'username': 'prin', 'password': 'Huawei@123', } print("正在连接设备..........") #调用ConnectHandler()函数,用上一步创建的字典进行SSH连接,并且将返回值赋予connect变量,注意**不可以省略 connect = ConnectHandler(**SW2) print("Successfully connected to "+SW2['ip']) #设置一个列表,其中为配置的命令,这里可以省略'sys'和'return',因为netmiko会自动加上 config_commands = ['int l0','ip address 2.2.2.2 255.255.255.255'] #调用connect的send_config_set()函数,发送配置命令,并打印出来 output = connect.send_config_set(config_commands) print(output) #调用connect的send_command()函数,发送配置命令,并打印 result = connect.send_command('dis ip int brief') print(result) #注意connect.send_command()仅能发送一个命令,而send_config_set()函数则可以一次性发送多个命令
运行程序打印出来的结果:
注意,netmiko常见支持的设备如下:
CLASS_MAPPER_BASE = { 'a10': A10SSH, 'accedian': AccedianSSH, 'alcatel_aos': AlcatelAosSSH, 'alcatel_sros': AlcatelSrosSSH, 'apresia_aeos': ApresiaAeosSSH, 'arista_eos': AristaSSH, 'aruba_os': ArubaSSH, 'avaya_ers': AvayaErsSSH, 'avaya_vsp': AvayaVspSSH, 'brocade_fastiron': RuckusFastironSSH, 'brocade_netiron': BrocadeNetironSSH, 'brocade_nos': BrocadeNosSSH, 'brocade_vdx': BrocadeNosSSH, 'brocade_vyos': VyOSSSH, 'checkpoint_gaia': CheckPointGaiaSSH, 'calix_b6': CalixB6SSH, 'ciena_saos': CienaSaosSSH, 'cisco_asa': CiscoAsaSSH, 'cisco_ios': CiscoIosSSH, 'cisco_nxos': CiscoNxosSSH, 'cisco_s300': CiscoS300SSH, 'cisco_tp': CiscoTpTcCeSSH, 'cisco_wlc': CiscoWlcSSH, 'cisco_xe': CiscoIosSSH, 'cisco_xr': CiscoXrSSH, 'coriant': CoriantSSH, 'dell_force10': DellForce10SSH, 'dell_os10': DellOS10SSH, 'dell_powerconnect': DellPowerConnectSSH, 'dell_isilon': DellIsilonSSH, 'eltex': EltexSSH, 'enterasys': EnterasysSSH, 'extreme': ExtremeSSH, 'extreme_wing': ExtremeWingSSH, 'f5_ltm': F5LtmSSH, 'fortinet': FortinetSSH, 'generic_termserver': TerminalServerSSH, 'hp_comware': HPComwareSSH, 'hp_procurve': HPProcurveSSH, 'huawei': HuaweiSSH, 'huawei_vrpv8': HuaweiVrpv8SSH, 'juniper': JuniperSSH, 'juniper_junos': JuniperSSH, 'linux': LinuxSSH, 'mellanox': MellanoxSSH, 'mrv_optiswitch': MrvOptiswitchSSH, 'netapp_cdot': NetAppcDotSSH, 'netscaler': NetscalerSSH, 'ovs_linux': OvsLinuxSSH, 'paloalto_panos': PaloAltoPanosSSH, 'pluribus': PluribusSSH, 'quanta_mesh': QuantaMeshSSH, 'ruckus_fastiron': RuckusFastironSSH, 'ubiquiti_edge': UbiquitiEdgeSSH, 'ubiquiti_edgeswitch': UbiquitiEdgeSSH, 'vyatta_vyos': VyOSSSH, 'vyos': VyOSSSH, }
在SW2上配置了SSH,现在通过paramiko模块连接到SW3并创建一个Loopback0接口,ip地址为3.3.3.3/32。
代码如下:
#paramiko需要通过pip下载 import paramiko #import time的目的是为了保证不会因为输入命令或者回显内容过快而导致SSH终端速度跟不上,仅能显示部分命令,而netmiko已经自动解决了此问题 import time #创建三个变量,表示SW3的IP地址、SSH的用户名和密码 ip = "192.168.56.33" username = "prin" password = "Huawei@123" #调用paramiko的SSHClient()函数,并赋值给ssh_client,表示本端作为SSH的客户端 ssh_client = paramiko.SSHClient() #调用set_missing_host_key_policy()函数,用来接受SSH服务器端提供的公钥 ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) #调用connect()函数,输入ip地址、ssh用户名和密码三个参数,进行连接 ssh_client.connect(hostname=ip, username=username, password=password) print("Successfully connect to ", ip) #SSH连接成功后,需要使用invoke_shell()方法唤醒shell,并赋值给command command = ssh_client.invoke_shell() #调用command的send()函数,发送配置的信息给SW3 command.send("sys \n") command.send("int l0 \n") command.send("ip address 3.3.3.3 32 \n") command.send("return \n") command.send("quit \n") #为了保证回显内容能够打印出来,需要先调用time模块的sleep()函数让python休眠2s time.sleep(2) #调用command的recv()函数截取回显的内容,并打印出来,65535表示截取65535个字符,也是一次性最大能够截取的 output = command.recv(65535) print(output.decode("ascii")) #配置完成后,使用close方法退出SSH ssh_client.close()
打印结果:
参考资料:《网络工程师的python之路》
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。