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 ]; then
        echo "错误:此脚本需要三个参数:用户名、用户密码和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 ]; then
        echo "SSH密钥对不存在!" 
        echo "开始自动创建SSH密钥对..."
        
        # 使用用户输入的密码创建SSH密钥对,重定向输出到/dev/null以隐藏详细信息
        ssh-keygen -t rsa  -f ~/.ssh/id_rsa -P "\$SSH_KEY_PASSWORD" -C "管理机" &>/dev/null
        echo "SSH密钥对创建成功!"
    else
        echo "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; do
        echo "正在分发公钥给\$HOST"
        
        # expect脚本的参数包括:服务器地址、用户名、密码、公钥路径、公钥密码
        expect distribute_keys.exp "\$HOST" "\$USER_NAME" "\$USER_PASSWORD" "\$SSH_KEY" "\$SSH_KEY_PASSWORD" &>/dev/null
        if [ \$? -eq 1 ]; then
        	echo "分发公钥给\$HOST失败!"
        	echo "\$HOST" >> "\$CLOSED_HOST_FILE"
        	continue
        fi
        echo "正在测试\$HOST服务器SSH连接..."
        
        # expect脚本的参数包括:服务器地址、公钥密码
        expect connection.exp "\$HOST" "\$SSH_KEY_PASSWORD" &>/dev/null 
        if [ \$? -eq 0 ]; then
        	echo "测试连接\$HOST成功!"
            echo "\$HOST" >> "\$OPEN_HOST_FILE"
        else
        	echo "测试连接\$HOST失败!"
            echo "\$HOST" >> "\$DISTRIBUTE_HOST_FILE"
        fi
    done < "\$HOST_LIST"
    
    # 如果分发成功的服务器文件不为空,则显示成功的服务器列表
    if [ -s "\$OPEN_HOST_FILE" ]; then
        echo "分发公钥成功的服务器列表如下:"
        cat "\$OPEN_HOST_FILE"
    fi
     
    # 如果分发失败的服务器文件不为空,则显示失败的服务器列表
    if [ -s "\$CLOSED_HOST_FILE" ]; then
        echo "分发公钥失败的服务器列表如下:"
        cat "\$CLOSED_HOST_FILE"
    fi
     # 如果分发失败的服务器文件不为空,则显示测试连接失败的服务器列表
    if [ -s "\$DISTRIBUTE_HOST_FILE" ]; then
        echo "测试连接失败的服务器列表如下:"
        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登录认证等步骤来实现的。这种基于密钥的认证方式不仅提高了安全性,还带来了操作的便捷性。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

vue3学习笔记(9)-pinia、storeToRefs、getters

1.新的集中式状态&#xff08;数据&#xff09;管理库&#xff0c;redux vuex pinia 搭建 2.ref拆包 如果在reactive里面定义ref&#xff0c;则打印c时&#xff0c;无需.value 他自动拆包&#xff0c;如果直接在外面定义的ref则需要.value,他没有拆包 3.pinia存储读取数据 存…

Oracle 11G还有新BUG?ORACLE 表空间迷案!

前段时间遇到一个奇葩的问题&#xff0c;在开了SR和oracle support追踪两周以后才算是有了不算完美的结果&#xff0c;在这里整理出来给大家分享。 1.问题描述 12/13我司某基地MES全厂停线&#xff0c;系统卡死不可用&#xff0c;通知到我排查&#xff0c;查看alert log看到是…

深度学习:基于MindSpore NLP的数据并行训练

什么是数据并行&#xff1f; 数据并行&#xff08;Data Parallelism, DP&#xff09;的核心思想是将大规模的数据集分割成若干个较小的数据子集&#xff0c;并将这些子集分配到不同的 NPU 计算节点上&#xff0c;每个节点运行相同的模型副本&#xff0c;但处理不同的数据子集。…

机器学习-高斯混合模型

文章目录 高斯混合模型对无标签的数据集&#xff1a;使用高斯混合模型进行聚类对有标签的数据集&#xff1a;使用高斯混合模型进行分类总结实战 高斯混合模型 对无标签的数据集&#xff1a;使用高斯混合模型进行聚类 对有标签的数据集&#xff1a;使用高斯混合模型进行分类 总结…

android studio android sdk下载地址

android studio安装后&#xff0c;因为公司网络原因&#xff0c;一直无法安装android sdk 后经过手机网络&#xff0c;安装android sdk成功如下&#xff0c;也可以手动下载后指定android sdk本地目录 https://dl.google.com/android/repository/source-35_r01.zip https://dl…

【RK3588 Linux 5.x 内核编程】-内核I2C子系统介绍

内核I2C子系统介绍 文章目录 内核I2C子系统介绍1、内核中的I2C子系统2、内核中的I2C驱动2.1 获取I2C适合器2.2 创建i2c_board_info与设备2.3 创建设备ID和I2C驱动2.4 数据传输2.4.1 发送数据2.4.2 读取数据3、I2C总线如何工作I2C 是一种用于双线接口的串行协议,用于连接低速设…

更新本地项目到最新git版本脚本

由于平时工作中项目较多&#xff0c;每天刚上班都需要更新一下项目代码&#xff0c;一个一个更新感觉稍微麻烦了一些&#xff0c;所以写了一个简单的shell脚本&#xff0c;每天到公司先执行一遍即可。 #!/bin/bash# 进入指定的目录 target_dir"$1"; cd "$targe…

