思路:
- 初始化模块
- 登陆模块
- 命令发送模块
- 信息检测模块
- 信息处理模块
#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代表回车