使用拓扑:
通过云来连接本地主机和eNSP中的设备,保证双方能互相通信。IP地址规划入图中所示,现在通过python连接到SW1、SW2、SW3上做配置修改。
版本:python3.9
一、使用telnetlib修改eNSP交换机的配置:
在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地址。
二、使用netmiko修改eNSP交换机的配置:
在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,
}
三、使用paramiko修改eNSP交换机的配置:
在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之路》