python3+telnetlib实现简单自动测试

news2025/1/8 4:27:35

1 telnetlib介绍
1.1 简介
官方介绍文档:telnetlib – Telnet 客户端 — Python 3.9.6 文档

telnetlib 模块提供一个实现Telnet协议的类 Telnet。

1.2 库常用函数及使用
1.2.1 建立连接

建立连接有两种方式:1、实例化函数的时候,将可选参数 host 和 port 传递给构造函数,在这种情况下,到服务器的连接将在构造函数返回前建立。2、使用telnetlib.Telnet类的open函数建立连接。

如以下两种方式是等同的,参数timeout表示阻塞的时间(单位为秒),默认为一直阻塞:

import telnetlib
 
HOST = "10.102.1.12"
#方式1
tn = telnetlib.Telnet(HOST, port=21, timeout=10)
 
#方式2
tn = telnetlib.Telnet()
tn.open(HOST, port=21)

1.2.2 发送命令

发送命令使用的是Telnet类的write方法,注意参数buffer是字节字符串byte string,网络数据传输都是使用的byte string,也就是字节流,在发送的字符串前面加一个b,就可以将字符串转换为字节流。

Telnet.write(buffer)

例如,发送一个“exit”命令给服务器,也就是退出telnet连接。 

tn.write(b"exit\n")

1.2.3 读取返回数据

Telnet类提供的读取返回结果的函数比较多,这里列举3个:
Telnet.read_until(expected, timeout=None) 读取直到遇到给定字节串 expected 或 timeout 秒已经过去。默认为阻塞性的读。

Telnet.read_all() 读取数据,直到遇到 EOF;连接关闭前都会保持阻塞。

Telnet.read_very_eager() 在不阻塞 I/O 的情况下读取所有的内容(eager)。

1.2.4 关闭连接

关闭telnet连接直接使用Telnet.close()函数,或者发送"exit"命令,以下两种用法是一样的。

tn = telnetlib.Telnet()
#方式1
tn.close()
#方式2
tn.write(b"exit\n")

1.3 使用示例

首先,我们先使用IPOP创建一个FTP服务,端口为21,用户名为admin,密码为admin。

image-20210817220527079

然后,编写一个简单的测试用例,连接telnet服务器,然后退出。 

import getpass
import telnetlib
 
HOST = "10.102.1.12"
user = input("Enter your remote account: ")
password = getpass.getpass()
 
tn = telnetlib.Telnet(HOST, port=21, timeout=10)
 
tn.write(user.encode('ascii') + b"\n")
if password:
    tn.write(password.encode('ascii') + b"\n")
 
print(tn.read_very_eager().decode('ascii'))
 
tn.write(b"exit\n")
 
print ("exit")

 直接执行,结果如下,可以看出,连接了一次telnet服务器,然后退出了:

image-20210817223235203

image-20210817223257508

2 自动测试
参考代码:Python3+telnetlib实现telnet客户端 - 诸子流 - 博客园 (cnblogs.com)

先简单说明代码实现的功能,首先先运行一个程序,这个程序会创建一个telnet服务;然后使用python编写一个telnet客户端,连接telnet服务,并输入命令,获取命令返回结果,根据结果来判断命令是否执行正确。

命令及期望结果:命令和期望的结果存放在excel中,期望结果用来从命令的返回数据中进行字符串查找的,如果找到了,表示命令执行成功,否则认为执行失败。格式如下:

image-20210817231405117

执行失败结果保存:如果命令执行失败,则将命令和得到的返回数据存放到一个单独的文件中。

下面说明代码目录结构:

1078885-20210817232240481-1025625638

C_parse_excel.py类用于解析excel,获取命令及返回结果:
 
# -*- coding: utf-8 -*-
 
import os
import sys
import re
import xlrd
import logging
 
