linux自动化批量分发SSH密钥同时批量测试SSH连接教程(包含自动化脚本代码)

1、检查端口

  • 检查分发对象22端口是否打开

    nmap  -p22  ip地址
    

    如果要批量检查端口可以参考我写的这篇文章:linux自动化一键批量检查主机端口

2、命令行分发密钥原理

Linux分发密钥原理主要涉及SSH(Secure Shell)协议,该协议用于在客户端和服务器之间建立安全的加密连接。以下是Linux分发密钥原理的详细解释:

2.1、密钥对生成

  • 私钥(Private Key):私钥是保密的,用于解密数据和证明身份。它必须被用户单独妥善保管,不能泄露给未经授权的人员。

  • 公钥(Public Key):公钥是公开的,用于加密数据和验证身份。它可以按需配置到目标服务器上的相应账号中。

  • 例子:在Linux系统中,通常使用ssh-keygen命令来生成密钥对:

    ssh-keygen -t rsa
    

    执行上面命令,一直按回车可以生成一个RSA密钥对,生成的私钥文件默认名为id_rsa,公钥文件默认名为id_rsa.pub,密码为空。
    在这里插入图片描述

    保存在默认目录。执行下面命令可以查看到

     ls /root/.ssh/
    

2.2、密钥分发

  • 将公钥复制到服务器:客户端需要将生成的公钥文件(如id_rsa.pub)复制到目标服务器的用户家目录下的.ssh文件夹中,并重命名为authorized_keys文件(如果该文件已存在,则将其内容追加到该文件中)。这可以通过scp命令或ssh-copy-id命令来实现。

  • 例子: 分发密钥到目标机器

    ssh-copy-id -i /root/.ssh/id_rsa.pub  root@目标机器IP地址
    

    在这里插入图片描述

2.3、SSH登录认证

  • 客户端发送登录请求:当客户端尝试通过SSH连接到服务器时,它会发送一个包含其公钥的登录请求。

  • 服务器验证公钥:服务器接收到登录请求后,会在用户家目录下的.ssh/id_rsa.pub文件中查找与客户端公钥相匹配的记录。

  • 生成随机数并加密:如果找到匹配的公钥,服务器会生成一个随机数,并使用该公钥对其进行加密。

  • 客户端解密并返回:客户端使用自己的私钥对加密的随机数进行解密,并将解密后的原文信息返回给服务器。

  • 服务器验证身份:服务器将客户端返回的信息与原始随机数进行比对。如果比对成功,则表示客户端成功证明了其身份,允许其登录到服务器。

  • 例子:

    ssh root@目标机器IP地址 hostname -I
    

    ssh 目标机器IP地址 hostname -I
    

    上面命令执行结果如下
    在这里插入图片描述

3、创建自动化分批量发密钥脚本并执行

