python脚本 ssh工具 ssh上传文档 选择文档并上传到ssh服务器

news2025/1/19 8:17:18

此文分享一个python脚本,用于快速的定位、选择文档,并将其上传到指定的ssh服务器。

效果演示

  • 🔥完整演示效果
    20231223201913_rec_

  • 👇第一步,显然,我们需要选择功能
    20231223202237

  • 👇第二步,我们需要定位并选择需要上传的文档
    20231223202341

  • 👇第三步,确认我们需要上传文档的ssh服务器
    20231223202605

  • 👇第四步,定位、选择、确认目标路径
    20231223203016

  • 👇第五步,确认上传文档
    20231223203134

配置文件

我们需要在配置文件中记录和管理一些配置信息,例如上文中提到的ssh登录信息,例如用于文档搜索的everything接口信息等。这是一个json文档(cfg.json),如下👇:

{
   
"ssh接口列表":[{
   "主机名称":"virtualBox","主机地址":"192.168.56.1","端口号":22,"用户名":"dyy","密码":"123456"}],
"everythingIP":"127.0.0.1",
"everythingPort":"22"
}

或者,可以直接下载文档

python脚本

👇以下脚本,提供了以上👆所演示的功能

# -*- coding:UTF-8 -*-
"""
@author: dyy
@contact: douyaoyuan@126.com
@time: 2023/11/16 22:37
@file: ssh工具.py
@desc: 脚本提供了ssh登录,ssh文档上传,ssh文档下载,ssh公钥配置等功能,以及优良的用户体验
"""

# region 引入必要的依赖
import os
from enum import Enum
import json

模块名 = 'DebugInfo'
try:
    from DebugInfo.DebugInfo import *
except ImportError as impErr:
    print(f"尝试导入 {
     模块名} 依赖时检测到异常:{
     impErr}")
    print(f"尝试安装 {
     模块名} 模块:")
    try:
        os.system(f"pip install {
     模块名}")
    except OSError as osErr:
        print(f"尝试安装模块 {
     模块名} 时检测到异常:{
     osErr}")
        exit(0)
    else:
        try:
            from DebugInfo.DebugInfo import *
        except ImportError as impErr:
            print(f"再次尝试导入 {
     模块名} 依赖时检测到异常:{
     impErr}")
            exit(0)

模块名 = 'paramiko'
try:
    import paramiko
except ImportError as impErr:
    print(f"尝试导入 {
     模块名} 依赖时检测到异常:{
     impErr}")
    print(f"尝试安装 {
     模块名} 模块:")
    try:
        os.system(f"pip install {
     模块名}")
    except OSError as osErr:
        print(f"尝试安装模块 {
     模块名} 时检测到异常:{
     osErr}")
        exit(0)
    else:
        try:
            import paramiko
        except ImportError as impErr:
            print(f"再次尝试导入 {
     模块名} 依赖时检测到异常:{
     impErr}")
            exit(0)

模块名 = 'difflib'
try:
    import difflib  # 需要安装 difflib 模块,以支持字符差异对比操作
except ImportError as impErr:
    print(f"尝试导入 {
     模块名} 依赖时检测到异常:{
     impErr}")
    print(f"尝试安装 {
     模块名} 模块:")
    try:
        os.system(f"pip install {
     模块名}")
    except OSError as osErr:
        print(f"尝试安装模块 {
     模块名} 时检测到异常:{
     osErr}")
        exit(0)
    else:
        try:
            import difflib
        except ImportError as impErr:
            print(f"再次尝试导入 {
     模块名} 依赖时检测到异常:{
     impErr}")
            exit(0)


# endregion

