Python如何telnet到网络设备


Posted in Python onFebruary 18, 2021

0.前言

Telnet协议属于TCP/IP协议族里的一种,对于我们这些网络攻城狮来说,再熟悉不过了,常用于远程登陆到网络设备进行操作,但是,它的缺陷太明显了,就是不安全,信息明文传送,极容易被攻击窃取信息,不推荐使用,但本节我还是先从它入手哈。

1. 测试环境及关键代码解释

1.1 简单测试环境

  1. 使用python3环境
  2. 使用内置telnetlib模块
  3. 简单的实验环境
说明:
cmd.txt文件里面命令如下:
 terminal length 0
 show clock
 show ip interface brief
list.txt文件里面的IP如下:
 192.168.1.101
 192.168.1.102
 192.168.1.103

1.2 关键代码

import xx:导入模块
class xx:定义类
def xx: 定义函数
try-except :处理可能引发的异常
tn.read_until(expected, timeout=None):等待预期字符串或等待超时
tn.write(buffer):写入的字符串(意思发送给命令给设备)
tn.expect(list, timeout=None):读显,list采用正则表达式(意思把执行过程显示出来)
tn.read_very_eager():读显(意思把执行过程显示出来)
tn.open(host, port=0[, timeout]):连接主机
tn.close():关闭连接

Tips:终端与网络设备交付的信息是以byte类型,所以要把终端上的字符串encode编码转换为byte对象,网络设备回显的byte信息要decode解码。

2. 完整代码

'''
欢迎关注微信公众号:'diandijishu'
 此平台是网路工程师个人日常技术、项目案例经验分享,
 为巩固及提升技术能力乃至共享所学所知技术
 也欢迎各位工程师一起分享、一起成长。
'''

#!/usr/bin/env python
#coding:utf-8

'导入模块'
from telnetlib import Telnet
import time
import logging

'定义类'
class TelnetClient():
  '初始化属性'
  def __init__(self):
    self.tn = Telnet()
  '定义login_host函数,用于登陆设备'
  def login_host(self,ip,username,password,enable=None,verbose=True):
    '连接设备,try-except结构'
    try:
      self.tn.open(ip,port=23)
    except:
      logging.warning('%s网络连接失败' %ip)
      return False
    '输入用户名'
    self.tn.read_until(b'Username:', timeout=1)
    self.tn.write(b'\n')
    self.tn.write(username.encode() + b'\n')
    rely = self.tn.expect([], timeout=1)[2].decode().strip()  #读显
    if verbose:
      print(rely)
    '输入用户密码'
    self.tn.read_until(b'Password:', timeout=1)
    self.tn.write(password.encode() + b'\n')
    rely = self.tn.expect([], timeout=1)[2].decode().strip()
    if verbose:
      print(rely)
    '进去特权模式'
    if enable is not None:
      self.tn.write(b'enable\n')
      self.tn.write(enable.encode() + b'\n')
      if verbose:
        rely = self.tn.expect([], timeout=1)[2].decode().strip()
        print(rely)
        time.sleep(1)

    rely = self.tn.read_very_eager().decode()
    if 'Login invalid' not in rely:
      logging.warning('%s登陆成功' % ip)
      return True
    else:
      logging.warning('%s登陆失败,用户名或密码错误' % ip)
      return False

  '定义do_cmd函数,用于执行命令'
  def do_cmd(self,cmds):
    '读取文件,for语句循环执行命令'
    with open(cmds) as cmd_obj:
      for cmd in cmd_obj:
        self.tn.write(cmd.encode().strip() + b'\n')
        time.sleep(2)
        rely = self.tn.read_very_eager().decode()
        logging.warning('命令执行结果:\n %s' %rely)
  '定义logout_host函数,关闭程序'
  def logout_host(self):
    self.tn.close()

if __name__ == '__main__':
  username = 'cisco' #用户名
  password = 'cisco' #密码
  enable = 'cisco'  #特权密码
  lists = 'list.txt' #存放IP地址文件,相对路径
  cmds = 'cmd.txt'  #存放执行命令文件,相对路径
  telnet_client = TelnetClient()
  '读取文件,for语句循环登陆IP'
  with open(lists,'rt') as list_obj:
    for ip in list_obj:
      '如果登录结果为True,则执行命令,然后退出'
      if telnet_client.login_host(ip.strip(),username,password,enable):
        telnet_client.do_cmd(cmds)
        telnet_client.logout_host()
        time.sleep(2)

3. 运行效果

Python如何telnet到网络设备

备注:这个运行的效果我只存放了192.168.1.101这个IP,精简一下,为了效果。

4. 报错效果

