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密钥对来安全高效地管理您的服务器了!

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