logging.basicConfig(level=logging.NOTSET, format='[%(filename)s:%(lineno)d]-%(levelname)s %(message)s')
 
 
class CCsrConfig(object):
 
    def __init__(self, excelName):
        self._registerDict = {}
        self._excelName = excelName
 
    def OpenExcel(self):
        if self._excelName == "":
            self._excelName = None
        else:
            self._excelfd = xlrd.open_workbook(self._excelName)
            for sheetName in self._excelfd.sheet_names():
                pass
 
    def ReadCSRCfg(self):
        return_dict = {}  #{sheetName: [cmdlist]}
        for sheetName in self._excelfd.sheet_names():
            tmp_list = []
            sheet = self._excelfd.sheet_by_name(sheetName)
            if None != sheet:
                if sheet.nrows == 0:  # no content
                    continue
            sheetName = str(sheetName.strip()).lower()
            logging.debug(sheetName)
            row_start = 0
            for row in range(sheet.nrows):
                if sheet.cell(row, 0).value.strip() == u"command":
                    row_start = row + 1
                    break
            for row in range(row_start, sheet.nrows, 1):
                cmd = str(sheet.cell(row, 0).value).strip()
                exp_ret = str(sheet.cell(row, 1).value).strip()
                tmp_list.append([cmd, exp_ret])
            return_dict[sheetName.lower()] = tmp_list
        return return_dict

C_telnet.py类实现telnet连接,以及发送命令和获取结果,并解析结果信息:

# -*- coding:utf-8 -*- 
 
import logging
import telnetlib
import time
 
class TelnetClient():
    def __init__(self,):
        self.tn = telnetlib.Telnet()
 
    # 此函数实现telnet登录主机
    def login_host(self, host_ip, remote_port, username, password):
        try:
            self.tn.open(host_ip, port = remote_port)
        except:
            logging.warning('%s网络连接失败' % host_ip)
            return False
        # 等待login出现后输入用户名,最多等待10秒
        self.tn.read_until(b'login: ', timeout=2)
        self.tn.write(username.encode('ascii') + b'\n')
        # 等待Password出现后输入用户名,最多等待10秒
        self.tn.read_until(b'Password: ', timeout=2)
        self.tn.write(password.encode('ascii') + b'\n')
        # 延时两秒再收取返回结果,给服务端足够响应时间
        time.sleep(2)
        # 获取登录结果
        command_result = self.tn.read_very_eager().decode('ascii')
        if 'Login incorrect' not in command_result:
            logging.debug(u'%s登录成功' % host_ip)
            return True
        else:
            logging.warning(u'%s登录失败,用户名或密码错误' % host_ip)
            return False
 
    def start_test_cmd(self, cmd_dict):
        for sheet_item in cmd_dict:
            for sheet in sheet_item:
                cmd_list = sheet_item[sheet]
                tmp_err_list = []
                for cmd in cmd_list:
                    cmd_in = cmd[0]
                    exp_ret = cmd[1]
                    self.tn.write(cmd_in.encode('ascii')+b'\n')
                    time.sleep(1)
                    # 获取命令结果
                    command_result = self.tn.read_very_eager().decode('ascii')
                    if command_result.find(exp_ret) == -1:
                        tmp_err_list.append([cmd_in, command_result])
                    else:
                        print('%s' % command_result)
 
                if len(tmp_err_list) != 0:  # 将错误信息记录到文件中
                    with open("./out_file/%s_err_log.txt" % sheet, "w+", newline="") as f:
                        for err_item in tmp_err_list:
                            logging.debug(err_item[0])
                            f.write("%s" % err_item[0])
                            f.write("%s" % err_item[1])
 
    # 退出telnet
    def logout_host(self):
        self.tn.write(b"exit\n")

main_func.py是主函数入口:

# -*- coding:utf-8 -*- 
 
import logging
import os
import sys
from C_telnet import *
from C_parse_excel import *
 
Host_ip = '192.168.17.128'
Username = 'admin'
Password = 'admin'
Remote_port = 8000
 
