Netdevops入门之Telnetlib语法案例

1、Telnetlib模块:

支持telnet/ssh远程访问的模块很多,常见的有telnetlib、ciscolib、paramiko、netmiko、pexpect,其中telnetlib和ciscolib对应telnet协议,后面3个对应SSH协议。

①-通过ENSP环境搭建实验环境

②-基础语法-telnetlib案例1:

注意:python3中,telnetlib模块下所有的返回值都是字节流,而默认输入的都是普通字符串str,因此在python3中使用tlenetlib需要注意:

①在字符串的前面需要加上一个b; 转换成字节流

②在变量和tlentlib函数后面需要加上.encode('ascii')函数 进行解码

③在read_all()函数后面需要加上decode('ascii')函数

python 复制代码
import telnetlib
import time

host = '192.168.2.11'
user = '111'
password = '111'
#执行telnet 并输入用户名和密码
tn = telnetlib.Telnet(host,port=23,timeout=1)  #tn实例化函数   telnet设备ip地址,(端口号,超时时间也可以不写,默认即可)
tn.read_until(b"Username",timeout=1)           #read函数  读取设备返回的Username字符串
tn.write(user.encode('ascii') + b'\n')         #将用户名转为ascii编码方式将字符串转换为bytes  \n回车
tn.read_until(b"Password:",timeout=1)
tn.write(password.encode('ascii') + b'\n')
print('已登录进设备'+ host)

tn.write(b"sys\n")  #写入命令
tn.write(b"int loopback 1\n")
tn.write(b"ip address 1.1.1.1 32\n")
tn.write(b"quit\n")
tn.write(b"quit\n")
tn.write(b"save\n")
tn.write(b"y\n")

time.sleep(2)   #时间模块,暂停2s  等待设备响应
output = (tn.read_very_eager().decode("ascii"))   #输出结果区域
print(output)
tn.close()

③-登录多台设备(for 循环)-telnetlib案例2:

通过列表添加设备ip,然后for循环调用执行

python 复制代码
import telnetlib
import time

hosts =['192.168.2.11','192.168.2.12','192.168.2.13','192.168.2.14','192.168.2.15','192.168.2.16']
user = '111'
password = '111'

for ip in hosts:                    #循环执行hosts列表
    tn = telnetlib.Telnet(ip)      #tn实例化函数   telnet设备ip地址,(端口号,超时时间也可以不写,默认即可)
    tn.read_until(b"Username:")      #read函数  读取设备返回的Username字符串
    tn.write(user.encode('ascii') + b'\n')          #将用户名转为ascii编码方式将字符串转换为bytes  \n回车
    tn.read_until(b"Password:",timeout=1)
    tn.write(password.encode('ascii') + b'\n')
    print('已登录进设备'+ ip)

    tn.write(b"sys\n")  #写入命令
    tn.write(b"int loopback 1\n")
    tn.write(b"ip address 1.1.1.1 32\n")
    tn.write(b"quit\n")
    tn.write(b"quit\n")
    tn.write(b"save\n")
    tn.write(b"y\n")

    time.sleep(2)   #时间模块,暂停2s  等待设备响应
    output = (tn.read_very_eager().decode("ascii"))   #输出结果区域   转为ascii编码方式将字符串转换为bytes
    print(output)
    tn.close()

④-循环执行多条命令-telnetlib案例3:

定义主机ip列表

定义命令字符串列表

然后for循环执行以上列表

python 复制代码
import telnetlib
import time

hosts =['192.168.2.11','192.168.2.12','192.168.2.13','192.168.2.14','192.168.2.15','192.168.2.16']  #s表示列表
user = '111'
password = '111'
commands = ['sys','int loopback 1','ip address 1.1.1.1 32','quit','quit','save','y']   #相当于把命令刷到文档里,s表示列表

