使用Python实现SSH隧道界面功能

目录
  • 开发原因
  • 效果图
  • 源码分析
    • 构建隧道
    • 初始化加载
    • 开始服务
    • 停止服务
    • 移除服务
  • 不足之处
  • 源码地址

开发原因

MobaXterm作为一个全能型终端神器,功能十分强大,我经常使用其中隧道功能,使用内部无法直接服务器,查询数据,一般来说,一个本地端口对于一个隧道,但是MobaXterm,免费版本最多只能建立三个隧道,比如,我需要一次查询统计,就会用到四个隧道的操作,就非常不方便,需要调整一个隧道,于是,便用python写了多隧道的客户端

效果图

界面使用tkinter实现,左边是输入隧道的信息,右边为历史列表,

源码分析

构建隧道

def operate_sshtunnel(tunnel_info):
    try:
        tunnel = SSHTunnelForwarder(
            (tunnel_info.ssh_ip, int(tunnel_info.ssh_port)),
            ssh_username=tunnel_info.ssh_username,
            ssh_password=tunnel_info.ssh_password,
            remote_bind_address=(tunnel_info.remote_ip, int(tunnel_info.remote_port)),
            local_bind_address=('127.0.0.1', int(tunnel_info.localhost_port))
        )
        return tunnel
    except Exception as e:
        print(e.args[0])
        messagebox.showinfo(title='连接异常', message=e.args[0])
        return

这段代码就是整个功能的核心代码,使用SSHTunnelForwarder模块的sshtunnel

构建隧道,由于我只需要一个本地端口访问远程远程服务器的功能,默认本地端口固定为127.0.0.1

初始化加载

def read_json():
    if os.path.exists('tunnel_data.json'):
        with open('tunnel_data.json', 'r', encoding='utf-8') as load_f:
            data = load_f.read()
        if len(data) > 0:
            json_str = cryptocode.decrypt(data, "EjdeB55cvQMN2WHf")
            return json.loads(json_str)
        else:
            return
def load_config():
    load_arr = read_json()
    if load_arr is not None:
        for tunnel_info_json in load_arr:
            tunnel_info = 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="未选择列表")

移除服务的时候,会判断IDtunnel_infos_start是否存在,存在则表明当前删除的隧道还在启动中,则停止这个服务,同时从tunnel_infos移除这配置,更新tunnel_data.json文件

不足之处

虽然这个简单的工具可以满足超过多个隧道的使用,但是每次报存的时候,都要更新tunnel_data.json文件,如果隧道比较多,加载比较费时间;同时由于设计界面的时候,考虑比较简单,并不支持修改的功能,只能删除错误的记录,然后重新报存

源码地址

https://github.com/liuhao192/ssh_tunnel

