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
|
🎯 命令分解说明:
-
创建SSH目录:
1
|
mkdir -pm 700 /root/.ssh
|
-p:递归创建所需目录
-m 700:设置目录权限为700(仅所有者可读写执行)
- 🔒 安全要求:SSH目录必须严格权限控制
-
生成密钥对:
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或域名 |
🔧 命令执行过程
- 自动认证:sshpass提供密码给ssh-copy-id
- 公钥传输:将本地公钥复制到目标服务器
- 权限设置:自动设置正确的文件权限
- 配置完成:公钥添加到
~/.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
|
🔍 连接测试
基础连接测试
✅ 成功标志:
- 无需输入密码直接登录
- 显示目标服务器的命令行提示符
- 返回退出代码为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/
|
🚨 生产环境安全建议
-
密码安全:
- ❌ 避免在脚本中硬编码密码
- ✅ 使用环境变量或密钥文件
- ✅ 考虑使用SSH代理或证书认证
-
服务器配置:
1
2
3
4
5
|
# 禁用密码认证(配置后)
# 在 /etc/ssh/sshd_config 中设置:
PasswordAuthentication no
PubkeyAuthentication yes
PermitRootLogin without-password
|
-
监控与审计:
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密钥对来安全高效地管理您的服务器了!
💡 提示:在实际生产环境中,建议结合网络防火墙、入侵检测系统和定期安全审计,构建多层次的防御体系。