for ip in hosts:
    tn = telnetlib.Telnet(ip)                #tn实例化函数   telnet设备ip地址,(端口号,超时时间也可以不写,默认即可)
    tn.read_until(b"Username:")              #read函数  读取设备返回的Username字符串
    tn.write(user.encode('ascii') + b'\n')   #将用户名转为ascii编码方式将字符串转换为bytes  \n回车
    tn.read_until(b"Password:",timeout=1)
    tn.write(password.encode('ascii') + b'\n')
    print('已登录进设备'+ ip)

    for command in commands:
        tn.write(command.encode('ascii')+b'\n')   #循环调用commands内的命令
    time.sleep(2)   #时间模块,暂停2s  等待设备响应
    output = (tn.read_very_eager().decode("ascii"))   #输出结果区域
    print(output)
    tn.close()

⑤-异常处理-telnetlib案例:

增加异常处理,防止某台交换机登录失败,导致程序中断

python 复制代码
import telnetlib
import time

hosts =['192.168.2.11','192.168.2.12','192.168.2.13','192.168.2.14','192.168.2.15','192.168.2.16']  #s表示列表
user = '111'
password = '111'
commands = ['sys','int loopback 1','ip address 1.1.1.1 32','quit','quit','save','y']   #相当于把命令刷到文档里,s表示列表
Error= []                          #创建Error队列
for ip in hosts:                   #循环登录ip
    try:
        tn = telnetlib.Telnet(ip)       #tn实例化函数   telnet设备ip地址
        tn.read_until(b"Username:",timeout=1)     #read函数  读取设备返回的Username字符串
        tn.write(user.encode('ascii') + b'\n')    #将用户名转为ascii编码方式将字符串转换为bytes  \n回车
        tn.read_until(b"Password:",timeout=1)
        tn.write(password.encode('ascii') + b'\n')
        print('已登录进设备'+ ip)

        for command in commands:
            tn.write(command.encode('ascii')+b'\n')  #循环调用commands内的命令
        time.sleep(2)   #时间模块,暂停2s  等待设备响应
        output = (tn.read_very_eager().decode("ascii"))   #输出结果区域
        print(output)
        tn.close()
    
    except:    #只要登录错误都按如下打印
#   except TimeoutError:  # 只会处理timeoutError的错误
        print("登录失败,登录超时的设备IP:"+ip )
        Error.append(ip)       #append添加,附加,将失败的ip添加到Error的列表
print(Error)           #打印失败的设备ip

连接异常和密码错误异常 处理判断

⑥-通过文本读取IP和命令-telnetlib案例:

将ip地址或者命令放在txt文本文件中,通过脚本读取文本文件

python 复制代码
import telnetlib
import time

hosts = open('hosts.txt','r')  #使用open函数  打开文本,并read 读取
user = '111'
password = '111'
commands = open('commands.txt','r')
ConnectionError= []    #连接失败的列表

for ip in hosts.readlines():                   #readline 逐行读取文本文件
    try:
        ip =ip.strip()       #strip函数可以去除文本中的回车和空格
        tn = telnetlib.Telnet(ip)       #tn实例化函数   telnet设备ip地址
        tn.read_until(b"Username:")     #read函数  读取设备返回的Username字符串
        tn.write(user.encode('ascii') + b'\n')    #将用户名转为ascii编码方式将字符串转换为bytes  \n回车
        tn.read_until(b"Password:")
        tn.write(password.encode('ascii') + b'\n')
        print('已登录进设备'+ ip)
        #print(f'已登录进设备:{ip}')

        commands.seek(0)           #光标每次读取完都会在最后,需要用seek函数将光标置于最前面
        for command in commands.readlines():
            tn.write(command.encode('ascii')+b'\n')       #循环调用commands内的命令
        time.sleep(2)
        output = (tn.read_very_eager()).decode("ascii")   #输出结果区域
        print(output)
        tn.close()
    except:                           #只要登录错误都按如下打印
        print("##########登录失败,登录超时的设备IP:"+ip+'##########' )
        ConnectionError.append(ip)    #append添加,附加,将失败的ip添加到ConnectionError的列表
print(ConnectionError)     

⑦-封装成函数解决问题-telnetlib案例:

将telnetlib封装成函数,方便小规模灵活应用,便于调用,同时增加input输入用户名和密码。允许部分交换机用户名和密码不同。

python 复制代码
import telnetlib
import time

commands = open('commands.txt','r')
ConnectionError= []
AuthenFaill= []