注意: 下面所有的脚本测试文件请保证在同一个目录下。脚本和测试文件直接复制粘贴在终端,然后回车即可

  • 批量发密钥脚本

    cat <<EOF>> distribute_keys.sh 
    #!/usr/bin/bash
    # 作者:黑子哥呢?
    # 描述:一键批量分发密钥# 检查是否提供了正确数量的参数
    if [ "\$#" -ne 3 ]; thenecho "错误:此脚本需要三个参数:用户名、用户密码和SSH密钥密码"echo "用法:sh \$0 <用户名> <用户密码> <SSH密钥密码>"exit 1
    fi# 脚本自身路径赋值给变量SH
    SH=\$0# 接收脚本执行时传递的第一个参数作为用户名
    USER_NAME=\$1# 接收脚本执行时传递的第二个参数作为用户密码
    USER_PASSWORD=\$2# 接收脚本执行时传递的第三个参数作为SSH密钥的密码
    SSH_KEY_PASSWORD=\$3
    echo "开始执行:\$SH"
    echo "开始检查SSH密钥对是否存在"# 判断~/.ssh/id_rsa和~/.ssh/id_rsa.pub文件是否都不存在
    if [ ! -f ~/.ssh/id_rsa ] &&  [ ! -f ~/.ssh/id_rsa.pub ]; thenecho "SSH密钥对不存在!" echo "开始自动创建SSH密钥对..."# 使用用户输入的密码创建SSH密钥对,重定向输出到/dev/null以隐藏详细信息ssh-keygen -t rsa  -f ~/.ssh/id_rsa -P "\$SSH_KEY_PASSWORD" -C "管理机" &>/dev/nullecho "SSH密钥对创建成功!"
    elseecho "SSH公钥文件已存在"
    fi# 显示私钥和公钥的位置
    echo "私钥位置:\$HOME/.ssh/id_rsa"
    echo -e "公钥位置:\$HOME/.ssh/id_rsa.pub\n"# 服务器列表的文件路径
    HOST_LIST="host.txt"# 获取本地服务器公钥的路径
    SSH_KEY="\$HOME/.ssh/id_rsa.pub"# 临时文件用来保存分发成功的服务器
    OPEN_HOST_FILE=\$(mktemp)# 临时文件用于保存分发失败的服务器
    CLOSED_HOST_FILE=\$(mktemp)# 临时文件用于保存测试连接失败的服务器
    DISTRIBUTE_HOST_FILE=\$(mktemp)# 遍历服务器列表并分发密钥,同时保存结果到临时文件
    echo "开始分发公钥..."
    while IFS= read -r HOST; doecho "正在分发公钥给\$HOST"# expect脚本的参数包括:服务器地址、用户名、密码、公钥路径、公钥密码expect distribute_keys.exp "\$HOST" "\$USER_NAME" "\$USER_PASSWORD" "\$SSH_KEY" "\$SSH_KEY_PASSWORD" &>/dev/nullif [ \$? -eq 1 ]; thenecho "分发公钥给\$HOST失败!"echo "\$HOST" >> "\$CLOSED_HOST_FILE"continuefiecho "正在测试\$HOST服务器SSH连接..."# expect脚本的参数包括:服务器地址、公钥密码expect connection.exp "\$HOST" "\$SSH_KEY_PASSWORD" &>/dev/null if [ \$? -eq 0 ]; thenecho "测试连接\$HOST成功!"echo "\$HOST" >> "\$OPEN_HOST_FILE"elseecho "测试连接\$HOST失败!"echo "\$HOST" >> "\$DISTRIBUTE_HOST_FILE"fi
    done < "\$HOST_LIST"# 如果分发成功的服务器文件不为空,则显示成功的服务器列表
    if [ -s "\$OPEN_HOST_FILE" ]; thenecho "分发公钥成功的服务器列表如下:"cat "\$OPEN_HOST_FILE"
    fi# 如果分发失败的服务器文件不为空,则显示失败的服务器列表
    if [ -s "\$CLOSED_HOST_FILE" ]; thenecho "分发公钥失败的服务器列表如下:"cat "\$CLOSED_HOST_FILE"
    fi# 如果分发失败的服务器文件不为空,则显示测试连接失败的服务器列表
    if [ -s "\$DISTRIBUTE_HOST_FILE" ]; thenecho "测试连接失败的服务器列表如下:"cat "\$DISTRIBUTE_HOST_FILE"
    fi
    # 删除临时文件
    rm -f "\$OPEN_HOST_FILE" "\$CLOSED_HOST_FILE" "\$DISTRIBUTE_HOST_FILE"
    EOF
    
  • expect分发公钥交互脚本

    cat <<EOF>> distribute_keys.exp
    # !/usr/bin/expect
    # 作者:黑子哥呢?
    # 描述:密钥分发交互脚本# 设置超时时间为2秒
    set timeout 2# 从命令参数中获取远程主机的主机名、用户名、密码、密钥和密钥密码
    set hostname [lindex \$argv 0]
    set username [lindex \$argv 1]
    set password [lindex \$argv 2]
    set ssh_key  [lindex \$argv 3]
    set ssh_key_password [lindex \$argv 4]# 启动ssh-copy-id命令,将本地SSH公钥复制到远程主机上
    spawn ssh-copy-id  -f -i \$ssh_key \$username@\$hostname # 等待并处理交互提示
    expect  {"*yes/no*" {send "yes\r"expect "*password:"send "\$password\r"}"*password*" {send "\$password\r"}"*passphrase*" {send "\$ssh_key_password\r"}default {exit 1}
    }
    expect eof
    EOF
    
  • expect测试连接交互脚本

    cat <<EOF>> connection.exp
    # !/usr/bin/expect
    # 作者:黑子哥呢?
    # 描述:连接交互脚本# 设置超时时间为2秒
    set timeout 2# 从命令参数中获取远程主机的主机名和密钥密码
    set hostname [lindex \$argv 0]
    set ssh_key_password [lindex \$argv 1]# 启动ssh命令,测试连接命令
    spawn ssh \$hostname w# 等待并处理交互提示
    expect  {"*passphrase*" {send "\$ssh_key_password\r"}"*passdord*" {send "\$ssh_key_password\r"           }
    }
    expect eof
    EOF
    
  • 创建测试文件,下面的ip地址改成自己的即可

    cat <<EOF>> host.txt
    1.1.1.12
    1.1.1.13
    1.1.1.14
    EOF
    
  • 执行脚本
    注意:如果SSH密钥不存在脚本会自动创建,同时请确认好root用户密码和SSH密钥密码正确,密码错误可能导致脚本执行过程中分发公钥失败

    sh distribute_keys.sh 用户 用户密码 SSH密钥密码
    

    我开启了1.1.1.12和1.1.13服务器,另外一台服务器处于关机状态 ,运行结果如下:
    在这里插入图片描述

    四、安全性与便捷性

  1. 安全性:由于私钥是保密的,并且只有匹配的公钥才能解密由私钥加密的数据,因此这种基于密钥的认证方式比传统的密码认证方式更安全。即使攻击者截获了加密的通信内容,也无法解密出私钥或密码。
  2. 便捷性:一旦配置了公钥/私钥对,用户就可以实现无密码登录多个服务器。这大大提高了操作的便捷性,并减少了密码泄露的风险。

