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
| yum install -y sshpass
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
| ssh root@10.10.10.251 "echo 'SSH连接成功!'"
ssh -v root@10.10.10.251 exit
ssh root@10.10.10.251 "hostname && date && whoami"
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 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
USER="root" PASS="Password" NET="10.10.10" KEY_PATH="/root/.ssh/id_rsa"
cat << EOF ╔══════════════════════════════════════════════════════════════╗ ║ 欢迎使用 SSH 密钥批量分发工具 ║ ╠══════════════════════════════════════════════════════════════╣ ║ 作用:一键生成本地密钥并自动分发到多台远程主机 ║ ║ 用法:./auto_keypush.sh <主机号> [主机号] ... ║ ║ 示例:./auto_keypush.sh 251 252 ║ ╚══════════════════════════════════════════════════════════════╝ EOF
[ $# -eq 0 ] && { echo "【ERROR】未提供任何主机号,脚本终止。"; exit 1; }
[ -f "$KEY_PATH" ] || { echo "【INFO】正在生成本地密钥 ..." mkdir -pm 700 "$(dirname "$KEY_PATH")" ssh-keygen -f "$KEY_PATH" -N '' -q }
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
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
| 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
|
PasswordAuthentication no PubkeyAuthentication yes PermitRootLogin without-password
|
监控与审计:
1 2 3 4 5
| tail -f /var/log/auth.log | grep ssh
find /home -name authorized_keys -exec ls -la {} \;
|
🔄 密钥轮换策略
1 2 3 4 5 6 7 8 9 10 11 12
| ssh-keygen -f ~/.ssh/id_rsa_new -N ''
sshpass -pPassword ssh-copy-id -i ~/.ssh/id_rsa_new.pub root@10.10.10.251
ssh -i ~/.ssh/id_rsa_new root@10.10.10.251
mv ~/.ssh/id_rsa_new ~/.ssh/id_rsa mv ~/.ssh/id_rsa_new.pub ~/.ssh/id_rsa.pub
|
总结
通过本指南,您已经掌握了:✨
- ✅ SSH密钥对的原理和优势
- ✅ 免交互生成密钥对的自动化方法
- ✅ sshpass工具的安装和使用技巧
- ✅ 安全的公钥分发流程
- ✅ 全面的连接测试方案
- ✅ 生产环境的最佳实践和安全建议
🎉 现在您可以 confidently 使用SSH密钥对来安全高效地管理您的服务器了!
💡 提示:在实际生产环境中,建议结合网络防火墙、入侵检测系统和定期安全审计,构建多层次的防御体系。