当前位置: 首页 > news >正文

ssh工具 向指定的ssh服务器配置公钥

此文分享一个python脚本,用于向指定的ssh服务器配置公钥,以达到免密登录ssh服务器的目的。

效果演示

  • 🔥完整演示效果
    20231225155237_rec_

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

  • 👇第二步,确认 or 选择ssh服务器
    20231225155508

  • 👇第三步,输入ssh登录密码,以完成公钥配置
    20231225155606

  • 👇验证,我们通过ssh登录该服务器时,已经不需要再输入密码了
    20231225155812

配置文件

我们需要在配置文件中记录和管理一些配置信息,例如上文中提到的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 paramikoexcept 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 difflibexcept 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 访问器@propertydef jsonCfg(self) -> str:if 'jsonCfg' in self._参数字典:return self._参数字典['jsonCfg'].else:return ''@jsonCfg.setterdef jsonCfg(self,: str):if 'jsonCfg' in self._参数字典:self._参数字典['jsonCfg'].= str()@propertydef srcDir(self) -> str:if 'srcDir' in self._参数字典:return self._参数字典['srcDir'].else:return ''@srcDir.setterdef srcDir(self,: str):if 'srcDir' in self._参数字典:self._参数字典['srcDir'].= str()@propertydef srcDoc(self) -> str:if 'srcDoc' in self._参数字典:return self._参数字典['srcDoc'].else:return ''@srcDoc.setterdef srcDoc(self,: str):if 'srcDoc' in self._参数字典:self._参数字典['srcDoc'].= str()@propertydef everythingIP(self) -> str:if 'everythingIP' in self._参数字典:return self._参数字典['everythingIP'].else:return ''@everythingIP.setterdef everythingIP(self,: str):if 'everythingIP' in self._参数字典:self._参数字典['everythingIP'].= str()@propertydef everythingPort(self) -> str:if 'everythingPort' in self._参数字典:return self._参数字典['everythingPort'].else:return ''@everythingPort.setterdef 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 Noneif not os.path.isfile(jsonCfg):画板.提示调试错误(f'jsonCfg 不是有效的 json 文件路径: {jsonCfg}')return Noneif not jsonCfg.endswith('.json'):画板.提示调试错误(f'jsonCfg 不是 json 格式的文件: {jsonCfg}')画板.调试消息(f'待解析的 jsonCfg 文件是: {jsonCfg}')encoding = str(encoding if encoding else 'utf-8').strip()jsonDic: dicttry: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 NonejsonDic字典: 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():画板.添加一行(参数.名称, 参数.类型, 参数., 参数.提示)画板.展示表格()# endregionclass 文档操作记录类:def __init__(self,旧文档: str = None,新文档: str = None):self.__旧文档: str = 旧文档self.__新文档: str = 新文档self.__带标注的旧文档: str = ''self.__带标注的新文档: str = ''# region 访问器@propertydef 旧文档(self) -> str:return self.__旧文档@旧文档.setterdef 旧文档(self, 文档: str):文档 = str(文档 if 文档 else '').strip()self.__旧文档 = 文档self.__带标注的旧文档 = 

相关文章:

ssh工具 向指定的ssh服务器配置公钥

此文分享一个python脚本,用于向指定的ssh服务器配置公钥,以达到免密登录ssh服务器的目的。 效果演示 🔥完整演示效果 👇第一步,显然,我们需要选择功能 👇第二步,确认 or 选择ssh服务器 👇第三步,输入ssh登录密码,以完成公钥配置 👇验证,我们通过ssh登录…...

uni-app pages.json之globalStyle全局页面样式配置

锋哥原创的uni-app视频教程: 2023版uniapp从入门到上天视频教程(Java后端无废话版),火爆更新中..._哔哩哔哩_bilibili2023版uniapp从入门到上天视频教程(Java后端无废话版),火爆更新中...共计23条视频,包括:第1讲 uni…...

Blazor 混合开发_MAUI+Vue_WPF+Vue

Blazor 混合开发_MAUIVue_WPFVue 背景混合开发的核心为什么必须使用 wwwroot 文件夹放置 Web 项目文件 创建 MAUI 项目创建 wwwroot 文件夹服务注册创建 _import.razor添加 Main.razor 组件修改 MainPage.xaml 文件 创建 WPF 项目创建 wwwroot 文件夹服务注册创建 _import.razo…...

udp异步方式接收消息

C#实现 //定义结构体 public struct UdpState { public UdpClient u; public IPEndPoint e; } private UdpClient _client; //_client的初始化请参考其他资料 IPEndPoint remoteEP null; //TODO //public static bool mess…...

