【python--程序】python socket 编写telnet客户端

思路:

  1. 初始化模块
  2. 登陆模块
  3. 命令发送模块
  4. 信息检测模块
  5. 信息处理模块
#0. init模块
class Telnet():     #定义一个Telnet类
	def __init__(self):
		self.remote_addr = "192.168.1.254"
		#定义远程主机地址
	    self.remote_port = 23
	    #定义远程主机端口
	    self.username = "admin"
	    #定义登陆的用户名
	    self.password = "admin"
	    #定义登陆的密码
	   	selt.timeout= 5
	   	#定义超时时间为1秒
	   	self.login_timeout = 1
	   	#定义登陆超时时间为1秒
        self.send_cmd_timeout=0.5
        #定义命令发送超时时间为0.5秒
        self.system_name = ""
        #定义系统名称为空
        self.buffer = 4096
        #定义缓存区大小为4096
        self.file_name = self.remote_addr+".log"
        #定义保存名称
	   	self.Initialization()
	   	#调用初始化模块
#1.初始化模块
def Initialization(self):
	self.client = socket.socket()      
	#创建一个client对象
    self.client.connect((self.remote_addr,self.remote_port))
    #将客户端连接到远程主机  
    self.client.settimeout(self.timeout)
    #设置默认超时时间

def Initialization_file(self):
	self.file_name = (self.system_name+self.remote_addr+".log").replace("\r\n#\r\n","")
	#修改保存名称
	print (self.file_name)
	#打印保存名称
	with open (self.file_name,"w") as save_object:
		save_object.write("")
		#创建保存的文件
#2.登陆模块
def login(self):
	 tag = 0
	 #将标志位设置为0
	 while True:
	 #创建一个循环
	 	if  not (tag == 1):
	 	#检测表示位是否不等于1
		 	self.client.send("\n".encode())
		 	#发送一个空的字符串用以激活telnet
	        time.sleep(self.login_timeout)
        #等待1秒
        data = self.client.recv(self.buffer)
        #接收返回的数据
        if b"Username" in data:
        #检查收到的数据中是否包含"Username",检测是否提示输入用户名
        	print (data)
        	#如果检测到了则打印接收到的数据
        else:
        #如果没有检测到
            print ("没有找到用户名")
            #打印没有找到用户名
            tag = 1
            #将标志位设置位1                 
            continue
            #重新开始执行循环
 	    self.client.send((self.username+"\n").encode())
 	    #发送用户名
        print ("发送:"+(self.username+"\n"))
        #打印发送的用户名
        time.sleep(self.login_timeout)
        #等待1秒
        data = self.client.recv(self.buffer)
        #接收返回的数据
        if b"Password" in data:
        #检查收到的数据中是否包含"Password",检测是否提示输入密码
            print (data)
            #如果检测到了则打印接收到的数据
        else:
         #如果没有检测到
            print ("没有找到密码")
            #打印没有找到密码
            tag = 1
            #将标志位设置位1            
            continue
            #重新开始执行循环
        self.client.send((self.password+"\n").encode())
        #发送密码
        print ("发送:"+(self.password+"\n"))
        #打印发送的密码
        time.sleep(self.login_timeout)
        #等待1秒
        data = self.client.recv(self.buffer)
        #接收返回的数据
        if b">" in data:
        #检查收到的数据中是否包含">",检测是否登陆成功
             print ("登陆成功")
             #如果检测到了则打印登陆成功
             break
             #退出循环
        else:
        #如果没有检测到
             print ("登陆失败,正在重新登陆")
             #打印登陆失败,正在重新登陆
             tag = 1
             #将标志位设置位1
             continue
             #重新开始执行循环
#3.命令发送模块
def send_cmd(self,cmd):
	self.client.send(("   "+cmd+"\n").encode())
	print ("发送命令:"+("   "+cmd+"\n"))
	#发送命令
	time.sleep(self.send_cmd_timeout)
	#等待0.5秒
	data = self.client.recv(self.buffer)
	#接收数据
	tag = self.recv(data)
	#将数据提交个检测模块,并将返回值存如tag中
	print (tag)
	#打印标志位
	while True:
	#创建循环
		if tag == 0:
		#检查标志位是否为0
			self.client.send("    \n".encode())
			#为0则发送空格
			print ("发送空格")
			#打印发送空格的消息
			time.sleep(self.send_cmd_timeout)
			#等待0.5秒
			data = self.client.recv(self.buffer)
			#接收数据
			tag = self.recv(data)
			#再次将数据提交给检测模块
		else:
		#如果标志位不为0
			break
			#退出循环