向量检索+大语言模型,免费搭建基于专属知识库的 RAG 智能助手

随着生成式人工智能技术的飞速发展&#xff0c;越来越多的人和企业开始应用AI到日常的工作和生活中。但公域的AI助手其数据来自互联网上的大量公开文本&#xff0c;虽然具有广泛的知识&#xff0c;但在面对一些特定领域的专业问题时&#xff0c;可能会出现回答不够准确或深入的…

python读写文件的三种做法

对于文件操作&#xff0c;python提供了3种做法&#xff1a;open(), os.open() 和with open()语句。 1. open()函数&#xff1a;一般用于更高级的文件读写操作&#xff0c;即人能读懂的用法&#xff0c;如果是写入数据&#xff0c;可用传入字符串。 用法&#xff1a;open(path…

RCE-PLUS (学习记录)

源码 <?php error_reporting(0); highlight_file(__FILE__); function strCheck($cmd) {if(!preg_match("/\;|\&|\\$|\x09|\x26|more|less|head|sort|tail|sed|cut|awk|strings|od|php|ping|flag/i", $cmd)){return($cmd);}else{die("i hate this"…

【分布式文件存储系统Minio】2024.12保姆级教程

文章目录 1.介绍1.分布式文件系统2.基本概念 2.环境搭建1.访问网址2.账号密码都是minioadmin3.创建一个桶4.**Docker安装miniomc突破7天限制**1.拉取镜像2.运行容器3.进行配置1.格式2.具体配置 4.查看桶5.给桶开放权限 3.搭建minio模块1.创建一个oss模块1.在sun-common下创建2.…

目标检测入门指南:从原理到实践

目录 1. 数据准备与预处理 2. 模型架构设计 2.1 特征提取网络原理 2.2 区域提议网络(RPN)原理 2.3 特征金字塔网络(FPN)原理 2.4 边界框回归原理 2.5 非极大值抑制(NMS)原理 2.6 多尺度训练与测试原理 2.7 损失函数设计原理 3. 损失函数设计 4. 训练策略优化 5. 后…

react中实现拖拽排序

效果图&#xff1a;如下 效果说明&#xff1a; 1. 点击“选择”按钮&#xff0c;打开弹窗 2. 左侧数据是调接口回显来的 3. 点击左侧某条数据&#xff0c;这条被点击的数据就会被添加到右侧 4. 右侧的数据可以上下拖动换位置 5. 右侧有数据时&#xff0c;点击"确定"…

亚马逊国际站商品爬虫:Python实战指南

在数字化时代&#xff0c;数据的价值不言而喻。对于电商领域而言&#xff0c;获取竞争对手的商品信息、价格、评价等数据&#xff0c;对于市场分析和策略制定至关重要。本文将带你了解如何使用Python编写爬虫&#xff0c;以亚马逊国际站为例&#xff0c;按照关键字搜索并获取商…

Problem: 3046. 分割数组(LeetCode)

题目来源&#xff1a; https://leetcode.cn/problems/split-the-array/description/3046. 分割数组 - 给你一个长度为 偶数 的整数数组 nums 。你需要将这个数组分割成 nums1 和 nums2 两部分&#xff0c;要求&#xff1a; * nums1.length nums2.length nums.length / 2 。 *…

InstructGPT:基于人类反馈训练语言模型遵从指令的能力

大家读完觉得有意义记得关注和点赞&#xff01;&#xff01;&#xff01; 大模型进化树&#xff0c;可以看到 InstructGPT 所处的年代和位置。来自 大语言模型&#xff08;LLM&#xff09;综述与实用指南&#xff08;Amazon&#xff0c;2023&#xff09; 目录 摘要 1 引言 …

【浏览器】缓存

为什么有缓存&#xff1f; 在一个C/S结构中&#xff0c;最基本的缓存分为两种&#xff1a; 客户端缓存服务器缓存 以下重点讲客户端缓存 所谓客户端缓存&#xff0c;顾名思义&#xff0c;是将某一次的响应结果保存在客户端&#xff08;比如浏览器&#xff09;中&#xff0c;而…

产品原型设计

&#x1f923;&#x1f923;目录&#x1f923;&#x1f923; 一、Axure原型设计&#xff08;Axure RP 9 &#xff09;1.1 软件下载安装1.2 产品原型展示1.3 产品原型下载1.4 视频课程推荐 二、磨刀原型设计2.1 软件下载安装2.2 产品原型展示2.3 产品原型下载2.4 视频课程推荐 什…

力扣-数据结构-7【算法学习day.78】

前言 ###我做这类文章一个重要的目的还是给正在学习的大家提供方向&#xff08;例如想要掌握基础用法&#xff0c;该刷哪些题&#xff1f;建议灵神的题单和代码随想录&#xff09;和记录自己的学习过程&#xff0c;我的解析也不会做的非常详细&#xff0c;只会提供思路和一些关…

【文献精读笔记】Explainability for Large Language Models: A Survey (大语言模型的可解释性综述)(一)

****非斜体正文为原文献内容&#xff08;也包含笔者的补充&#xff09;&#xff0c;灰色块中是对文章细节的进一步详细解释&#xff01; 三、传统微调范式&#xff08;Traditional Fine-Tuning Paradigm&#xff09; 在这个范式中&#xff0c;首先在大量未标记的文本数据上预…