4.1 远程连接不上

4.2 用户名和密码错误

Python如何telnet到网络设备

5. 碎碎语

这些只是一些简单的代码,待优化的地方还是很多,先给小伙伴们学习一下,telnet协议是个不安全的,基本网络环境很少用了,ssh为常用的协议,安全又好用,下个文章我给大家介绍python如何使用ssh模块哈。
本人代码功夫不深,如有缺陷望指教,多谢。

以上就是Python如何telnet到网络设备的详细内容,更多关于python telnet到网络设备的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
Python的加密模块md5、sha、crypt使用实例
Sep 28 Python
使用requests库制作Python爬虫
Mar 25 Python
python顺序的读取文件夹下名称有序的文件方法
Jul 11 Python
python实现扫描局域网指定网段ip的方法
Apr 16 Python
Python3.5 Json与pickle实现数据序列化与反序列化操作示例
Apr 29 Python
Django CBV类的用法详解
Jul 26 Python
Python 实现文件读写、坐标寻址、查找替换功能
Sep 11 Python
详解python如何引用包package
Jun 07 Python
详解Tensorflow不同版本要求与CUDA及CUDNN版本对应关系
Aug 04 Python
python学习笔记之多进程
Aug 06 Python
Django 如何实现文件上传下载
Apr 08 Python
用Python简陋模拟n阶魔方
Apr 17 Python
Python运算符+与+=的方法实例
Feb 18 #Python
python 获取计算机的网卡信息
Feb 18 #Python
python中time tzset()函数实例用法
Feb 18 #Python
python中zip()函数遍历多个列表方法
Feb 18 #Python
python模块内置属性概念及实例
Feb 18 #Python
Python中的流程控制详解
Feb 18 #Python
python爬取豆瓣电影排行榜(requests)的示例代码
Feb 18 #Python
You might like
世界上第一台立体声收音机
2021/03/01 无线电
php实现按指定大小等比缩放生成上传图片缩略图的方法
2014/12/15 PHP
将FCKeditor导入PHP+SMARTY的实现方法
2015/01/15 PHP
php中ob_flush函数和flush函数用法分析
2015/03/18 PHP
分享php代码将360浏览器导出的favdb的sqlite数据库文件转换为html
2015/12/09 PHP
Mac下php 5升级到php 7的步骤详解
2017/04/26 PHP
PHP实现文件上传功能实例代码
2017/05/18 PHP
yii2中LinkPager增加总页数和总记录数的实例
2017/08/28 PHP
php微信开发之图片回复功能
2018/06/14 PHP
ThinkPHP3.2.3框架邮件发送功能图文实例详解
2019/04/23 PHP
windows系统下简单nodejs安装及环境配置
2013/01/08 NodeJs
jQuery中多个元素的Hover事件解决方案
2014/06/12 Javascript
JavaScript实现横向滑出的多级菜单效果
2015/10/09 Javascript
基于JS如何实现给字符加千分符(65,541,694,158)
2016/08/03 Javascript
canvas实现刮刮卡效果
2017/03/14 Javascript
微信小程序--onShareAppMessage分享参数用处(页面分享)
2017/04/18 Javascript
使用vue for时为什么要key【推荐】
2019/07/11 Javascript
20道JS原理题助你面试一臂之力(必看)
2019/07/22 Javascript
vue-router跳转时打开新页面的两种方法
2019/07/29 Javascript
axios实现文件上传并获取进度
2020/03/25 Javascript
node.js制作一个简单的登录拦截器
2020/02/10 Javascript
vue中使用router全局守卫实现页面拦截的示例
2020/10/23 Javascript
vue项目打包后请求地址错误/打包后跨域操作
2020/11/04 Javascript
[48:48]VGJ.T vs Liquid 2018国际邀请赛小组赛BO2 第二场 8.19
2018/08/21 DOTA
Python用Try语句捕获异常的实例方法
2019/06/26 Python
python实现登录密码重置简易操作代码
2019/08/14 Python
解决django-xadmin列表页filter关联对象搜索问题
2019/11/15 Python
numpy ndarray 取出满足特定条件的某些行实例
2019/12/05 Python
python Plotly绘图工具的简单使用
2020/03/03 Python
python字典和json.dumps()的遇到的坑分析
2020/03/11 Python
通过Python实现Payload分离免杀过程详解
2020/07/13 Python
高二生物教学反思
2014/01/27 职场文书
企业法人授权委托书
2014/04/03 职场文书
大学团日活动总结书
2015/05/11 职场文书
nginx里的rewrite跳转的实现
2021/03/31 Servers
vue.js Router中嵌套路由的实用示例
2021/06/27 Vue.js