ssh隧道详细使用教程,ssh反向隧道详细教程
本文主要介绍了利用Python实现一个SSH隧道接口功能。该接口由tkinter实现。左边是输入隧道的信息,右边是历史列表。本文通过示例代码为您做了非常详细的介绍,对您的学习或工作有一定的参考价值。请有需要的朋友参考。
00-1010源代码分析开发因果图构建隧道初始化加载启动服务停止服务删除服务缺陷源代码地址
目录
作为一款全能终端神器,MobaXterm非常强大。我经常用隧道功能,不能用内部直达号服务器查询数据。一般来说,一个本地端口对应一个隧道,但是在MobaXterm,免费版最多只能建立三个隧道。比如我需要查询一次统计,我会用四个隧道,很不方便,所以我需要调整一个隧道。所以,我用python写了一个多隧道客户端。
开发原因
该界面由tkinter,实现,左边是输入隧道的信息,右边是历史列表。
效果图
源码分析
def operate _ ssh tunnel(tunnel _ info):
尝试:
tunnel=SSHTunnelForwarder(
(tunnel_info.ssh_ip,int(tunnel_info.ssh_port))。
ssh _用户名=tunnel _ info.ssh _用户名,
ssh _ password=tunnel _ info . ssh _ password,
远程绑定地址=(隧道信息远程ip,int(隧道信息远程端口)),
本地绑定地址=(127.0.0.1 ,int(tunnel_info.localhost_port))
)
返回隧道
e:除外
print(e.args[0])
Messagebox.showinfo(title=异常连接,message=e.args[0])
返回
这段代码是整个功能的核心代码,使用SSHTunnelForwarder的sshtunnel模块。
隧道,因为我只需要一个本地端口来访问远程服务器的功能,默认的本地端口被固定为127.0.0.1.
构建隧道
def read_json():
如果OS . path . exists( tunnel _ data . JSON ):
with open(tunnel_data.json , r ,encoding=utf-8 )作为load_f:
data=load_f.read()
if len(数据)0:
JSON _ str=crypto code . decrypt(data, EJB 55 cvqmn 2 whf )
返回json.loads(json_str)
else:
返回
定义load_config():
load_arr=read_json()
如果load_arr不为None:
对于load_arr:中的隧道信息json
隧道_信息
o = tunnel_info_class()
tunnel_info.localhost_port = tunnel_info_json[localhost_port]
tunnel_info.ssh_ip = tunnel_info_json[ssh_ip]
tunnel_info.ssh_port = tunnel_info_json[ssh_port]
tunnel_info.ssh_username = tunnel_info_json[ssh_username]
tunnel_info.ssh_password = cryptocode.decrypt(tunnel_info_json[ssh_password], "F1jgEg1arVyxmUqC")
tunnel_info.remote_ip = tunnel_info_json[remote_ip]
tunnel_info.remote_port = tunnel_info_json[remote_port]
tunnel_info.tunnel_name = tunnel_info_json[tunnel_name]
tree_id = insert_tree_view(tunnel_info, "未启动")
tunnel_infos.update({tree_id: tunnel_info})
read_json是读取历史记录,其中使用 cryptocode模版对明文的json进行加密,并且对ssh_password进行再加密
开始服务
def start_tunnel():iid = treeview.selection()
if len(iid) > 0:
if iid not in tunnel_infos_start.keys():
tunnel_info = tunnel_infos[iid[0]]
tunnel = ssl_tunnel.operate_sshtunnel(tunnel_info)
if tunnel is not None:
try:
tunnel.start()
tunnel_infos_start.update({iid[0]: tunnel})
update_tree_view(iid[0], tunnel_info, "启动")
pass
except Exception as e:
messagebox.showinfo(title=连接异常, message=e.args[0])
else:
messagebox.showinfo(title=选择异常, message="未选择列表")
tunnel_infos为报存的隧道信息字典,tunnel_infos_start为报存的已经启动的隧道字典,先获取点击到的行的ID,然后查询是否在已启动的字典中,如果不存在则,启动隧道,同时更新到tunnel_infos_start中
停止服务
def stop_tunnel():iid = treeview.selection()
if len(iid) > 0:
if iid[0] in tunnel_infos_start.keys():
tunnel_info = tunnel_infos[iid[0]]
tunnel = tunnel_infos_start[iid[0]]
if tunnel is not None:
try:
tunnel.stop()
tunnel_infos_start.pop(iid[0])
update_tree_view(iid[0], tunnel_info, "未启动")
pass
except Exception as e:
messagebox.showinfo(title=连接异常, message=e.args[0])
else:
messagebox.showinfo(title=选择异常, message="未选择列表")
这段代码操作和启动相反,则是从停止掉服务,同时从tunnel_infos_start中移除掉该隧道
移除服务
def remove_tunnel():iid = treeview.selection()
if len(iid) > 0:
if iid[0] in tunnel_infos_start.keys():
stop_tunnel()
## 从列表删除
treeview.delete(iid)
tunnel_infos.pop(iid[0])
write_json()
else:
messagebox.showinfo(title=选择异常, message="未选择列表")
移除服务的时候,会判断ID在tunnel_infos_start是否存在,存在则表明当前删除的隧道还在启动中,则停止这个服务,同时从tunnel_infos移除这配置,更新tunnel_data.json文件
不足之处
虽然这个简单的工具可以满足超过多个隧道的使用,但是每次报存的时候,都要更新tunnel_data.json文件,如果隧道比较多,加载比较费时间;同时由于设计界面的时候,考虑比较简单,并不支持修改的功能,只能删除错误的记录,然后重新报存
源码地址
https://github.com/liuhao192/ssh_tunnel
到此这篇关于使用Python实现SSH隧道界面功能的文章就介绍到这了,更多相关python SSH隧道内容请搜索盛行IT软件开发工作室以前的文章或继续浏览下面的相关文章希望大家以后多多支持盛行IT软件开发工作室!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。