def parse_cmd_excel(dir_name):
    objList = []
    list_f = os.listdir(dir_name)
    for item in list_f:
        item = dir_name + item
        if os.path.isfile(item) and (item[-5:] == '.xlsx' or item[-5:] == '.xlsm'):
            if item.find("$") != -1:
                continue            
            csrConfig = CCsrConfig(item)
            csrConfig.OpenExcel()
            tmp = csrConfig.ReadCSRCfg()
            objList.append(tmp)
        elif os.path.isdir(item):
            item = item + '/'
            new_obj_list = []
            new_obj_list = parse_cmd_excel(item)
            for each in new_obj_list:
                objList.append(each)
                
    return objList
 
if __name__ == '__main__':
    # 从表格中获取测试的命令
    all_cmd_dict = {}
    all_cmd_dict = parse_cmd_excel("./src_file/")
 
    #启动telnet客户端连接,并进行测试
    telnet_client = TelnetClient()
    if telnet_client.login_host(Host_ip, Remote_port, Username, Password) == False:
        print("Telnet disconnected!\n")
    else:
        telnet_client.start_test_cmd(all_cmd_dict)
        telnet_client.logout_host()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/539004.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

PSP - AlphaFold2 Multimer 的 Heteromer (异源多聚体) MSA 逻辑

欢迎关注我的CSDN:https://spike.blog.csdn.net/ 本文地址:https://blog.csdn.net/caroline_wendy/article/details/130733737 同源多聚体 (Homomer) 是由相同的蛋白质亚基组成的,而异源多聚体 (Heteromer) 是由不同的蛋白质亚基组成的。同源多聚体的亚基之间通常有对称的相…

网络安全真的有那么好吗

网络安全是一个永远不会完美的领域,因为网络空间是一个开放、动态、复杂的环境,存在着许多安全威胁和攻击手段。虽然现代的安全技术和防御措施已经很强大,但黑客和病毒等攻击手段也在不断升级,不断打破现有的安全防御措施。因此&a…

论-如何更好的帮助小伙伴们写出更多高质量的论文

开篇一张图,告诉大家,哥哥我身体依然倍棒,依然奋战在一线。 前言 最近几个月一直在加班为小伙伴们创造价值,已经帮助上百位小伙伴解决了论文的“烦恼”与“忧愁”,但是我想说的是,哥哥真的苦啊,…

【分布族谱】泊松分布和二项分布、正态分布的关系

文章目录 泊松分布和二项分布的关系和正态分布的关系 泊松分布 如果在有限时间 ( 0 , 1 ) (0,1) (0,1)内进行 n n n次伯努利实验,那么每次伯努利实验所占用的时间为 1 n \frac{1}{n} n1​,按照自然规律,一件事情肯定是时间越长越容易发生&am…

chatgpt赋能Python-pycharm改名字

PyCharm更名为JetBrains PyCharm——专属Python开发者的最佳IDE JetBrains PyCharm是一款Python开发者最喜欢使用的IDE之一。然而,在2021年初,这款世界著名的Python IDE进行了一次重大更名——PyCharm更名为JetBrains PyCharm。在这篇文章中&#xff0c…

Rust每日一练(Leetday0003) 整数反转、字串转整数、回文数

目录 7. 整数反转 Reverse Integer 🌟🌟 8. 字符串转换整数 String-to-integer (atoi) 🌟🌟 9. 回文数 Palindrome Number 🌟 🌟 每日一练刷题专栏 🌟 Rust每日一练 专栏 Golang每日一…

chatgpt赋能Python-pycharm提取数据

PyCharm提取数据指南 PyCharm作为一款强大的Python IDE,在数据科学和数据分析领域广受欢迎。它不仅可以用于Python代码开发,还能够提高数据的处理效率。本文将介绍如何在PyCharm中使用Python代码提取数据,以及探讨如何最大化地发挥其数据处理…

chatgpt赋能Python-pycharm行数

PyCharm行数:如何轻松管理您的代码库 作为一个有10年Python编程经验的工程师,我知道管理庞大代码库的挑战。在这种情况下,行数管理是一个非常重要的方面。幸运的是,有很多现代的集成开发环境(IDE)可以帮助…

chatgpt赋能Python-pycharm粘贴把空格识别成行

