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"> <!-- 官网提供…

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(也可以创建新…

优化 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; 在…

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

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

【电路理论四】正弦电流电路

正弦电流 正弦量是随时间按正弦规律变动的电路变量。 随时间按正弦规律变动的电流称为正弦电流。 正弦电流的瞬时值表达式&#xff1a; 称为正弦电流的三要素。 分别为振幅/幅值&#xff0c;角频率&#xff0c;初相。 幅值为正弦电流的最大值&#xff0c;恒为正。 为正弦电…

解决Windows无法同时使用有线网和无线网WIFI的问题

参考资料 电脑无线网wifi和有线网同时使用&#xff08;内网外网同时使用&#xff09;用route命令解决Wifi和网卡不能同时上内外网问题 解决方法 对于Windows系统同时连接有线网和无线网Wifi时&#xff0c;只会有一个网关生效&#xff0c;因此我们需要手动通过route命令设置网…

FOC控制原理-ADC采样时机

0、文章推荐 SimpleFOC移植STM32&#xff08;五&#xff09;—— 电流采样及其变换_极对数对电流采样的影响-CSDN博客 FOC 电流采样方案对比&#xff08;单电阻/双电阻/三电阻&#xff09; - 知乎 (zhihu.com) FOC中的三种电流采样方式&#xff0c;你真的会选择吗&#xff1f;…

uniapp:编译微信、h5都正常的,编译钉钉小程序无法找到页面

我们在做uniapp的开发的时候遇到很多莫名其妙的问题&#xff0c;其中就有个很奇葩的问题&#xff0c;我们开发的过程中使用微信小程序/h5调试都是正常编译正常跳转&#xff0c;然后在要上架的时候&#xff0c;编译钉钉小程序成功&#xff0c;但是访问页面无法访问&#xff0c; …

zentao ubuntu上安装

#下载ZenTaoPMS-21.2-zbox_amd64.tar.gz&#xff08;https://www.zentao.net/downloads.html&#xff09; https://dl.zentao.net/zentao/21.2/ZenTaoPMS-21.2-zbox_amd64.tar.gzcd /opt tar -zxvf ZenTaoPMS-21.2-zbox_amd64.tar.gz#启动 /opt/zbox/zbox start /opt/zbox/zbox…

REDIS2.0

string list hash set 无序集合 声明一个key&#xff0c;键里面的值是元素&#xff0c;元素的类型是string 元素的值是唯一的&#xff0c;不能重复 多个集合类型之间可以进行并集&#xff0c;交集&#xff0c;集查的运算 sadd test1 a b c c d &#xff1a;添加5个元素&am…