Featured image of post Linux 中 SSH 密钥对创建与分发指南 🔐

Linux 中 SSH 密钥对创建与分发指南 🔐

SSH(Secure Shell)密钥对是 Linux 系统中安全远程登录和文件传输的基石。采用密钥认证比传统的密码认证更安全,且便于自动化管理。

Linux 中 SSH 密钥对创建与分发指南 🔐

SSH(Secure Shell)密钥对是 Linux 系统中安全远程登录和文件传输的基石。采用密钥认证比传统的密码认证更安全,且便于自动化管理。


导航目录


📚 简介

SSH密钥对是现代服务器管理中的重要工具,它提供了比传统密码认证更安全、更便捷的远程连接方式。✨

为什么选择SSH密钥对?

  • 🔒 增强安全性 - 避免密码被暴力破解
  • 提升效率 - 一次配置,长期免密登录
  • 🔧 自动化友好 - 适合脚本和自动化部署
  • 🛡️ 防止中间人攻击 - 基于非对称加密技术

🚀 一键密钥对创建与分发

1
bash <(curl -sL gitee.com/meimolihan/script/raw/master/sh/ssh/auto_keypush.sh) 251 252 254
  • ⚡ 免交互生成SSH密钥对
  • 🔧 安装必要工具
  • 🚀 免交互分发SSH密钥对
  • 🔍 连接测试


⚡ 免交互生成SSH密钥对

核心命令详解

1
2
mkdir -pm 700 /root/.ssh && \
ssh-keygen -f /root/.ssh/id_rsa -N '' -q

🎯 命令分解说明

  1. 创建SSH目录

    1
    
    mkdir -pm 700 /root/.ssh
    
    • -p:递归创建所需目录
    • -m 700:设置目录权限为700(仅所有者可读写执行)
    • 🔒 安全要求:SSH目录必须严格权限控制
  2. 生成密钥对

    1
    
    ssh-keygen -f /root/.ssh/id_rsa -N '' -q
    
    • -f /root/.ssh/id_rsa:指定密钥文件路径和名称
    • -N '':设置空密码(无密码保护密钥)
    • -q:安静模式,不显示进度信息

📁 生成的文件

  • id_rsa 🔑 - 私钥文件(必须严格保密!)
  • id_rsa.pub 🌐 - 公钥文件(用于分发到服务器)

🔧 安装必要工具

安装sshpass工具

1
apt update -y && apt install -y sshpass

🔍 工具说明

  • sshpass:用于在命令行中非交互式地提供SSH密码
  • 适用场景:自动化脚本、CI/CD流水线、批量部署

📌 安装参数解释

  • apt update -y:更新软件包列表,-y自动确认
  • apt install -y sshpass:安装sshpass,-y自动确认安装

🔄 其他系统安装方法

1
2
3
4
5
# CentOS/RHEL系统
yum install -y sshpass

# macOS系统
brew install hudochenkov/sshpass/sshpass

🚀 免交互分发SSH密钥对

核心分发命令

1
sshpass -pYourpassword ssh-copy-id -o StrictHostKeyChecking=no 10.10.10.251

🎯 参数详细解析

参数 说明 注意事项
-pYourpassword 目标服务器密码 🔒 生产环境中建议使用其他安全方式
-o StrictHostKeyChecking=no 跳过主机密钥验证 ⚠️ 首次连接时自动接受主机密钥
10.10.10.251 目标服务器地址 可以是IP或域名

🔧 命令执行过程

  1. 自动认证:sshpass提供密码给ssh-copy-id
  2. 公钥传输:将本地公钥复制到目标服务器
  3. 权限设置:自动设置正确的文件权限
  4. 配置完成:公钥添加到~/.ssh/authorized_keys

📝 替代方案(更安全)

1
2
3
4
5
6
# 使用环境变量(避免密码在命令中明文)
export SSHPASS=Yourpassword
sshpass -e ssh-copy-id -o StrictHostKeyChecking=no 10.10.10.251

# 使用密钥文件(推荐)
sshpass -f password_file ssh-copy-id 10.10.10.251

🔍 连接测试

基础连接测试

1
ssh root@10.10.10.251

成功标志

  • 无需输入密码直接登录
  • 显示目标服务器的命令行提示符
  • 返回退出代码为0

🧪 全面测试方案

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# 1. 基础连接测试
ssh root@10.10.10.251 "echo 'SSH连接成功!'"

# 2. 带详细日志的测试
ssh -v root@10.10.10.251 exit

# 3. 执行远程命令测试
ssh root@10.10.10.251 "hostname && date && whoami"

# 4. 文件传输测试
echo "测试文件内容" | ssh root@10.10.10.251 "cat > /tmp/ssh_test.txt"

🔧 故障排除

1
2
3
4
5
6
7
8
# 检查公钥是否正确添加
ssh root@10.10.10.251 "cat ~/.ssh/authorized_keys"

# 检查文件权限
ssh root@10.10.10.251 "ls -la ~/.ssh/"

# 查看SSH连接日志
ssh root@10.10.10.251 "tail -f /var/log/auth.log"

💡 最佳实践与技巧

🎯 自动化脚本示例

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
#!/bin/bash
# ***************************************************************
#  File: auto_keypush.sh
#  Desc: 免交互生成 SSH 密钥并批量分发到多台主机
#  使用方法:
#       chmod +x auto_keypush.sh
#       ./auto_keypush.sh 251 252
# ***************************************************************

############################  用户可调变量  ############################
USER="root"                   # 远程登录用户
PASS="Password"               # 远程登录密码
NET="10.10.10"                # 网段前三段
KEY_PATH="/root/.ssh/id_rsa"  # 本机密钥保存路径
########################################################################