综上所述,Linux分发密钥原理是通过生成密钥对、分发公钥、进行SSH登录认证等步骤来实现的。这种基于密钥的认证方式不仅提高了安全性,还带来了操作的便捷性。

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

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

相关文章

OpenHarmony源码编译后烧录镜像教程,RK3566鸿蒙开发板演示

本文介绍瑞芯微主板/开发板编译OpenHarmony源码后烧录镜像的教程&#xff0c;触觉智能Purple Pi OH鸿蒙开发板演示。搭载了瑞芯微RK3566四核处理器&#xff0c;树莓派卡片电脑设计&#xff0c;支持开源鸿蒙OpenHarmony3.2-5.0系统&#xff0c;适合鸿蒙开发入门学习。 编译源码…

【GO基础学习】gin框架路由详解

文章目录 gin框架路由详解&#xff08;1&#xff09;go mod tidy&#xff08;2&#xff09;r : gin.Default()&#xff08;3&#xff09;r.GET()路由注册 &#xff08;4&#xff09;r.Run()路由匹配 总结 gin框架路由详解 先创建一个项目&#xff0c;编写一个简单的demo&#…

vue之axios基本使用

文章目录 1. axios 网络请求库2. axiosvue 1. axios 网络请求库 <body> <input type"button" value"get请求" class"get"> <input type"button" value"post请求" class"post"> <!-- 官网提供…

使用 Spring Boot 实现文件上传:从配置文件中动态读取上传路径

使用 Spring Boot 实现文件上传&#xff1a;从配置文件中动态读取上传路径 一、前言二、文件上传的基本概念三、环境准备1. 引入依赖2. 配置文件设置application.yml 配置示例&#xff1a;application.properties 配置示例&#xff1a; 四、编写文件上传功能代码1. 控制器类2. …

AI 神经网络在智能家居场景中的应用

在科技持续进步的当下&#xff0c;智能家居领域正经历着深刻变革&#xff0c;AI 神经网络技术的融入成为推动这一变革的关键力量&#xff0c;为家居生活带来了诸多显著变化与提升&#xff0c;本文将几种常见的AI算法应用做了一下总结&#xff0c;希望对物联网从业者有所帮助。 …

ubuntu快速入门