到此这篇关于使用Python实现SSH隧道界面功能的文章就介绍到这了,更多相关python SSH隧道内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • python 通过SSHTunnelForwarder隧道连接redis的方法

    背景:我司Redis服务器使用的亚马逊服务,本地需要通过跳板机,然后才有权限访问Redis服务. 连接原理:使用SSHTunnelForwarder模块,通过本地22端口ssh到跳板机,然后本地开启一个转发端口给跳板机远程Redis服务使用. 两种思路: 1.通过SSHTunnelForwarder,paramiko模块,先ssh到跳板机,然后在跳板机上(或者内部服务器上),获取到权限,然后远程Redis. 2.使用SSHTunnelForwarder模块,通过本地22端口ssh到跳板机,然后本

  • python3 使用ssh隧道连接mysql的操作

    我就废话不多说了,大家还是直接看代码吧~ import pymysql from sshtunnel import SSHTunnelForwarder import pymysql.cursors #以dict形式输出 def dbconnect_ssh(ssh_host,ssh_port,keyfile,ssh_user,db_host,db_name,sql,db_port,db_user,db_passwd): with SSHTunnelForwarder( (ssh_host, ss

  • 使用Python实现SSH隧道界面功能

    目录 开发原因 效果图 源码分析 构建隧道 初始化加载 开始服务 停止服务 移除服务 不足之处 源码地址 开发原因 MobaXterm作为一个全能型终端神器,功能十分强大,我经常使用其中隧道功能,使用内部无法直接服务器,查询数据,一般来说,一个本地端口对于一个隧道,但是MobaXterm,免费版本最多只能建立三个隧道,比如,我需要一次查询统计,就会用到四个隧道的操作,就非常不方便,需要调整一个隧道,于是,便用python写了多隧道的客户端 效果图 界面使用tkinter实现,左边是输入隧道的信息

  • python实现ssh及sftp功能(实例代码)

    1.在Linux上我们通过scp命令实现主机间的文件传送,通过ssh实现远程登录 ,比如 我们经常使用的xshell远程登录工具,就是基础ssh协议实现window主机远程登录Linux主机 下面简单的在python实现这几个功能   下面使用到paramiko模块,这个不是python的内置模块,我直接通过pycharm下载这个模块, 第一步实现一个简单的ssh登录命令 代码如下: import paramiko # 创建SSH对象 ssh = paramiko.SSHClient() # 允

  • Python集成C#实现界面操作下载文件功能的全过程

    目录 〇.写在前面 一.这个功能是怎么样的 二.WinForm 端功能实现 1. 界面设计 2. 方法定义 三.Python 端功能实现 四.运行效果 五.存在问题 总结 〇.写在前面 你想的没错,Python 和 C# 其实都可以单独实现我们要实现的功能,这里笔者只是抱着实验及学习的态度去解决问题. 我是一个 C# 程序员,目前在学习 Python,对于 Python 得天独厚的胶水语言特性自然是必须要领略一番,于是就有了本文. 学会了 Python 调用 C# 的话,就能做很多想到和想不到的

  • Python实现ssh批量登录并执行命令

    局域网内有一百多台电脑,全部都是linux操作系统,所有电脑配置相同,系统完全相同(包括用户名和密码),ip地址是自动分配的.现在有个任务是在这些电脑上执行某些命令,者说进行某些操作,比如安装某些软件,拷贝某些文件,批量关机等.如果一台一台得手工去操作,费时又费力,如果要进行多个操作就更麻烦啦. 或许你会想到网络同传,网络同传是什么?就是在一台电脑上把电脑装好,配置好,然后利用某些软件,如"联想网络同传"把系统原样拷贝过去,在装系统时很有用,只要在一台电脑上装好,同传以后所有的电脑都装

  • python实现网页自动签到功能

    本文实例为大家分享了python实现网页自动签到功能的具体代码,供大家参考,具体内容如下 第1步.环境准备(用的chrome浏览器) 1.安装selenium包 pip install selenium 2.下载chromedriver驱动: 找到符合自己浏览器版本的chromedriver驱动,下载解压后,将chromedriver.exe文件放到Python目录下的Scripts目录下,也可以添加环境变量到Path中: 第2步.Selenium脚本源码 比较简单,而且有详细注释就不一一说明了

  • Mysql SSH隧道连接使用的基本步骤

    前言 为了安全,mysql的root用户只本机登录,不对外网进行授权访问,此时可通过SSH隧道连接mysql数据库.以下为配置Mysql SSH隧道连接的基本步骤. 下面话不多说了,来一起看看详细的步骤吧 删除远程登录 登录mysql: mysql -uroot -p 查看用户开放的访问权限: select user, host from mysql.user; 删除不需要的访问权限,比如: delete from mysql.user where user='root' and host='%

  • 详解Selenium+PhantomJS+python简单实现爬虫的功能

    Selenium 一.简介 selenium是一个用于Web应用自动化程序测试的工具,测试直接运行在浏览器中,就像真正的用户在操作一样 selenium2支持通过驱动真实浏览器(FirfoxDriver,IternetExplorerDriver,OperaDriver,ChromeDriver) selenium2支持通过驱动无界面浏览器(HtmlUnit,PhantomJs) 二.安装 Windows 第一种方法是:下载源码安装,下载地址(https://pypi.python.org/py

  • python pexpect ssh 远程登录服务器的方法

    使用了python中的pexpect模块,在测试代码之前,可输入python进入交互界面,输入help('pexpect'),查询是否本地含有pexpect模块. 如果没有,linux系统输入 easy_install pexpect便可自动安装. 测试代码,连接127.0.0.1 下面是我手动连接127.0.0.1, 发现只有在首次使用ssh连接127.0.0.1时,需要输入yes or no ,而后再次使用ssh ,则不需要再次输入yes 直接输入密码即可. 后续测试代码是二次链接,无需查询

  • python通过SSH登陆linux并操作的实现

    用的昨天刚接触到的库,在windows下通过paramiko来登录linux系统并执行了几个命令,基本算是初试成功,后面会接着学习的. 代码: >>> import paramiko >>> ssh = paramiko.SSHClient() >>> ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) >>> ssh.connect('10.104.6.8',usern

随机推荐