#4. 消息检测模块
def recv(self,data):
	if b"---- More ----" in data:
	#检测是否在数据中包括 "---- More ----"
		self.output(data)
		#将数据提交给数据处理模块
		return 0
		#返回数字0
	else:
	#如果没有检测到
		self.output(data)
		#将数据提交给数据处理模块
		return 1
		#返回数字1
#5. 数据处理模块
def output(self,data):
	msg = data.decode().replace("[16D                [16D","").replace("  ---- More ----","")
	#将数据转化为字符格式,并去除垃圾字符
	if "sysname" in msg.split(" "):
	#以空格为分割符切割为列表检测“sysname” 是否存在于列表中
		number =  msg.split(" ").index("sysname")
		#弹出“sysname”存在的索引
		self.system_name = msg.split(" ")[number+1]
		#修改全局变量system_name的内容为sysname
		self.Initialization_file()
		#激活文件初始化函数
	print (msg)
	#打印数据

完整代码及使用

import socket
import time

class Telnet():
    def __init__(self):
        self.remote_addr = "192.168.1.254"
        self.remote_port = 23
        self.username = "admin"
        self.password = "admin"
        self.timeout= 5
        self.login_timeout = 1
        self.send_cmd_timeout=0.5
        self.system_name = ""
        self.buffer = 4096
        self.file_name = self.remote_addr+".log"
        

    ##########################初始化

    def Initialization_continue(self):
        self.client = socket.socket()
        self.client.connect((self.remote_addr,self.remote_port))
        self.client.settimeout(self.timeout)


    def Initialization_file(self):
        self.file_name = (self.system_name+self.remote_addr+".log").replace("\r\n#\r\n","")
        print (self.file_name)
        with open (self.file_name,"w") as save_object:
            save_object.write("")

    ##########################登陆
    
    def login(self,):
        tag = 0
        while True:
            if  not (tag == 1):
                self.client.send("\n".encode())
                time.sleep(self.login_timeout)
            data = self.client.recv(self.buffer)
            if b"Username" in data:
                print (data)
            else:
                print ("没有找到用户名")
                tag = 1
                continue
            self.client.send((self.username+"\n").encode())
            print ("发送:"+(self.username+"\n"))
            time.sleep(self.login_timeout)
            data = self.client.recv(self.buffer)
            if b"Password" in data:
                print (data)
            else:
                print ("没有找到密码")
                tag = 1
                continue
            self.client.send((self.password+"\n").encode())
            print ("发送:"+(self.password+"\n"))
            time.sleep(self.login_timeout)
            data = self.client.recv(self.buffer)
            if b">" in data:
                print ("登陆成功")
                break
            else:
                print ("登陆失败,正在重新登陆")
                tag = 1
                continue

    ############################发送命令

    def send_cmd(self,cmd):
        self.client.send(("   "+cmd+"\n").encode())
        print ("发送命令:"+("   "+cmd+"\n"))
        #发送命令
        time.sleep(self.send_cmd_timeout)
        data = self.client.recv(self.buffer)
        tag = self.recv(data)
        print (tag)
        while True:
            if tag == 0:
                self.client.send("    \n".encode())
                print ("发送空格")
                time.sleep(self.send_cmd_timeout)
                data = self.client.recv(self.buffer)
                tag = self.recv(data)
            else:
                break
                

    def recv(self,data):
        if b"---- More ----" in data:
            self.output(data)
            return 0
        else:
            self.output(data)
            return 1
        if not ((b">" in data) or (b"[" in data)):
            self.output(data)
            return 0

            

    def output(self,data):
        msg = data.decode().replace("[16D                [16D","").replace("  ---- More ----","")
        if "sysname" in msg.split(" "):
            number =  msg.split(" ").index("sysname")
            self.system_name = msg.split(" ")[number+1]
            self.Initialization_file()
        print (msg)
        with open (self.file_name,"a") as save_object:
            save_object.write(msg)

    
            
        
            
            
            
                
telnet = Telnet()
ips  = ["192.168.1.50","192.168.1.254"]
for ip in ips:
    telnet.remote_addr = ip
    telnet.Initialization_continue()
    telnet.login()
    telnet.send_cmd("dis cur")
    telnet.send_cmd('dis ip int brief')
    telnet.send_cmd("dis int brief")
    telnet.send_cmd("dis arp")
    telnet.send_cmd("dis version")

telnet中 \n代表回车
  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值