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代码(逐级优化)
May 25 Python
理解python正则表达式
Jan 15 Python
Python常用的爬虫技巧总结
Mar 28 Python
Python 专题六 局部变量、全局变量global、导入模块变量
Mar 20 Python
flask中主动抛出异常及统一异常处理代码示例
Jan 18 Python
python使用装饰器作日志处理的方法
Jul 11 Python
对Python _取log的几种方式小结
Jul 25 Python
Python3实现mysql连接和数据框的形成(实例代码)
Jan 17 Python
python实现拼图小游戏
Feb 22 Python
Django 解决上传文件时,request.FILES为空的问题
May 20 Python
Python selenium爬取微信公众号文章代码详解
Aug 12 Python
python 实现图与图之间的间距调整subplots_adjust
May 21 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
Re:从零开始的异世界生活 第2季 开播啦
2020/07/24 日漫
利用js调用后台php进行数据处理原码
2006/10/09 PHP
建站常用13种PHP开源CMS比较
2009/08/23 PHP
一个图片地址分解程序(用于PHP小偷程序)
2014/08/23 PHP
详解PHP+AJAX无刷新分页实现方法
2015/11/03 PHP
详解php 使用Callable Closure强制指定回调类型
2017/10/26 PHP
thinkPHP框架整合tcpdf插件操作示例
2018/08/07 PHP
可实现多表单提交的javascript函数
2007/08/01 Javascript
javascript window.open打开新窗口后无法再次打开该窗口问题的解决方法
2014/04/12 Javascript
javascript禁止访客复制网页内容的实现代码
2015/08/05 Javascript
详解javascript事件冒泡
2016/01/09 Javascript
JavaScript实现省市县三级级联特效
2017/05/16 Javascript
React中this丢失的四种解决方法
2019/03/12 Javascript
layui table 表格模板按钮的实例代码
2019/09/21 Javascript
谈谈IntersectionObserver懒加载的具体使用
2019/10/15 Javascript
在vue中嵌入外部网站的实现
2020/11/13 Javascript
javascript实现点击产生随机图形
2021/01/25 Javascript
[42:27]DOTA2上海特级锦标赛主赛事日 - 3 败者组第三轮#2Fnatic VS OG第三局
2016/03/05 DOTA
python基础教程之简单入门说明(变量和控制语言使用方法)
2014/03/25 Python
python使用calendar输出指定年份全年日历的方法
2015/04/04 Python
使用Python的Django框架实现事务交易管理的教程
2015/04/20 Python
Python基于select实现的socket服务器
2016/04/13 Python
浅谈Python类的__getitem__和__setitem__特殊方法
2016/12/25 Python
python生成ppt的方法
2018/06/07 Python
python实发邮件实例详解
2019/11/11 Python
python logging 日志的级别调整方式
2020/02/21 Python
python的reverse函数翻转结果为None的问题
2020/05/11 Python
python文件及目录操作代码汇总
2020/07/08 Python
Python 的 __str__ 和 __repr__ 方法对比
2020/09/02 Python
Python try except else使用详解
2021/01/12 Python
让IE支持CSS3的不完全兼容方案
2014/09/19 HTML / CSS
军人违纪检讨书
2014/02/04 职场文书
供应商食品安全承诺书
2015/04/29 职场文书
小学一年级数学教学反思
2016/02/16 职场文书
四年级语文教学反思
2016/03/03 职场文书
对象析构函数__del__在Python中何时使用
2022/03/22 Python