# 0. 欢迎语与用法提示
cat << EOF
╔══════════════════════════════════════════════════════════════╗
║                欢迎使用 SSH 密钥批量分发工具                 ║
╠══════════════════════════════════════════════════════════════╣
║  作用:一键生成本地密钥并自动分发到多台远程主机              ║
║  用法:./auto_keypush.sh <主机号> [主机号] ...               ║
║  示例:./auto_keypush.sh 251 252                             ║
╚══════════════════════════════════════════════════════════════╝
EOF

[ $# -eq 0 ] && { echo "【ERROR】未提供任何主机号,脚本终止。"; exit 1; }

# 1. 生成本机密钥(如已存在则跳过)
[ -f "$KEY_PATH" ] || {
    echo "【INFO】正在生成本地密钥 ..."
    mkdir -pm 700 "$(dirname "$KEY_PATH")"
    ssh-keygen -f "$KEY_PATH" -N '' -q
}

# 2. 自动安装 sshpass(按系统类型)
if ! command -v sshpass &>/dev/null; then
    echo "【INFO】未检测到 sshpass,正在自动安装 ..."
    if [ -f /etc/redhat-release ]; then
        yum makecache -y && yum install -y sshpass
    elif [ -f /etc/debian_version ]; then
        apt update -y && apt install -y sshpass
    elif [ -f /etc/alpine-release ]; then
        apk add --no-cache sshpass
    else
        echo "【ERROR】无法识别系统,请手动安装 sshpass 后再执行脚本"
        exit 1
    fi
fi

# 3. 循环推送公钥 + 动态打印测试命令
for SUFFIX in "$@"; do
    HOST="${NET}.${SUFFIX}"
    echo "【INFO】正在推送公钥到 ${USER}@${HOST} ..."
    if sshpass -p"$PASS" ssh-copy-id -o StrictHostKeyChecking=no \
               -i "${KEY_PATH}.pub" "${USER}@${HOST}" &>/dev/null; then
        echo "【OK  】${HOST} 完成"
        # ---- 动态打印测试命令(含分割线) ----
        printf "\033[36m%s\033[0m\n" "------------------------------------------------"
        echo -e "\033[32m【TEST】验证命令: ssh ${USER}@${HOST}\033[0m"
        printf "\033[36m%s\033[0m\n" "------------------------------------------------"
    else
        echo "【FAIL】${HOST} 失败,请检查密码或网络"
    fi
done

echo "【DONE】全部任务结束"

🔧 SSH配置优化

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
# 编辑 ~/.ssh/config
Host server-*
    User root
    Port 22
    IdentityFile ~/.ssh/id_rsa
    ServerAliveInterval 60
    ServerAliveCountMax 3

Host 10.10.10.251
    HostName 10.10.10.251
    User root

Host 10.10.10.252
    HostName 10.10.10.252
    User admin

📊 批量操作技巧

1
2
3
4
5
# 并行分发到多个服务器
echo "10.10.10.251 10.10.10.252 10.10.10.253" | tr ' ' '\n' | xargs -I{} -P 3 bash -c '
    echo "处理: {}"
    sshpass -pYourpassword ssh-copy-id -o StrictHostKeyChecking=no root@{}
'

🛡️ 安全注意事项

🔒 密钥安全

1
2
3
4
5
6
7
8
# 设置正确的文件权限
chmod 700 ~/.ssh
chmod 600 ~/.ssh/id_rsa
chmod 644 ~/.ssh/id_rsa.pub
chmod 600 ~/.ssh/authorized_keys

# 定期检查权限
ls -l ~/.ssh/

🚨 生产环境安全建议

  1. 密码安全

    • ❌ 避免在脚本中硬编码密码
    • ✅ 使用环境变量或密钥文件
    • ✅ 考虑使用SSH代理或证书认证
  2. 服务器配置

    1
    2
    3
    4
    5
    
    # 禁用密码认证(配置后)
    # 在 /etc/ssh/sshd_config 中设置:
    PasswordAuthentication no
    PubkeyAuthentication yes
    PermitRootLogin without-password
    
  3. 监控与审计

    1
    2
    3
    4
    5
    
    # 监控SSH登录
    tail -f /var/log/auth.log | grep ssh
    
    # 检查 authorized_keys 文件
    find /home -name authorized_keys -exec ls -la {} \;
    

🔄 密钥轮换策略

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
# 1. 生成新密钥对
ssh-keygen -f ~/.ssh/id_rsa_new -N ''

# 2. 分发新公钥
sshpass -pPassword ssh-copy-id -i ~/.ssh/id_rsa_new.pub root@10.10.10.251

# 3. 测试新密钥
ssh -i ~/.ssh/id_rsa_new root@10.10.10.251

# 4. 替换旧密钥
mv ~/.ssh/id_rsa_new ~/.ssh/id_rsa
mv ~/.ssh/id_rsa_new.pub ~/.ssh/id_rsa.pub

总结

通过本指南,您已经掌握了:✨

  • SSH密钥对的原理和优势
  • 免交互生成密钥对的自动化方法
  • sshpass工具的安装和使用技巧
  • 安全的公钥分发流程
  • 全面的连接测试方案
  • 生产环境的最佳实践和安全建议

🎉 现在您可以 confidently 使用SSH密钥对来安全高效地管理您的服务器了!

💡 提示:在实际生产环境中,建议结合网络防火墙、入侵检测系统和定期安全审计,构建多层次的防御体系。

最后更新于 2025-10-26