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切换hosts文件代码示例
Dec 31 Python
python重试装饰器示例
Feb 11 Python
Django 浅谈根据配置生成SQL语句的问题
May 29 Python
Python中利用aiohttp制作异步爬虫及简单应用
Nov 29 Python
利用Python正则表达式过滤敏感词的方法
Jan 21 Python
python write无法写入文件的解决方法
Jan 23 Python
Python列表元素常见操作简单示例
Oct 25 Python
JupyterNotebook 输出窗口的显示效果调整方法
Apr 13 Python
Python 实现简单的客户端认证
Jul 29 Python
Pycharm常用快捷键总结及配置方法
Nov 14 Python
Python应用自动化部署工具Fabric原理及使用解析
Nov 30 Python
利用python爬取有道词典的方法
Dec 08 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
linux php mysql数据库备份实现代码
2009/03/10 PHP
php5.5中类级别的常量使用介绍
2013/10/02 PHP
PHP文件缓存类实现代码
2015/10/26 PHP
PHP处理Ajax请求与Ajax跨域问题
2017/02/13 PHP
Gambit vs ForZe BO3 第三场 2.13
2021/03/10 DOTA
JavaScript 拖拉缩放效果
2008/12/10 Javascript
动态创建的表格单元格中的事件实现代码
2008/12/30 Javascript
基于NodeJS的前后端分离的思考与实践(三)轻量级的接口配置建模框架
2014/09/26 NodeJs
JS实现网页表格自动变大缩小的方法
2015/03/09 Javascript
JQUERY实现网页右下角固定位置展开关闭特效的方法
2015/07/27 Javascript
JavaScript sort数组排序方法和自我实现排序方法小结
2016/06/06 Javascript
input 禁止输入特殊字符的四种实现方式
2016/08/24 Javascript
ES6通过babel转码使用webpack使用import关键字
2016/12/13 Javascript
Nodejs之TCP服务端与客户端聊天程序详解
2017/07/07 NodeJs
NProgress显示顶部进度条效果及使用详解
2019/09/21 Javascript
JS操作json对象key、value的常用方法分析
2019/10/29 Javascript
[01:32]DOTA2次级联赛——首支职业女子战队选拔赛全记录
2014/10/23 DOTA
[11:42]2018DOTA2国际邀请赛寻真——OG卷土重来
2018/08/17 DOTA
[01:08:43]DOTA2-DPC中国联赛定级赛 Phoenix vs DLG BO3第一场 1月9日
2021/03/11 DOTA
Python import自定义模块方法
2015/02/12 Python
Python的组合模式与责任链模式编程示例
2016/02/02 Python
python 默认参数问题的陷阱
2016/02/29 Python
JSON Web Tokens的实现原理
2017/04/02 Python
python 重定向获取真实url的方法
2018/05/11 Python
python 每天如何定时启动爬虫任务(实现方法分享)
2018/05/21 Python
python scipy求解非线性方程的方法(fsolve/root)
2018/11/12 Python
pytorch 实现cross entropy损失函数计算方式
2020/01/02 Python
Python PIL库图片灰化处理
2020/04/07 Python
CSS3 @media的基本用法总结
2019/09/10 HTML / CSS
销售总监岗位职责
2014/01/04 职场文书
《手指教学》反思
2014/02/14 职场文书
校园公益广告语
2014/03/13 职场文书
2014领导干部学习焦裕禄同志先进事迹思想汇报
2014/09/19 职场文书
预备党员自我批评思想汇报
2014/10/10 职场文书
MySQL系列之四 SQL语法
2021/07/02 MySQL
解决vue中provide inject的响应式监听
2022/04/19 Vue.js