def Telnet (host,username=input('请输入用户名:'),password=input('请输入密码:'),port=23):    #封装定义函数,定义host  username password
    try:
        tn = telnetlib.Telnet(host)       #tn实例化函数   telnet设备ip地址
        tn.read_until(b"Username:")     #read函数  读取设备返回的Username字符串
        tn.write(username.encode('ascii') + b'\n')    #将用户名转为ascii编码方式将字符串转换为bytes  \n回车
        tn.read_until(b"Password:")
        tn.write(password.encode('ascii') + b'\n')

        index,obj,oup=tn.expect([b'Info',b'Error'],timeout=1)
        if index ==0:
            print('已经成功登录设备'+host)
        elif index == 1:
            print('设备用户或密码错误'+host)
            AuthenFaill.append(host)

        commands.seek(0)           #光标每次读取完都会在最后,需要用seek函数将光标置于最前面
        for command in commands.readlines():
            tn.write(command.encode('ascii')+b'\n')       #循环调用commands内的命令
        time.sleep(2)
        output = (tn.read_very_eager()).decode("ascii")   #输出结果区域
        print(output)
        tn.close()
    except :
        print("连接异常失败IP:"+host)
        ConnectionError.append(host)    #append添加,附加,将失败的ip添加到ConnectionError的列表

Telnet('192.168.2.11')
Telnet('192.168.2.12')
Telnet('192.168.2.13',username='root',password='roo111')    #如果此台主机密码不同于其他,可以直接赋予正确的密码
Telnet('192.168.2.14')
Telnet('192.168.2.15')
Telnet('192.168.2.16')

print('-'*100)
print('认证失败的设备如下:')
print(AuthenFaill)
print('-'*100)
print('连接异常的设备如下:')
print(ConnectionError)

⑧-ping案例:

可以使用os.system或者subprocess模块实现ping检测

python 复制代码
import os
ip ='192.168.1.1'
response =os.system('ping -n 1 '+ip)   #发1包

if response ==0:
    print(ip,'is up!')
else:
    print(ip,'is down!')

或者

python 复制代码
import os
host = ['192.168.1.1']
for ip in host:
    try:
        ping_result = os.system(f"ping -n 1 {ip}")
        if ping_result == 0:
            print(f"{ip} 连通性正常")
        else:
            print(f"{ip} 连通性异常")
    except Exception as e:
        print("检查 {ip} 连通性时出现异常:{e}")

或者

python 复制代码
import subprocess   #subprocess模块执行ping命令(只返回结果不返回打印)
host = ['192.168.1.1']
for ip in host:
    try:
        command = ['ping', '-n', str(1), ip]
        result = subprocess.run(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True)
       #朱提部分subprocess.run执行命令,捕获输出但不打印
        if result.returncode == 0:  #检查是否执行成功
            print('ok')
        else:
            print('pok')
            #print('pok',result.stderr) 如果需要可以打印错误信息
    except Exception as e:
        print("检查 {ip} 连通性时出现异常:{e}")
相关推荐
那雨倾城41 分钟前
使用 OpenCV 将图像中标记特定颜色区域
人工智能·python·opencv·计算机视觉·视觉检测
网络空间小黑3 小时前
TCP/IP 知识体系
网络·网络协议·tcp/ip·计算机网络·5g·wireshark·信息与通信
belldeep3 小时前
如何阅读、学习 Tcc (Tiny C Compiler) 源代码?如何解析 Tcc 源代码?
c语言·开发语言
LuckyTHP3 小时前
java 使用zxing生成条形码(可自定义文字位置、边框样式)
java·开发语言·python
Dotrust东信创智3 小时前
面向SDV的在环测试深度解析——仿真中间件SIL KIT应用篇
网络·中间件·汽车
leoufung4 小时前
ECPF 简介
linux·网络·kernel
mahuifa5 小时前
(7)python开发经验
python·qt·pyside6·开发经验
学地理的小胖砸6 小时前
【Python 操作 MySQL 数据库】
数据库·python·mysql
安迪小宝6 小时前
6 任务路由与负载均衡
运维·python·celery
Blossom.1186 小时前
使用Python实现简单的人工智能聊天机器人
开发语言·人工智能·python·低代码·数据挖掘·机器人·云计算