# 定义一个 命令行参数类,用于解析和记录命令行参数
class 命令行参数类(入参基类):
    def __init__(self):
        super().__init__()
        self._添加参数('srcDir', str, '引用的路径')
        self._添加参数('srcDoc', str, '引用的文档')
        self._添加参数('everythingIP', str, 'everything HTTP 服务地址', '127.0.0.1')
        self._添加参数('everythingPort', str, 'everything HTTP 服务端口', '22')
        # 添加定制属性
        self.ssh接口列表: list[ssh接口类] = []

    # region 访问器
    @property
    def jsonCfg(self) -> str:
        if 'jsonCfg' in self._参数字典:
            return self._参数字典['jsonCfg'].else:
            return ''

    @jsonCfg.setter
    def jsonCfg(self,: str):
        if 'jsonCfg' in self._参数字典:
            self._参数字典['jsonCfg'].= str()

    @property
    def srcDir(self) -> str:
        if 'srcDir' in self._参数字典:
            return self._参数字典['srcDir'].else:
            return ''

    @srcDir.setter
    def srcDir(self,: str):
        if 'srcDir' in self._参数字典:
            self._参数字典['srcDir'].= str()

    @property
    def srcDoc(self) -> str:
        if 'srcDoc' in self._参数字典:
            return self._参数字典['srcDoc'].else:
            return ''

    @srcDoc.setter
    def srcDoc(self,: str):
        if 'srcDoc' in self._参数字典:
            self._参数字典['srcDoc'].= str()

    @property
    def everythingIP(self) -> str:
        if 'everythingIP' in self._参数字典:
            return self._参数字典['everythingIP'].else:
            return ''

    @everythingIP.setter
    def everythingIP(self,: str):
        if 'everythingIP' in self._参数字典:
            self._参数字典['everythingIP'].= str()

    @property
    def everythingPort(self) -> str:
        if 'everythingPort' in self._参数字典:
            return self._参数字典['everythingPort'].else:
            return ''

    @everythingPort.setter
    def everythingPort(self,: str):
        if 'everythingPort' in self._参数字典:
            self._参数字典['everythingPort'].= str()

    # endregion

    # region ssh候选列表
    def 解析Json(self,
                 jsonCfg: str = None,
                 encoding: str = 'utf-8',
                 画板: 打印模板 = None):
        """
                从指定的json文档中(如果不指定,则从 jsonCfg 参数指定的json文档中)读取配置参数,将值赋值给同名的命令行参数
                :param jsonCfg: 可以指定jsonCfg文档
                :param encoding: 可以指定jsonCfg文档的编码格式,默认为 utf-8
                :param 画板: 提供消息打印渠道
                :return: None
                """
        画板 = 画板 if isinstance(画板, 打印模板) else 打印模板()
        画板.执行位置(self.__class__, self.解析Json)

        if not jsonCfg:
            if 'jsonCfg' in self._参数字典.keys():
                jsonCfg = self._参数字典['jsonCfg'].值

        jsonCfg = str(jsonCfg if jsonCfg else '').strip()
        if not jsonCfg:
            画板.提示调试错误('jsonCfg 路径无效')
            return None
        if not os.path.isfile(jsonCfg):
            画板.提示调试错误(f'jsonCfg 不是有效的 json 文件路径: {
     jsonCfg}')
            return None
        if not jsonCfg.endswith('.json'):
            画板.提示调试错误(f'jsonCfg 不是 json 格式的文件: {
     jsonCfg}')

        画板.调试消息(f'待解析的 jsonCfg 文件是: {
     jsonCfg}')

        encoding = str(encoding if encoding else 'utf-8').strip()
        jsonDic: dict
        try:
            with open(jsonCfg, 'r', encoding=encoding) as f:
                jsonDic = json.load(f)
        except Exception as openExp:
            画板.提示调试错误(f'打开并读取 json 文档时遇到错误: {
     openExp}')
            jsonDic = {
   }
        if not jsonDic:
            画板.提示调试错误(f'未解析到有效的 json 内容: {
     jsonCfg}')
            return None

        jsonDic字典: dict = {
   }
        for,in jsonDic.items():
            # 去除键前后的空格= str().strip()
            if:
                jsonDic字典[] = 值

        已匹配的参数: dict[str, 入参基类._参数结构类] = {
   }
        未匹配的参数: dict[str, 入参基类._参数结构类] = {
   }
        for 参数 in self._参数字典.values():
            if 参数.名称 in jsonDic字典:
                参数.= jsonDic字典[参数.名称]
                if str(参数.).strip() == str(jsonDic字典[参数.名称]).strip():
                    已匹配的参数[参数.名称] = 参数
        if 'ssh接口列表' in jsonDic字典.keys() and jsonDic字典['ssh接口列表']:
            # 解析ssh接口配置
            ssh接口列表 = jsonDic字典['ssh接口列表']
            参数 = 命令行参数类._参数结构类(名称='ssh接口列表')
            参数.= ssh接口列表
            已匹配的参数['ssh接口列表'] = 参数
            for 接口 in ssh接口列表:
                ssh接口: ssh接口类 = ssh接口类()
                if '主机名称' in 接口:
                    ssh接口.主机名 = 接口['主机名称']
                if '主机地址' in 接口:
                    ssh接口.主机地址 = 接口['主机地址']
                if '端口号' in 接口:
                    ssh接口.端口号 = 接口['端口号']
                if '用户名' in 接口:
                    ssh接口.用户名 = 接口['用户名']
                if '密码' in 接口:
                    ssh接口.密码 = 接口['密码']
                self.ssh接口列表.append(ssh接口)
        for,in jsonDic字典.items():
            ifnot in 已匹配的参数.keys():
                这个参数: 入参基类._参数结构类 = 入参基类._参数结构类(名称=,
                                                                      类型=str,
                                                                      提示='这是 jsonCfg 中未匹配成功的参数',
                                                                      默认值=)
                未匹配的参数[] = 这个参数

        if 画板.正在调试 and (已匹配的参数 or 未匹配的参数):
            画板.准备表格()
            if 已匹配的参数:
                画板.添加一行('参数名', '参数类型', '参数值', '提示').修饰行(青字)
                for 参数 in 已匹配的参数.values():
                    画板.添加一行(参数.名称, 参数.类型, 参数., 参数.提示)
            if 未匹配的参数:
                画板.添加分隔行(提示文本='以下参数未匹配成功', 修饰方法=红字, 适应窗口=True)
                for 参数 in 未匹配的参数.values():
                    画板.添加一行(参数.名称, 参数.类型, 参数., 参数.提示)
            画板.展示表格()
    # endregion