PyCharm粘贴把空格识别成行:你需要知道的所有事情 作为一名有10年Python编程经验的工程师,我经常使用PyCharm,它是一款流行的 Python 集成环境 (IDE)。今天,我想分享一些有关 PyCharm 粘贴把空格识别成行的信息。 什么是PyCharm…

Windows活动目录以及部分Windows网络应用服务器

一.本地用户和组 Windows Server2008本地用户与组: 用户:就是包含用户名、密码、权限以及说明。 用户组:具有相同性质的用户归结在一起,统一授权,组成用户组。 用户组分类:全局组、本地组、特殊组。 各组名及其权限: Administrators&#…

不用等待列表,马上解锁New Bing GPT-4功能

大家好,我是可夫小子,关注AIGC、读书和自媒体。解锁更多ChatGPT、AI绘画玩法。加:keeepdance,备注:chatgpt,拉你进群。 今年1月份,微软投资OpenAI 100亿之后,就迅速把ChatGPT的能力接…

chatgpt赋能Python-pycharm添加numpy库

PyCharm添加Numpy库 PyCharm是一款功能强大的Python集成开发环境,广泛应用于Python程序开发和数据分析领域。Numpy是Python中著名的科学计算库,包括数组、矩阵、数学函数等模块,是数据科学领域中不可或缺的工具。 本篇SEO文章将介绍如何在P…

Android之 Activity活动详解

一 四大组件 1.1 Activity组件,它一个单独的窗口,程序流程都必须在Activity中运行。 1.2 service组件,用于在后台完成用户指定的操作。 1.3 content provider组件,会为所有的应用准备一个内容窗口,并且保留数据库、…

《程序员面试金典(第6版)》面试题 16.24. 数对和(哈希映射,双指针)

题目描述 设计一个算法,找出数组中两数之和为指定值的所有整数对。一个数只能属于一个数对。 题目传送门 示例 1: 输入: nums [5,6,5], target 11 输出: [[5,6]]示例 2: 输入: nums [5,6,5,6], target 11 输出: [[5,6],[5,6]]提示: nums.length &…

抖音SEO矩阵系统源码开发(一)

抖音seo矩阵营销系统/抖音SEO矩阵号管理系统/抖音霸屏源码开发搭建,抖音官方团队大力推广抖音SEO生态,我们应如何布局开发抖音SEO矩阵系统,来达到账号排名优化的效果,很显然,账号关键词起到了很关键的作用。首先&#…

强化学习笔记-06 Temporal-Difference TD时分学习

本文是博主对《Reinforcement Learning- An introduction》的阅读笔记,不涉及内容的翻译,主要为个人的理解和思考。 TD学习是现代强化学习方法的核心,其是蒙特卡罗法和动态规划法的结合,一方面,其同蒙特卡罗法一样&…

opengauss的pull-request

一个pull-request其实是一个分支,而不是一个提交,所以一个pull-request里可以容纳多个提交,pull-request的提交过程原理很像(应该就是)rebase一个分支,然后将这个分支合入目标分支。 下面是我修改代码并且…

【软件测试】软件测试岗位会越来越少吗?

我的整体意见是测试岗位不会变少,反而相对于其他岗位会变的更重要一些。 首先纠正一个非常非常错误的观念。测试和测试开发是两个岗位?No,不是的。测试开发是属于测试的。 测试开发只不过是使用类似于开发的技术和能力,来达到测…

第十四章 使用Postfix与Dovecot部署邮件系统

文章目录 第十四章 使用Postfix与Dovecot部署邮件系统一、电子邮件系统1、常见的邮件协议2、注意事项 二、部署电子邮件系统1、部署基础的电子邮件系统(1)、配置服务器主机名称(2)、配置服务器的DNS地址(3)…

GDPU C语言 天码行空12 (未完待续)

&#x1f351; C语言实验专栏 编程题 1. 统计文本文件中各类字符的个数 &#x1f351; C语言读写文件 #include <stdio.h> #include<ctype.h> //判断字符类型函数的头文件int main() {FILE *fp1 NULL,*fp2 NULL;fp1 fopen("f1.txt", "w")…