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.__带标注的旧文档 = 

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【数据结构】什么是堆?

🦄个人主页:修修修也 🎏所属专栏:数据结构 ⚙️操作环境:Visual Studio 2022 堆的概念及结构 堆的定义如下: n个元素的序列{k1,k2,...,kn}当且仅当满足以下关系时,称之为堆. 或 把这个序列对应的一维数组(即以一维数组作此序列的存储结构)看成是一个…

医保购药小程序:智能合约引领医疗数字革新

在医疗领域,医保购药小程序通过引入智能合约技术,为用户提供更为高效、安全的购药体验。本文将通过简单的智能合约代码示例,深入探讨医保购药小程序如何利用区块链技术中的智能合约,实现医保结算、购药监控等功能,为医…

概率中的 50 个具有挑战性的问题 [05/50]:正方形硬币

一、说明 我最近对与概率有关的问题产生了兴趣。我偶然读到了弗雷德里克莫斯特勒(Frederick Mosteller)的《概率论中的五十个具有挑战性的问题与解决方案》)一书。我认为创建一个系列来讨论这些可能作为面试问题出现的迷人问题会很有趣。每篇…

Chrome浏览器http自动跳https问题

现象: Chrome浏览器访问http页面时有时会自动跳转https,导致一些问题。比如: 开发阶段访问dev环境网址跳https,后端还是http,导致接口跨域。 复现: 先访问http网址,再改成https访问&#xf…

如何实现https密钥对登录方式

先安装docker yum install -y yum-utils device-mapper-persistent-data lvm2 yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo systemctl start docker.service systemctl enable docker.service yum install -y docker…

C++的面向对象学习(6):运算符的重载

文章目录 前言:什么是运算符重载?针对自定义的类与对象类型。一、加号的运算符重载1.引入背景2.所以运算符重载的作用:3.实现对象间的相加代码:号运算符重载①在类中实现加号运算符重载②设计全局函数实现加号运算符重载③改写函数…

JuiceSSH结合内网穿透实现公网远程访问本地Linux虚拟机

文章目录 1. Linux安装cpolar2. 创建公网SSH连接地址3. JuiceSSH公网远程连接4. 固定连接SSH公网地址5. SSH固定地址连接测试 处于内网的虚拟机如何被外网访问呢?如何手机就能访问虚拟机呢? cpolarJuiceSSH 实现手机端远程连接Linux虚拟机(内网穿透,手机端连接Linux虚拟机) …

释放云服务器ECS实例

目录 云服务器ECS 释放设置 云服务器ECS 当你不想继续使用云服务器ECS,可以直接释放这个实例,但是需要注意的是实例释放后数据无法恢复,免费领取的实例也不能再次领取,一定谨慎进行ECS实例的释放,具体释放限制和建议…

C++ 比 C语言的新增的特性 1

1. C是C的增强 1.1 C是静态类型的语言,具有严格的数据类型检查 1.1.1 c 因为const修饰的变量不允许修改,但是只给了警告,不严谨 const int a10;a20; //报错int *p&a;*p20;//a的值? test1.c:6:9: warning: initialization dis…

【网络安全 | MD5截断比较】PHP、Python脚本利用

前言 在解题中&#xff0c;当遇到类似 substr(md5(a),-6,6) 7788这样的MD5截断比较的题目时&#xff0c;只有求出a的值才能进行接下来的操作。 一个一个去猜是不可能的&#xff0c;通常使用脚本解决&#xff0c;文末给出实战案例。 PHP循环脚本 <?phpfor($i1;$i<9…

【网络奇遇记】揭秘计算机网络的性能指标:速率|带宽|吞吐量|时延

&#x1f308;个人主页&#xff1a;聆风吟 &#x1f525;系列专栏&#xff1a;网络奇遇记、数据结构 &#x1f516;少年有梦不应止于心动&#xff0c;更要付诸行动。 文章目录 &#x1f4cb;前言一. 速率1.1 数据量1.2 速率 二. 带宽三. 吞吐量四. 时延4.1 发送时延4.2 传播时延…