class 文档操作记录类:
    def __init__(self,
                 旧文档: str = None,
                 新文档: str = None):
        self.__旧文档: str = 旧文档
        self.__新文档: str = 新文档
        self.__带标注的旧文档: str = ''
        self.__带标注的新文档: str = ''

    # region 访问器
    @property
    def 旧文档(self) -> str:
        return self.__旧文档

    @旧文档.setter
    def 旧文档(self, 文档: str):
        文档 = str(文档 if 文档 else '').strip()
        self.__旧文档 = 文档
        self.__带标注的旧文档 = 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1331069.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

mybatis的一级缓存使用以及禁用

目录 验证代码如下 mappper 代码 xml 中代码 实际执行代码 执行结果 DefaultSqlSession CachingExecutor BaseExecutor PerpetualCache 总结 禁用一级缓存 mapper 对应的 xml 的 select 查询设置 flushCache 属性为 true MappedStatement 的内部类 Builder 向外部变…

parseInt(0.0000005)大于等于5

文章目录 一、前言二、parseInt()的神秘行为三、解决parseInt()的奥秘四、结论五、最后 一、前言 parseInt() 是 JavaScript 的内置函数,用于解析数字字符串中的整数。例如,从数字字符串中解析整数100: const number parseInt(100); numbe…

Netty-3-封帧

实际上,数据的封帧与解帧本身虽然实现起来十分简单,但它们在本质上仍然是数据的一种编解码。 那么它们相比之前介绍的数据编解码有什么区别呢?单从编码目标看,之前介绍的数据编解码是为了对用户的数据对象进行传输。 封帧与解帧则…

【Linux】编辑、查看和搜索文件

大多数 Linux 发行版不包含真正的 vi;而是自带一款高级替代版本,叫做 vim(它是“vi improved”的简写)由 Bram Moolenaar 开发的,vim 相对于传统的 Unix vi 来说,取得了实质性进步。 启动和退出 vim 使用vim可以启动,如命令行输…

MyBatis 通过 SqlSession 实现动态Entity批量插入

需要几个关键点: 1、entity对应的service需要继承BaseService 2、entity对应的serviceImpl需要实现baseMapper方法,需要把当前的mapper返回去 3、entity对应的Mapper需要BaseMapper

快速安装方式安装开源OpenSIPS和CP控制界面

OpenSIPS是目前世界上主流的两个SIP软交换引擎(其中另外一个是kamailio)或者SIP信令服务器(个人认为是比较正确的称谓)。关于Opensips的基础和一些参数配置和安装方式笔者在很久以前的历史文档中有非常多的介绍。最近,很多用户使用OpenSIPS软…

PHP案例代码:PHP如何提供下载功能?

对Web开发人员来说,“下载”功能是一个非常常见的需求。在网站中提供文件下载,通常用于提供用户手册、软件升级、音乐、视频等各种资源文件。本教程将向您介绍如何实现一个PHP下载功能,同时告诉浏览器文件名称、文件大小、文件类型,并统计下载次数。 首先,我们需要了解一些…

蓝牙物联网在智能家居中的应用前景