【RocketMQ笔记01】安装RocketMQ消息队列运行环境

这篇文章,主要介绍如何安装RocketMQ消息队列运行环境。 目录 一、RocketMQ消息队列 1.1、下载RocketMQ 1.2、解压安装包 1.3、配置RocketMQ环境变量 1.4、修改启动脚本 1.5、启动RocketMQ (1)启动NameServer (2&#xff0…...

使用 Privoxy 实现对多域名的定向转发

需求与思路 内网一台主机想要访问公网的两个不同站点, 想要实现访问两个站点时表现出不同的公网 IP 地址. 即在公网的站点服务器端看到的客户端 IP 是不同的. 思路是搭建两台具有不同公网 IP 的服务器, 分别安装配置 Privoxy 后进行串联, 并将其中一台作为主服务器暴露给内网…...

《PySpark大数据分析实战》-19.NumPy介绍ndarray介绍

📋 博主简介 💖 作者简介:大家好,我是wux_labs。😜 热衷于各种主流技术,热爱数据科学、机器学习、云计算、人工智能。 通过了TiDB数据库专员(PCTA)、TiDB数据库专家(PCTP…...

图解LRU缓存

图解LRU缓存 OJ链接 介绍 LRU 缓存机制可以通过哈希表辅以双向链表实现,我们用一个哈希表和一个双向链表维护所有在缓存中的键值对。 双向链表按照被使用的顺序存储了这些键值对,靠近尾部的键值对是最近使用的,而靠近头部的键值对是最久未…...

FFmpeg常见命令行

1、ffmpeg命令行 视频生成图片 ffmpeg -i test.mp4 -r 25 -f image2 data/image%3d.jpg这个命令行使用FFmpeg工具将视频文件(test.mp4)转换为一系列图像文件。 让我们逐个解释每个参数的含义: -i test.mp4: 指定输入文件为test.mp4。-i是F…...

智能优化算法应用:基于斑马算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用:基于斑马算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用:基于斑马算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.斑马算法4.实验参数设定5.算法结果6.参考文献7.MA…...

《C++避坑神器·二十五》简单搞懂json文件的读写之遍历json文件读写

json.hpp库放在文章末尾 1、遍历json文件读写 (1)插入新键值对到json之情形1 原来json文件如下所示: {"Connection": {"IpAddress": "192.168.20.1","Rock": 0,"Solt": 1}, "Data…...

使用 fixture 机制重构 appium_helloworld

一、前置说明 在 pytest 基础讲解 章节,介绍了 pytest 的特性和基本用法,现在我们可以使用 pytest 的一些机制,来重构 appium_helloworld 。 appium_helloworld 链接: 编写第一个APP自动化脚本 appium_helloworld ,将脚本跑起来 代码目录结构: pytest.ini 设置: [pyt…...

基于python的excel检查和读写软件

软件版本:python3.6 窗口和界面gui代码: class mygui:def _init_(self):passdef run(self):root Tkinter.Tk()root.title(ExcelRun)max_w, max_h root.maxsize()root.geometry(f500x500{int((max_w - 500) / 2)}{int((max_h - 300) / 2)}) # 居中显示…...

Podman配置mongodb

文章目录 查询镜像拉取镜像查看镜像运行容器创建root用户 查询镜像 podman search mongo拉取镜像 podman pull docker.io/library/mongo查看镜像 podman images运行容器 podman run -d -p 27017:27017 --namemongodb-test docker.io/library/mongo创建root用户 podman exe…...

java实现矩阵谱峰搜索算法

矩阵谱峰搜索算法,也称为矩阵谱峰查找算法,是一种用于搜索二维矩阵中谱峰的方法。谱峰是指在矩阵中的一个元素,它比其上下左右四个相邻元素都大或相等。 该算法的基本思想是从矩阵的中间列开始,找到该列中的最大元素,…...

Jenkins的特殊操作定时自动执行任务以及测试报告调优

java -Dhudson.model.DirectoryBrowserSupport.CSP -jar Jenkins.war 测试报告 不美丽 执行上面的代码 重启jenkins 就好了...

【Grafana】Grafana匿名访问以及与LDAP连接

上一篇文章利用Docker快速部署了Grafana用来展示Zabbix得监控数据,但还需要给用户去创建账号允许他们登录后才能看展示得数据,那有什么办法让非管理员更方便得去访问Grafana呢?下面介绍两个比较方便实现的: 在开始设置前&#xff…...

elasticsearch-py 8.x的一些优势

​ 早在 2022 年 2 月,当 Elasticsearch 8.0 发布时,Python 客户端也发布了 8.0 版本。它是对 7.x 客户端的部分重写,并带有许多不错的功能(如下所述),但也带有弃用警告和重大更改。今天,客户端的 7.17 版本仍然相对流行,每月下载量超过 100 万次,占 8.x 下载量的 ~50…...

RK3588平台开发系列讲解(AI 篇)RKNN 数据结构详解

文章目录 一、rknn_sdk_version二、rknn_input_output_num三、rknn_tensor_attr四、rknn_perf_detail五、rknn_perf_run六、rknn_mem_size七、rknn_tensor_mem八、rknn_input九、rknn_output沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本篇章主要讲解 RKNN 相关的数…...

2023版本QT学习记录 -6- UDP通信之UDP接收端

———————UDP接收端——————— 🎄动图演示 🎄发送端通信步骤思维导图 🎄添加组件 QT core gui network🎄添加头文件 #include "qudpsocket.h"🎄创建接收对象 QUdpSocket *recvsocket;&…...

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造,完美适配AGV和无人叉车。同时,集成以太网与语音合成技术,为各类高级系统(如MES、调度系统、库位管理、立库等)提供高效便捷的语音交互体验。 L…...

day52 ResNet18 CBAM

在深度学习的旅程中,我们不断探索如何提升模型的性能。今天,我将分享我在 ResNet18 模型中插入 CBAM(Convolutional Block Attention Module)模块,并采用分阶段微调策略的实践过程。通过这个过程,我不仅提升…...

如何在看板中体现优先级变化

在看板中有效体现优先级变化的关键措施包括:采用颜色或标签标识优先级、设置任务排序规则、使用独立的优先级列或泳道、结合自动化规则同步优先级变化、建立定期的优先级审查流程。其中,设置任务排序规则尤其重要,因为它让看板视觉上直观地体…...

Robots.txt 文件

什么是robots.txt? robots.txt 是一个位于网站根目录下的文本文件(如:https://example.com/robots.txt),它用于指导网络爬虫(如搜索引擎的蜘蛛程序)如何抓取该网站的内容。这个文件遵循 Robots…...

【C语言练习】080. 使用C语言实现简单的数据库操作

080. 使用C语言实现简单的数据库操作 080. 使用C语言实现简单的数据库操作使用原生APIODBC接口第三方库ORM框架文件模拟1. 安装SQLite2. 示例代码:使用SQLite创建数据库、表和插入数据3. 编译和运行4. 示例运行输出:5. 注意事项6. 总结080. 使用C语言实现简单的数据库操作 在…...

selenium学习实战【Python爬虫】

selenium学习实战【Python爬虫】 文章目录 selenium学习实战【Python爬虫】一、声明二、学习目标三、安装依赖3.1 安装selenium库3.2 安装浏览器驱动3.2.1 查看Edge版本3.2.2 驱动安装 四、代码讲解4.1 配置浏览器4.2 加载更多4.3 寻找内容4.4 完整代码 五、报告文件爬取5.1 提…...

计算机基础知识解析:从应用到架构的全面拆解

目录 前言 1、 计算机的应用领域:无处不在的数字助手 2、 计算机的进化史:从算盘到量子计算 3、计算机的分类:不止 “台式机和笔记本” 4、计算机的组件:硬件与软件的协同 4.1 硬件:五大核心部件 4.2 软件&#…...

苹果AI眼镜:从“工具”到“社交姿态”的范式革命——重新定义AI交互入口的未来机会

在2025年的AI硬件浪潮中,苹果AI眼镜(Apple Glasses)正在引发一场关于“人机交互形态”的深度思考。它并非简单地替代AirPods或Apple Watch,而是开辟了一个全新的、日常可接受的AI入口。其核心价值不在于功能的堆叠,而在于如何通过形态设计打破社交壁垒,成为用户“全天佩戴…...

Chrome 浏览器前端与客户端双向通信实战

Chrome 前端(即页面 JS / Web UI)与客户端(C 后端)的交互机制,是 Chromium 架构中非常核心的一环。下面我将按常见场景,从通道、流程、技术栈几个角度做一套完整的分析,特别适合你这种在分析和改…...

保姆级【快数学会Android端“动画“】+ 实现补间动画和逐帧动画!!!

目录 补间动画 1.创建资源文件夹 2.设置文件夹类型 3.创建.xml文件 4.样式设计 5.动画设置 6.动画的实现 内容拓展 7.在原基础上继续添加.xml文件 8.xml代码编写 (1)rotate_anim (2)scale_anim (3)translate_anim 9.MainActivity.java代码汇总 10.效果展示 逐帧…...