1.进入某个文件夹 cd workspace/2.tab自动补全 3.列出当前文件夹所有文件 ls列出所有文件包括隐藏文件 ls -a 4.创建文件夹 mkdir linuxLearn 5.创建文件 gedit command.sh在commmand.sh键入 echo hello echo hi? echo how are you? PS:touch hello.txt(也可以创建新…

Day56 图论part06

108.冗余连接 并查集应用类题目,关键是如何把题意转化成并查集问题 代码随想录 import java.util.Scanner;public class Main{public static void main (String[] args) {Scanner scanner = new Scanner(System.in);int n = scanner.nextInt();DisJoint disjoint = new DisJo…

优化 invite_codes 表的 SQL 创建语句

-- auto-generated definition create table invite_codes (id int auto_incrementprimary key,invite_code varchar(6) not null comment 邀请码&#xff0c;6位整数&#xff0c;确保在有效期内…

FATE-LLM简介;FATE-LLM集成了多种参数高效微调方法

FATE-LLM简介 FATE-LLM是一个支持联邦大语言模型训练的框架,其架构及核心技术原理如下: 架构概述 FATE-LLM主要由模型层、参数高效微调层、隐私保护与安全机制、通信与聚合模块等组成,致力于在保护数据隐私的前提下,利用联邦学习技术整合各方数据与算力资源,提升大语言模…

小程序租赁系统构建指南与市场机会分析

内容概要 在当今竞争激烈的市场环境中&#xff0c;小程序租赁系统正崭露头角&#xff0c;成为企业转型与创新的重要工具。通过这个系统&#xff0c;商户能够快速推出自己的小程序&#xff0c;无需从头开发&#xff0c;节省了大量时间和资金。让我们来看看这个系统的核心功能吧…

数据库系列之分布式数据库下误删表怎么恢复?

数据的完整性是数据库可用性的基本功能&#xff0c;在实际应用数据库变更操作过程中可能因为误操作导致误删表或者truncate操作影响业务的正常访问。本文介绍了分布式数据库中在误删表场景下的数据恢复方案&#xff0c;并进行了对比。 1、数据库误删表恢复方案 应用数据的完整…

论文阅读:Towards Faster Deep Graph Clustering via Efficient Graph Auto-Encoder

论文地址&#xff1a;Towards Faster Deep Graph Clustering via Efficient Graph Auto-Encoder | ACM Transactions on Knowledge Discovery from Data 代码地址&#xff1a; https://github.com/Marigoldwu/FastDGC 摘要 深度图聚类&#xff08;Deep Graph Clustering, DGC…

Python爬虫教程——7个爬虫小案例(附源码)_爬虫实例

本文介绍了7个Python爬虫小案例&#xff0c;包括爬取豆瓣电影Top250、猫眼电影Top100、全国高校名单、中国天气网、当当网图书、糗事百科段子和新浪微博信息&#xff0c;帮助读者理解并实践Python爬虫基础知识。 包含编程资料、学习路线图、源代码、软件安装包等&#xff01;【…

BMS存储模块的设计

目的 电池管理系统中存在着数据本地存储的要求&#xff0c;保证控制器重新上电后能够根据存储器中的一些参数恢复控制状态&#xff0c;和信息的下电存储1.继电器故障信息的存储。2. 系统性故障的存储。3.SOC、SOH相关信息的存储。4.均衡参数的存储。5.系统时间信息。6.出厂信息…

Python爬取城市天气信息,并存储到csv文件中

1.爬取的网址为&#xff1a;天气网 (weather.com.cn) 2.需要建立Weather.txt文件&#xff0c;并在里面加入如下形式的字段&#xff1a; 101120701济宁 101010100北京 3.代码运行后&#xff0c;在命令行输入Weather.txt文件中添加过的城市&#xff0c;如&#xff1a;济宁。 …

MySQL线上事故:使用`WHERE`条件`!=xxx`无法查询到NULL数据

前言 在一次 MySQL 的线上查询操作中&#xff0c;因为 ! 的特性导致未能正确查询到为 NULL 的数据&#xff0c;险些引发严重后果。本文将详细解析 NULL 在 SQL 中的行为&#xff0c;如何避免类似问题&#xff0c;并提供实际操作建议。 1. 为什么NULL会查询不到&#xff1f; 在…

JVM和异常

Java 虚拟机&#xff08;Java Virtual Machine&#xff0c;简称 JVM&#xff09; 概述 JVM 是运行 Java 字节码的虚拟计算机&#xff0c;它是 Java 程序能够实现 “一次编写&#xff0c;到处运行&#xff08;Write Once, Run Anywhere&#xff09;” 特性的关键所在。Java 程序…

Mybatis 为什么不需要给Mapper接口写实现类,为什么要使用代理而不是硬编码?

文章目录 核心机制概述源码分析1. 获取 Mapper 实例2. 创建 Mapper 代理对象3. 拦截方法调用 MapperProxy4. 关联 SQL 并执行 为什么 MyBatis 采用了代理机制&#xff0c;而不是简单地面向流程化的方式?1. 解耦和灵活性2. 方法拦截和事务管理3. 动态代理支持方法级别的 SQL 定…

DevOps流程CICD之Jenkins使用操作

一、jenkins的docker-compose安装部署 请参考 jenkins的docker安装部署配置全网最详细教程-CSDN博客 二、创建repository 三、创建ssh 四、创建视图 五、创建任务 六、配置gitlab钩子 七、自动构建部署CI/CD验证

Solidworks打开无法获得许可,提示(-15,10,10061)错误解决办法

参考文章&#xff1a; https://blog.csdn.net/2301_81263647/article/details/140904773