物联网智能家居系统是应用物联网技术,在传统家居环境下将各种零散无序的电器整合成统一整体,实现家电的全程自动控制,满足用户高效管理需求的一种新型家居模式。 其主要的子系统有家居感知系统、家庭网络系统、智能家居控制管理系统等&#x…

Hadoop入门学习笔记——七、Hive语法

视频课程地址:https://www.bilibili.com/video/BV1WY4y197g7 课程资料链接:https://pan.baidu.com/s/15KpnWeKpvExpKmOC8xjmtQ?pwd5ay8 Hadoop入门学习笔记(汇总) 目录 七、Hive语法7.1. 数据库相关操作7.1.1. 创建数据库7.1.2…

Python之zip函数相关介绍

python3的zip函数 zip函数接受任意多个可迭代对象作为参数,将对象中对应的元素打包成一个tuple,然后返回一个可迭代的zip对象。 这个可迭代对象可以使用循环的方式列出其元素,若多个可迭代对象的长度不一致,则所返回的列表与长度最短的可迭…

WPF中使用DataGrid封装组合控件TreeView+DataGrid

(关注博主后,在“粉丝专栏”,可免费阅读此文) wpf的功能非常强大,很多控件都是原生的,但是要使用TreeViewDataGrid的组合,就需要我们自己去封装实现。 我们需要的效果如图所示&#x…

汽车品牌官网建设的效果如何

汽车、电动摩托车、自行车等是人们常用的出行工具,头部品牌不少,中小品牌也同样很多,在当今激烈竞争的市场,各商家都希望不断拓客寻求销量增长。由于市场产品同质化严重且无突出特色,加之选择性广,因此在实…

华为鸿蒙应用--封装数据持久化工具:首选项Preferences(鸿蒙工具)-ArkTs

一、使用方法: 0、初始化实例:一般在EntryAbility.ts的onWindowStageCreate中初始化;(可忽略) 1、将数据写入Preferences实例 function() {let arrayNum: number[] [1, 2, 3];let arrayStr: string[] ["5&quo…

vue3项目 - 使用 pnpm 包管理器来创建项目

创建项目 npm install -g pnpm pnpm create vue 输入项目名称、包名称、选择要安装的依赖,最后 pnpm install pnpm format #规范格式 pnpm dev #启动项目

深度学习 | 常见问题及对策(过拟合、欠拟合、正则化)

1、训练常见问题 1.1、模型架构设计 关于隐藏层的一个万能近似定理: Universal Approximation Theorem:一个具有足够多的隐藏节点的多层前馈神经网络,可以逼近任意连续的函数。(Cybenko, 1989)—— 必须包含至少一种有…

mysql自增序列 关于mysql线程安全 独享内存 溢出 分析

1 MySQL锁概述 锁是计算机协调多个进程或线程并发访问某一资源的机制。如何保证数据并发访问的一致性、有效性是所有数据库必须解决的一个问题,锁冲突也是影响数据库并发访问性能的一个重要因素。 相对其他数据库而言,MySQL的锁机制比较简单&#xff0c…

C++中的内存锁定

内存锁定(memory locking)是确保进程保留在主内存中并且免于分页的一种方法。在实时环境中,系统必须能够保证将进程锁定在内存中,以减少数据访问、指令获取、进程之间的缓冲区传递等的延迟。锁定内存中进程的地址空间有助于确保应用程序的响应时间满足实…

二维码初体验 com.google.zxing 实现

文章目录 一、概述二、实现效果1. 完整版本2. 简化版本 三、源码结构四、完整代码 一、概述 Java 操作二维码的开源项目很多,如 SwetakeQRCode、BarCode4j、Zxing 等,这边以Zxing 为例进行介绍。 二、实现效果 1. 完整版本 选择需要生成QR原始文件&a…

大模型工具_awesome-chatgpt-prompts-zh

https://github.com/PlexPt/awesome-chatgpt-prompts-zh 1 功能 整体功能,想解决什么问题 ChatGPT 中文调教指南:提供一些常用的使用场景及对应的 Prompt 提示 当前解决了什么问题,哪些问题解决不了 针对想解决实际问题,但不知道…

图像识别中的 Vision Transformers (ViT)

引言 Vision Transformers (ViT) 最近已成为卷积神经网络(CNN) 的竞争替代品,而卷积神经网络 (CNN) 目前在不同的图像识别计算机视觉任务中处于最先进的水平。ViT 模型在计算效率和准确性方面比当前最先进的 (CNN) 模型高出近 4 倍。 Transformer 模型已成为自然语…