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命令行参数解析模块getopt使用实例
Apr 13 Python
Python 中 list 的各项操作技巧
Apr 13 Python
Python实现按学生年龄排序的实际问题详解
Aug 29 Python
python基础教程项目二之画幅好画
Apr 02 Python
Python wxPython库使用wx.ListBox创建列表框示例
Sep 03 Python
python使用xlrd和xlwt读写Excel文件的实例代码
Sep 05 Python
Django中更改默认数据库为mysql的方法示例
Dec 05 Python
在Pandas中DataFrame数据合并,连接(concat,merge,join)的实例
Jan 29 Python
详解python多线程之间的同步(一)
Apr 03 Python
django的ORM操作 删除和编辑实现详解
Jul 24 Python
关于python3中setup.py小概念解析
Aug 22 Python
python 使用tkinter+you-get实现视频下载器
Nov 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
利用递归把多维数组转为一维数组的函数
2006/10/09 PHP
windows环境下php配置memcache的具体操作步骤
2013/06/09 PHP
深入浅析PHP无限极分类的案例教程
2016/05/09 PHP
php getcwd与dirname(__FILE__)区别详解
2016/09/24 PHP
PHP 中TP5 Request 请求对象的实例详解
2017/07/31 PHP
详解PHP多个进程配合redis的有序集合实现大文件去重
2019/03/06 PHP
ThinkPHP框架实现的微信支付接口开发完整示例
2019/04/10 PHP
PHP底层运行机制与工作原理详解
2020/07/31 PHP
Javascript 构造函数 实例分析
2008/11/26 Javascript
ExtJs中简单的登录界面制作方法
2010/08/19 Javascript
js获取客户端网卡的IP地址、MAC地址
2014/03/26 Javascript
jQuery定义背景动态切换效果的方法
2015/03/23 Javascript
深入理解jquery中的each用法
2016/12/14 Javascript
jQuery中的一些小技巧
2017/01/18 Javascript
利用node.js制作命令行工具方法教程(一)
2017/06/22 Javascript
浅谈js基础数据类型和引用类型,深浅拷贝问题,以及内存分配问题
2017/09/02 Javascript
浅谈JsonObject中的key-value数据解析排序问题
2017/12/06 Javascript
vue几个常用跨域处理方式介绍
2018/02/07 Javascript
Vue项目中使用Vux的安装过程
2018/05/01 Javascript
对vue 键盘回车事件的实例讲解
2018/08/25 Javascript
jQuery实现的别踩白块小游戏完整示例
2019/01/07 jQuery
JavaScript实现星级评价效果
2019/05/17 Javascript
js实现文字头像的生成代码
2020/03/07 Javascript
[04:07]显微镜下的DOTA2第八期——英雄复活动作
2014/06/24 DOTA
[01:23]2019完美世界全国高校联赛(春季赛)合肥全国总决赛
2019/06/10 DOTA
基于Django统计博客文章阅读量
2019/10/29 Python
CSS3中Transition动画属性用法详解
2016/07/04 HTML / CSS
纯CSS3+DIV实现小三角形边框效果的示例代码
2020/08/03 HTML / CSS
简历中个人自我评价范文
2013/12/26 职场文书
公共场所标语
2014/06/30 职场文书
一年级数学下册复习计划
2015/01/17 职场文书
我在伊朗长大观后感
2015/06/16 职场文书
少先队入队仪式主持词
2015/07/04 职场文书
2019年消防宣传标语集锦
2019/11/21 职场文书
Unity连接MySQL并读取表格数据的实现代码
2021/06/20 MySQL
关于JavaScript 中 if包含逗号表达式
2021/11/27 Javascript