【NetDevOps】paramiko 实验

网友投稿 343 2022-10-23


【NetDevOps】paramiko 实验

拓扑图:

前置工作:

1.交换机、路由器配置ssh server 用户名:admin 密码:admin123 2.PC上安装python3, 并使用pip安装paramiko模块 pip3 install paramiko

第一个脚本

连接sw11,创建loopback1口,并配置ip地址 11.11.11.11/32

import paramiko import time #登录信息 ip = "192.168.164.11" username="admin" password= "admin123" #调用paramiko的SSHClient()方法,将其赋值给变量ssh_client ssh_client= paramiko.SSHClient() #标准配置,让paramiko自动接受来自未保存主机的密钥 ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) #调用paramiko.SSHClient()的connect()函数进行ssh登录 ssh_client.connect(hostname=ip,username=username,password=password) #connect()函数登录成功,才会往下执行,先打印连接成功的信息 print("连接上设备:",ip) #调用paramiko.SSHClient()的invoke_shell()方法来唤醒shell,将这个方法赋值给变量command command= ssh_client.invoke_shell() #调用invoke_shell()的send()函数,向设备发送指令,注意使用\n换行符模拟敲击回车 command.send("sys \n") command.send("int loop 1 \n") command.send("ip addr 11.11.11.11 32 \n") command.send("return \n") command.send("save \n") command.send("Y \n") #调用time模块的sleep()函数,手动休眠2s , 目的是等待设备回显内容输出,方便后面打印到完整内容 time.sleep(2) #调用invoke_shell()的recv()函数,截取回显结果,一次最多65535字符 output= command.recv(65535) #打印回显结果,并指定解码方式为utf-8 print(output.decode("utf-8")) #调用paramiko.SSHClient()的close方法,退出SSH连接 ssh_client.close

第二个脚本

需求:为几台设备都创建loopback口,并配置ip地址,类似"11.11.11.11/32"特点:

手动输入用户名密码

用input()函数输入用户名;调用getpass模块的getpass()函数输入密码,效果跟input()类似,只是输入过程不是明文显示的。

ip列表写在 iphost.txt 文本文件中,使用open()函数读取

iphost.txt文件放在脚本文件的同目录下,每行写一个设备ip地址192.168.164.11~192.168.164.15 。

引入异常处理模块

使用 try...except 语法,在出现异常后,做出我们需要的操作后 继续往下执行脚本,而不是直接停止;最后将异常的设备统计并打印出来。

import paramiko import time import getpass #输入SSH登录信息 username=input('请输入用户名:') password=getpass.getpass('请输入密码:') #打开ip列表文件 iphost=open('iphost.txt','r') #创建两个空列表,用于后面存放出现连接超时错误和登录信息错误的设备信息 timeout_list=[] auth_error_list=[] #用for循环读取ip列表 for line in iphost.readlines(): #去除头尾的空格、换行符 ip=line.strip() #try内写正常执行的语句 try: #调用paramiko的SSHClient()方法,赋予变量ssh ssh=paramiko.SSHClient() #自动接受来自未保存主机的密钥 ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) #调用connect()方法进行ssh登录 ssh.connect(hostname=ip,username=username,password=password) #打印连接成功信息 print('已连接'+ip) #调用paramiko.SSHClient()的connect()方法,唤醒shell,赋值给变量command command=ssh.invoke_shell() #调用invoke_shell()的send()函数,向设备发送指令 command.send('sys \n') command.send('int lo 0 \n') loip=ip[13:] command.send('ip add '+loip+'.'+loip+'.'+loip+'.'+loip+' 32 \n') command.send('return \n') #调用time模块sleep()函数,手动休眠2s,目的是等待设备回显内容输出,方便后面打印完整回显内容 time.sleep(1) #调用invoke_shell()的recv()函数,截取回显结果,一次罪过65535字符 output=command.recv(65535) #打印回显结果,用utf-8解码 print(output.decode('utf-8')) #错误类型一,账号密码认证失败;打印并在列表中增加连接失败的ip地址 except paramiko.ssh_exception.AuthenticationException: print('认证失败',ip) auth_error_list.append(ip) #错误类型二,连接超时;打印并在列表中增加连接失败的ip地址 except TimeoutError: print('连接超时',ip) timeout_list.append(ip) #关闭ip列表文件 iphost.close() #调用paramiko.SSHClient()的close方法,退出ssh连接 ssh.close #如果列表不为空,打印出来连接失败的设备 if timeout_list: print('以下设备连接超时:') for i in timeout_list: print(i) if auth_error_list: print('以下设备认证失败:') for i in auth_error_list: print(i)

参考:书籍 网络工程师python之路


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Spring扩展接口知识总结
下一篇:视频会议专线部署不会?别急,我教你
相关文章

 发表评论

暂时没有评论,来抢沙发吧~