1. 生成 SSH 密钥
在本地(Windows PowerShell / Linux / Mac)执行
# 生成 Ed25519 类型密钥(推荐,更安全更快)
# Linux / Mac / Git Bash / WSL
ssh-keygen -t ed25519 -C "your-email@example.com" -f ~/.ssh/your-key-name
# Windows PowerShell
ssh-keygen -t ed25519 -C "your-email@example.com" -f $env:USERPROFILE\.ssh\your-key-name
参数说明:
| 参数 | 作用 | 示例 |
|---|---|---|
-t ed25519 |
密钥类型 | Ed25519(推荐) |
-C |
注释(方便识别用途) | "deploy-server-key" |
-f |
保存路径和文件名 | ~/.ssh/deploy-key |
交互提示:
Enter passphrase (empty for no passphrase): [直接回车,不设密码]
Enter same passphrase again: [直接回车]生成的文件
| 文件 | 说明 | 谁需要 |
|---|---|---|
your-key-name |
私钥 | 自己保管,绝对不能上传 |
your-key-name.pub |
公钥 | 添加到服务器 |
查看公钥内容(复制用)
cat ~/.ssh/your-key-name.pub # Linux、Mac、Git Bash、WSL
# 或
type ~/.ssh/your-key-name.pub # Windows (CMD / PowerShell)
2. 配置免密登录
方法一:直接用 root 用户
1. 查看公钥内容(如果还没复制)
cat ~/.ssh/root-key.pub # Linux、Mac、Git Bash、WSL
# 或
type ~/.ssh/root-key.pub # Windows (CMD / PowerShell)
2. 登录 root 用户
ssh root@192.168.1.1
# 输入 root 密码
3. 配置公钥
# 创建 .ssh 目录(如果不存在)
mkdir -p ~/.ssh
# 添加公钥
echo "你的公钥内容" >> ~/.ssh/authorized_keys
# 设置权限
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
4. 退出并测试
exit
ssh -i ~/.ssh/root-key root@192.168.1.1
方法二:直接用 deploy 用户
1. 查看公钥内容(如果还没复制)
cat ~/.ssh/deploy-key.pub # Linux、Mac、Git Bash、WSL
# 或
type ~/.ssh/deploy-key.pub # Windows (CMD / PowerShell)
2. 登录 deploy 用户(如果知道密码)
# 创建 deploy 用户(如果没有 deploy 用户)
ssh root@192.168.1.1
useradd -m -s /bin/bash deploy
passwd deploy # 可选:给 deploy 设置密码
ssh deploy@192.168.1.1
# 输入 deploy 密码
如果不知道 deploy 密码,可使用 root 用户配置公钥。
3. 为 deploy 用户配置公钥
# 创建 .ssh 目录(如果不存在)
mkdir -p /home/deploy/.ssh
# 添加公钥
echo "你的公钥内容" >> /home/deploy/.ssh/authorized_keys
# 设置权限
chmod 700 /home/deploy/.ssh
chmod 600 /home/deploy/.ssh/authorized_keys
chown -R deploy:deploy /home/deploy/.ssh
4. 退出并测试
exit
ssh -i ~/.ssh/deploy-key deploy@192.168.1.1
方法三:使用 ssh-copy-id(Linux/Mac/Git Bash)
ssh-copy-id -i ~/.ssh/your-key-name.pub deploy@192.168.1.1
# Windows 下使用 ssh-copy-id 替代方案(因为 Windows 没有这个命令)
type $env:USERPROFILE\.ssh\your-key-name.pub | ssh deploy@192.168.1.1 "cat >> ~/.ssh/authorized_keys"
我应该用哪个用户?
| 你的情况 | 推荐方案 |
|---|---|
| 知道 root 密码,不知道 deploy 密码 | 直接用 root 用户(方法一) |
| 知道 deploy 密码 | 用 deploy 用户(方法二) |
| 想要更安全,避免用 root | 用 deploy 用户(方法二) |
| 想要最简单的部署脚本 | 用 root 用户(避免权限问题) |
一键脚本把公钥复制到 deploy 用户(Linux/Mac/Git Bash)
在本地执行,一行搞定:
cat ~/.ssh/deploy-key.pub | ssh root@192.168.1.1 "mkdir -p /home/deploy/.ssh && cat >> /home/deploy/.ssh/authorized_keys && chmod 700 /home/deploy/.ssh && chmod 600 /home/deploy/.ssh/authorized_keys && chown -R deploy:deploy /home/deploy/.ssh"
输入 root 密码后自动完成。
权限说明(为什么需要这些命令)
| 命令 | 为什么 |
|---|---|
chmod 700 ~/.ssh |
只有自己能进入 .ssh 目录 |
chmod 600 authorized_keys |
只有自己能修改公钥文件 |
chown -R deploy:deploy |
文件必须属于 deploy 用户 |
不设置正确权限,SSH 会拒绝免密登录。
服务器上的正确权限
| 路径 | 权限 | 命令 | 说明 |
|---|---|---|---|
/home/用户名 |
755 或 700 |
chmod 755 /home/deploy |
家目录 |
/home/用户名/.ssh |
700 |
chmod 700 ~/.ssh |
只有所有者能进入 |
/home/用户名/.ssh/authorized_keys |
600 |
chmod 600 ~/.ssh/authorized_keys |
只有所有者能读写 |
| 所有者 | 必须是登录用户 | chown -R deploy:deploy ~/.ssh |
不能是 root |
一键修复权限(用 root 执行)
# 修复 deploy 用户的 SSH 权限
chown -R deploy:deploy /home/deploy/.ssh
chmod 700 /home/deploy/.ssh
chmod 600 /home/deploy/.ssh/authorized_keys
查看当前权限
# 查看 .ssh 目录
ls -ld /home/deploy/.ssh
# 查看 authorized_keys 文件
ls -l /home/deploy/.ssh/authorized_keys
正确输出示例:
drwx------ 2 deploy deploy 4096 Apr 12 00:20 /home/deploy/.ssh
-rw------- 1 deploy deploy 113 Apr 12 00:18 /home/deploy/.ssh/authorized_keys测试验证
测试免密登录
ssh -i ~/.ssh/your-key-name deploy@192.168.1.1
如果成功,你会看到
[deploy@root ~]$如果失败,要求输入密码
说明配置有问题,检查权限和公钥内容。
详细调试模式(查看具体错误)
ssh -vvv -i ~/.ssh/your-key-name deploy@192.168.1.1
快速测试命令
ssh -i ~/.ssh/deploy-key deploy@192.168.1.1 "echo 登录成功"
输出 登录成功 就代表配置好了。
常见问题排查
| 问题 | 可能原因 | 解决方法 |
|---|---|---|
| 仍然要求密码 | 公钥没加对 | 检查 authorized_keys 内容 |
| 仍然要求密码 | 权限不对 | 执行权限修复命令 |
| 仍然要求密码 | 所有者是 root | chown -R deploy:deploy ~/.ssh |
Permission denied (publickey) |
SSH 配置禁用了公钥登录 | 检查 /etc/ssh/sshd_config 中 PubkeyAuthentication yes |
bad ownership or modes |
权限太宽松 | 执行权限修复命令 |
| 找不到密钥文件 | 路径错误 | 使用绝对路径 -i C:\Users\用户名\.ssh\密钥名 |
| 明明有密钥却没用上 | ~/.ssh/config 中 IdentityFile 写错 |
检查路径或删除配置让 SSH 自动尝试 |
| 密钥权限太开放报错 | Windows 复制过来的权限不对 | chmod 600 ~/.ssh/your-key |
检查服务器 SSH 配置
# 登录服务器后执行
sudo grep -E "PubkeyAuthentication|AuthorizedKeysFile|PasswordAuthentication" /etc/ssh/sshd_config
应该看到:
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys如果修改了配置,重启 SSH:
sudo systemctl restart sshd
安全建议
- 私钥绝不外传:不要上传到 Git 仓库,不要分享给他人
- 使用不同密钥:不同用途使用不同密钥(如
github-key、deploy-key) - 禁用密码登录(可选,更安全):在
/etc/ssh/sshd_config中设置PasswordAuthentication no - 定期轮换密钥:定期生成新密钥,删除旧公钥
- 使用 Ed25519:比 RSA 更安全、更快
快速命令速查表
| 操作 | 命令 |
|---|---|
| 生成密钥 | ssh-keygen -t ed25519 -C "注释" -f ~/.ssh/密钥名 |
| 查看公钥 | cat ~/.ssh/密钥名.pub |
| 手动添加公钥(有密码) | echo "公钥" >> ~/.ssh/authorized_keys |
| 用 root 为 deploy 添加 | echo "公钥" >> /home/deploy/.ssh/authorized_keys |
| 修复权限 | chmod 700 ~/.ssh && chmod 600 ~/.ssh/authorized_keys |
| 修复所有者 | chown -R deploy:deploy /home/deploy/.ssh |
| 测试登录 | ssh -i ~/.ssh/密钥名 deploy@服务器IP |
| 调试模式 | ssh -vvv -i ~/.ssh/密钥名 deploy@服务器IP |
8. 扩展场景
GitHub/GitLab 配置对比
很多人配置 SSH 是为了 Git,以下是不同平台的配置对比:
| 用途 | 服务器地址 | 配置位置 |
|---|---|---|
| GitHub | github.com |
个人设置 → SSH and GPG keys |
| GitLab | gitlab.com |
偏好设置 → SSH Keys |
| 自己的服务器 | 192.168.1.1 |
~/.ssh/authorized_keys |