[Python] python 创建 Telnet 客户端
作者:CC下载站 日期:2023-10-11 19:28:55 浏览:50 分类:编程开发
前言
最近由于某些特殊项目的需要,匆忙通过 python 实现了一个简易版的 Telnet 客户端。这个客户端目前来说是有缺陷的(比如,不能 vi 读写文件内容,不能执行阻塞型命令 ping 等),但是感觉比较好玩,所以想与大家分享一下。
1. Telnet 客户端框架
2. Telnet 代码分解
接下来,我们就基于 Telnet客户端框架 来逐步拆分讲解代码构成。
2.1 基于 TK 创建会话窗口
# 创建窗口并设置标题 window = tk.Tk() window.title("Telnet客户端") # 设置tk.Tk窗口的背景颜色为浅蓝色 window.config(bg="sky blue")
2.1.1 创建 Text 文本控件
# 创建一个Text文本控件 console_text = tk.Text(window, width=200, height=70, bg="black", fg="white") console_text.pack(pady=5) # 定义一个字体样式 console_text.tag_configure("bold_tag", font=("Arial", 11))
2.1.2 创建 Frame 容器
# 创建一个Frame用于放置输入框和按钮,并设置Frame在下方空开5个空格 frame = tk.Frame(window, bg="sky blue") frame.pack(pady=5)
2.1.2.1 基于 Frame 容器创建主机地址输入框
# 创建一个输入框控件,并放置在Frame中,同时设置右侧空开3个空格 host_addr_entry = tk.Entry(frame, width=50, font=("Arial", 12, "bold")) host_addr_entry.insert(0, "请输入主机地址...") host_addr_entry.config(fg="gray") host_addr_entry.pack(side=tk.LEFT, padx=3)
2.1.2.1.1 主机地址输入框绑定焦点事件
# 绑定获取焦点和失去焦点事件,显示和隐藏提示语 host_addr_entry.bind("<FocusIn>", on_host_entry_focus_in) host_addr_entry.bind("<FocusOut>", on_host_entry_focus_out) # 获取焦点事件 def on_host_entry_focus_in(event): if host_addr_entry.get() == "请输入主机地址...": host_addr_entry.delete(0, tk.END) host_addr_entry.config(fg="black") # 失去焦点事件 def on_host_entry_focus_out(event): if host_addr_entry.get() == "": host_addr_entry.insert(0, "请输入主机地址...") host_addr_entry.config(fg="gray")
2.1.2.2 创建 Telnet 连接按钮控件
# 创建一个按钮控件,并放置在Frame中 connect_button = tk.Button(frame, text="连接 Telnet", font=("Arial", 12, "bold"), fg="white", bg="#46C0FB", command=connect_telnet) connect_button.pack(side=tk.LEFT, padx=3)
2.1.2.3 创建 Telnet 断开按钮控件
# 创建断开按钮控件,并放置在Frame中,右侧空开3个空格 disconnect_button = tk.Button(frame, text="断开 Telnet", font=("Arial", 12, "bold"), fg="white", bg="#46C0FB", command=disconnect_telnet, state=tk.DISABLED) disconnect_button.pack(side=tk.LEFT, padx=3)
2.1.2.4 基于 Frame 容器创建发送命令输入框
# 创建一个输入框控件,并放置在Frame中,同时设置右侧空开3个空格 command_entry = tk.Entry(frame, width=50, font=("Arial", 12, "bold")) command_entry.insert(0, "请发送指令...") command_entry.config(fg="gray") command_entry.pack(side=tk.LEFT, padx=12)
2.1.2.4.1 发送命令输入框绑定焦点事件
# 绑定获取焦点和失去焦点事件,显示和隐藏提示语 command_entry.bind("<FocusIn>", on_entry_focus_in) command_entry.bind("<FocusOut>", on_entry_focus_out) # 获取焦点事件 def on_entry_focus_in(event): if command_entry.get() == "请发送指令...": command_entry.delete(0, tk.END) command_entry.config(fg="black") # 失去焦点事件 def on_entry_focus_out(event): if command_entry.get() == "": command_entry.insert(0, "请发送指令...") command_entry.config(fg="gray")
2.1.2.5 创建执行命令按钮控件
# 创建执行按钮控件,并放置在Frame中,右侧空开3个空格 execute_button = tk.Button(frame, text="执行命令", font=("Arial", 12, "bold"), fg="white", bg="#46C0FB", command=execute_command, state=tk.DISABLED) execute_button.pack(side=tk.LEFT)
2.2 Telnet 连接与断开服务器过程
2.2.1 Telnet 连接服务器
def connect_telnet(): host = host_addr_entry.get() # 获取输入框内的主机地址 port = 23 # 默认telnet端口 username = ';root'; # 登录用户名 password = ';123456'; # 登录密码 try: # 连接Telnet服务器 telnet_client = telnetlib.Telnet(host, port, timeout=5) console_text.insert(tk.END, "成功连接到Telnet服务器。\n", "bold_tag") connect_button.config(state=tk.DISABLED) disconnect_button.config(state=tk.NORMAL) execute_button.config(state=tk.NORMAL) # 输入登录用户名 telnet_client.read_until(b';login:';) telnet_client.write(username.encode(';ascii';) + b"\n") # 输入登录密码 telnet_client.read_until(b';Password:';) telnet_client.write(password.encode(';ascii';) + b"\n") print(';成功登录到设备:'; + host) # 启动后台信息接收线程 receive_thread = threading.Thread(target=receive_background_info) receive_thread.start() except Exception as e: console_text.insert(tk.END, f"连接失败: {e}\n", "bold_tag")
2.2.2 Telnet 断开服务器
def disconnect_telnet(): if telnet_client: telnet_client.close() console_text.insert(tk.END, "已断开Telnet连接。\n", "bold_tag") connect_button.config(state=tk.NORMAL) disconnect_button.config(state=tk.DISABLED) execute_button.config(state=tk.DISABLED)
2.3 Telnet 会话交互过程
2.3.1 Telnet 客户端向服务器发送命令
def execute_command(): command = command_entry.get() + "\n" telnet_client.write(command.encode(';ascii';)) command_entry.delete(0, tk.END)
2.3.2 Telnet 客户端接收服务器返回的数据
def receive_background_info(): while True: try: output_data = telnet_client.read_very_eager().decode(';utf-8';) if output_data: clean_color_data = remove_color_codes(output_data.strip()) console_text.insert(tk.END, clean_color_data, "bold_tag") time.sleep(0.5) except EOFError: break except Exception as e: console_text.insert(tk.END, f"错误: {e}\n", "bold_tag") break def remove_color_codes(data): # 使用正则表达式匹配ANSI转义码,并替换为空字符串 ansi_escape = re.compile(r';\x1B\[[0-?]*[ -/]*[@-~]';) return ansi_escape.sub(';';, data)
3. Telnet 客户端代码总览
import tkinter as tk import telnetlib import threading import time import re class TeneltTool: def __init__(self): self.window = tk.Tk() self.window.title("Telnet客户端") # 设置tk.Tk窗口的背景颜色为浅蓝色 self.window.config(bg="sky blue") # 创建一个200x70的Text文本控件,并且设置背景为黑色 self.console_text = tk.Text(self.window, width=200, height=70, bg="black", fg="white") self.console_text.pack(pady=5) # 定义一个字体样式 self.console_text.tag_configure("bold_tag", font=("Arial", 11)) # 创建一个Frame用于放置输入框和按钮,并设置Frame在下方空开5个空格 frame = tk.Frame(self.window, bg="sky blue") frame.pack(pady=5) # 创建一个输入框控件,并放置在Frame中,同时设置右侧空开3个空格 self.host_addr_entry = tk.Entry(frame, width=50, font=("Arial", 12, "bold")) self.host_addr_entry.insert(0, "请输入主机地址...") self.host_addr_entry.config(fg="gray") self.host_addr_entry.pack(side=tk.LEFT, padx=3) # 创建一个按钮控件,并放置在Frame中 self.connect_button = tk.Button(frame, text="连接 Telnet", font=("Arial", 12, "bold"), fg="white", bg="#46C0FB", command=self.connect_telnet) self.connect_button.pack(side=tk.LEFT, padx=3) # 创建断开按钮控件,并放置在Frame中,右侧空开3个空格 self.disconnect_button = tk.Button(frame, text="断开 Telnet", font=("Arial", 12, "bold"), fg="white", bg="#46C0FB", command=self.disconnect_telnet, state=tk.DISABLED) self.disconnect_button.pack(side=tk.LEFT, padx=3) # 绑定获取焦点和失去焦点事件,显示和隐藏提示语 self.host_addr_entry.bind("<FocusIn>", self.on_host_entry_focus_in) self.host_addr_entry.bind("<FocusOut>", self.on_host_entry_focus_out) # 创建一个输入框控件,并放置在Frame中,同时设置右侧空开3个空格 self.command_entry = tk.Entry(frame, width=50, font=("Arial", 12, "bold")) self.command_entry.insert(0, "请发送指令...") self.command_entry.config(fg="gray") self.command_entry.pack(side=tk.LEFT, padx=12) # 绑定获取焦点和失去焦点事件,显示和隐藏提示语 self.command_entry.bind("<FocusIn>", self.on_entry_focus_in) self.command_entry.bind("<FocusOut>", self.on_entry_focus_out) # 创建执行按钮控件,并放置在Frame中,右侧空开3个空格 self.execute_button = tk.Button(frame, text="执行命令", font=("Arial", 12, "bold"), fg="white", bg="#46C0FB", command=self.execute_command, state=tk.DISABLED) self.execute_button.pack(side=tk.LEFT) self.telnet_client = None self.receive_thread = None def on_host_entry_focus_in(self, event): if self.host_addr_entry.get() == "请输入主机地址...": self.host_addr_entry.delete(0, tk.END) self.host_addr_entry.config(fg="black") def on_host_entry_focus_out(self, event): if self.host_addr_entry.get() == "": self.host_addr_entry.insert(0, "请输入主机地址...") self.host_addr_entry.config(fg="gray") def on_entry_focus_in(self, event): if self.command_entry.get() == "请发送指令...": self.command_entry.delete(0, tk.END) self.command_entry.config(fg="black") def on_entry_focus_out(self, event): if self.command_entry.get() == "": self.command_entry.insert(0, "请发送指令...") self.command_entry.config(fg="gray") def connect_telnet(self): host = self.host_addr_entry.get() # 获取输入框内的主机地址 port = 23 # 默认telnet端口 username = ';root'; # 登录用户名 password = ';123456'; # 登录密码 try: # 连接Telnet服务器 self.telnet_client = telnetlib.Telnet(host, port, timeout=5) self.console_text.insert(tk.END, "成功连接到Telnet服务器。\n", "bold_tag") self.connect_button.config(state=tk.DISABLED) self.disconnect_button.config(state=tk.NORMAL) self.execute_button.config(state=tk.NORMAL) # 输入登录用户名 self.telnet_client.read_until(b';login:';) self.telnet_client.write(username.encode(';ascii';) + b"\n") # 输入登录密码 self.telnet_client.read_until(b';Password:';) self.telnet_client.write(password.encode(';ascii';) + b"\n") print(';成功登录到设备:'; + host) # 启动后台信息接收线程 self.receive_thread = threading.Thread(target=self.receive_background_info) self.receive_thread.start() except Exception as e: self.console_text.insert(tk.END, f"连接失败: {e}\n", "bold_tag") def disconnect_telnet(self): if self.telnet_client: self.telnet_client.close() self.console_text.insert(tk.END, "已断开Telnet连接。\n", "bold_tag") self.connect_button.config(state=tk.NORMAL) self.disconnect_button.config(state=tk.DISABLED) self.execute_button.config(state=tk.DISABLED) def execute_command(self): command = self.command_entry.get() + "\n" self.telnet_client.write(command.encode(';ascii';)) self.command_entry.delete(0, tk.END) def receive_background_info(self): while True: try: output_data = self.telnet_client.read_very_eager().decode(';utf-8';) if output_data: clean_color_data = self.remove_color_codes(output_data.strip()) self.console_text.insert(tk.END, clean_color_data, "bold_tag") # self.console_text.see(tk.END) time.sleep(0.5) except EOFError: break except Exception as e: self.console_text.insert(tk.END, f"错误: {e}\n", "bold_tag") break def remove_color_codes(self, data): # 使用正则表达式匹配ANSI转义码,并替换为空字符串 ansi_escape = re.compile(r';\x1B\[[0-?]*[ -/]*[@-~]';) return ansi_escape.sub(';';, data) if __name__ == "__main__": tenelt_tool = TeneltTool() tenelt_tool.window.mainloop()
4. Telnet 客户端效果展示
5. 总结
由于这个工具是匆忙之间创作的,所以还存在一些缺陷,大家如果感兴趣,就拷贝源码自行优化吧。
好啦,本章内容到此结束,感谢大家的热爱与支持~
猜你还喜欢
- 03-04 [服务器类]iis6.0安装包
- 04-07 [QQ专区]qq服务器拒绝了您发送离线文件解决方法
- 07-10 [玩网络] 服务器防火墙规则及进出站端口设置
- 08-20 [教程] 商梦网校VPS服务器管理教程
- 10-21 [操作系统]《红帽企业Linux 5.9服务器版》(Red Hat Enterprise Linux 5.9 Server)x86/64[光盘镜像]
- 04-07 [棋牌源码] 颂游棋牌各种教程各种端带服务器,一锅鲜大聚会
- 05-27 [站长帮] 宝塔的PHP环境下,服务器大量php-cgi.exe进程导致CPU占用100%
- 06-02 [服务器教程] ZBench: 服务器一键测试脚本 / 自带结果导出
- 08-12 [黑客软件] 御剑RDP爆破工具_暴力批量破解服务器
- 10-04 [服务器] 打开网站显示“No input file specified.”的解决方法
- 10-23 [服务搭建] 服务器Windows 2008系统安装IIS
- 10-29 [网络资源] Amazon Lightsail 一键管理服务器脚本
取消回复欢迎 你 发表评论:
- 精品推荐!
-
- 最新文章
- 热门文章
- 热评文章
[电影] 《环太平洋两部合集》 4K REMUX原盘 [杜比视界] 国英双语音轨 [内封特效字幕] [133.8G]
[电影] 异人之下 The Traveller 2024✨【影版】【4K正式版/HQ超高码/DDP5.1】✚【1080高码】无水印/无压缩
[动漫] 头文字D 动漫 (1998) S01-S06季 1080P 国粤日音轨 续作 剧场版 电影
[小说] 知轩藏书全站7667册txt小说合集精心校对版
[杂志] 电脑爱好者杂志14年 超全 [PDF]
[电影] 西游记全部版本-4K高清修复-总计384G-1986+1996+1998+2002+2010浙版+西游记后传
[纪录片] 【国家地理百年纪念典藏】超经典100集全 MP4格式 (绝佳学习资料)27GB
[纪录片] B站食贫道收费纪录片 *迷失东京* [1080P] 揭露日本大家感兴趣却不为人知的秘密
[网络线报] 城通网盘福利线报解析器 - 获取直连下载地址
[福利线报] 一个「脚本」搞定六大网盘(百度/阿里/天翼/迅雷/夸克/移动)
[游戏] 《黑神话悟空》免安装学习版【全dlc整合完整版】+Steam游戏解锁+游戏修改工具!
[动画] 《名侦探柯南》名侦探柯南百万美元的五菱星 [TC] [MP4]
[电视剧集] [BT下载][黑暗城市- 清扫魔 Dark City: The Cleaner 第一季][全06集][英语无字][MKV][720P/1080P][WEB-RAW]
[涨点姿势] 男性性技宝典:14招实战驭女术——爱抚、按摩、催情、姿势、高潮全攻略
[动画] 2002《火影忍者》720集全【4K典藏版】+11部剧场版+OVA+漫画 内嵌简日字幕
[剧集] 《斯巴达克斯》1-4季合集 无删减版 1080P 内嵌简英特效字幕
[CG剧情] 《黑神话:悟空》158分钟CG完整剧情合集 4K120帧最高画质
[短剧] 被下架·禁播的羞羞短剧·午夜短剧合集
[游戏] 黑神话悟空离线完整版+修改器
[图像处理] 光影魔术手v4.6.0.578绿色版
[影视] 美国内战 4K蓝光原盘下载+高清MKV版/内战/帝国浩劫:美国内战(台)/美帝崩裂(港) 2024 Civil War 63.86G
[影视] 一命 3D 蓝光高清MKV版/切腹 / 切腹:武士之死 / Hara-Kiri: Death of a Samurai / Ichimei 2011 一命 13.6G
[影视] 爱情我你他 蓝光原盘下载+高清MKV版/你、我、他她他 2005 Me and You and Everyone We Know 23.2G
[影视] 穿越美国 蓝光原盘下载+高清MKV版/窈窕老爸 / 寻找他妈…的故事 2005 Transamerica 20.8G
[电影] 《黄飞鸿》全系列合集
[Android] 开罗游戏 ▎像素风格的模拟经营的游戏厂商安卓游戏大合集
[游戏合集] 要战便战 v0.9.107 免安装绿色中文版
[资源] 精整2023年知识星球付费文合集136篇【PDF格式】
[系统]【黑果小兵】macOS Big Sur 11.0.1 20B50 正式版 with Clover 5126 黑苹果系统镜像下载
[美图] 【经典收藏美图集合】1500多张韩国美女高清图片让你的收藏夹更加丰富多彩
- 最新评论
-
有靳东!嘻嘻奥古斯都.凯撒 评论于:10-28 流星花园是F4处女作也是4人集体搭配的唯一一部!奥古斯都.凯撒 评论于:10-28 找了好久的资源,终于在这里找到了。感谢本站的资源和分享。谢谢AAAAA 评论于:10-26 找了好久的资源,终于在这里找到了。感谢本站的资源和分享。谢谢password63 评论于:10-26 找了好久的资源,终于在这里找齐了!!!!blog001 评论于:10-21 找了好久的资源,终于在这里找齐了!!!!blog001 评论于:10-21 找了好久的资源,终于在这里找到了。感谢本站的资源和分享。谢谢WillKwok 评论于:10-09 感谢分享1234123 评论于:10-07 太好了终于找到了谢谢Tom 评论于:10-07 谢谢分享loonghd 评论于:09-30
- 热门tag