SpringMVC之跨域请求

系列文章目录 提示&#xff1a;这里可以添加系列文章的所有文章的目录&#xff0c;目录需要自己手动添加 SpringMVC之跨域请求 提示&#xff1a;写完文章后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 系列文章目录前言一、什么是同源策略…

【C# 技术】 C# 常用排序方式——常规数据排序

C# 常用排序方式——常规数据排序 前言 在最近的项目中经常会对C#中的数据进行排序&#xff0c;对于基本数据类型&#xff0c;其排序方式比较简单&#xff0c;只需要调用内置算法即可实现&#xff0c;但对于自定义数据类型以及自定义排序规则的情况实现起来就比较麻烦&#…

这款APP,在离线环境下也能查看倾斜模型、点云等数据

《四维轻云-离线版》APP是基于移动端开发的轻量化地理空间数据应用平台&#xff0c;实现了用户对空间数据场景的制作和应用。 目前&#xff0c;已涵盖的数据类型包括倾斜模型(.osgb)、激光点云(.las)、正射影像(dom)、数字高程模型(dem)、矢量数据(shp)、人工模型&#xff08;…

IntelliJ IDEA 2023.3 安装教程

引言 IntelliJ IDEA&#xff0c;通常简称为 IDEA&#xff0c;是由 JetBrains 开发的一款强大的集成开发环境&#xff0c;专为提升开发者的生产力而设计。它支持多种编程语言&#xff0c;包括 Java、Kotlin、Scala 和其他 JVM 语言&#xff0c;同时也为前端开发和移动应用开发提…

TCP:IP原理

TCP/IP 原理 TCP/IP 协议不是 TCP 和 IP 这两个协议的合称&#xff0c;而是指因特网整个 TCP/IP 协议族。从协议分层模型方面来讲&#xff0c;TCP/IP 由四个层次组成&#xff1a;网络接口层、网络层、传输层、应用层。 网络访问层(Network Access Layer) 网络访问层(Network …

千帆起航:探索百度智能云千帆AppBuilder在AI原生应用开发中的革新之路

千帆起航&#xff1a;探索百度千帆AppBuilder在AI原生应用开发中的革新之路 1.揭开帷幕&#xff0c;大模型第二次战役 自从 ChatGPT 横空出世后&#xff0c;一石激起千层浪&#xff0c;人工智能也正在从感知理解走向生成创造&#xff0c;这是一个关键里程碑。生成式大模型完成…

【K8S基础】-k8s的核心概念控制器和调度器

Kubernetes是一个开源的容器编排平台&#xff0c;旨在简化和自动化容器化应用程序的部署、扩展和管理。它提供了一个强大的基础设施来管理容器化应用程序的生命周期&#xff0c;并确保它们在整个集群中高效运行。 Kubernetes的核心概念包括集群、节点、Pod、控制器、调度器等。…

[机器人-3]:开源MIT Min cheetah机械狗设计(三):嵌入式硬件设计

目录 概述&#xff1a; 1、硬件组成 2、通信速率 3、通信协议 4、mbedOS 概述&#xff1a; 以1条腿进行设计&#xff0c;其它腿也一样&#xff1a; 腿部硬件组成 1、硬件组成 1&#xff09;UP board计算机板卡&#xff08;Linux OS&#xff09;&#xff1a; 腿部控制器…

SpringMVC核心处理流程梳理

1、处理流程图展示 当我拿出这张图&#xff0c;阁下又该如何应对呢&#xff1f;执行流程是不是一目了然了。 2、DispatcherServlet&#xff1a;中央处理器或者中央调度器 下图官方的解释应该最完善了。 3、SpringMVC三大核心组件 HandlerMapping 处理器映射器&#xff0c;…