核心概念:SSH 密钥对
你需要理解 SSH 的工作原理:

-
密钥对:它包含两个文件:
- 私钥:这是你的身份证明,必须严格保密,绝对不能泄露给任何人,它存储在你的本地计算机上。
- 公钥:这是你的身份副本,可以安全地分享给任何人,你需要将它复制到你想连接的远程服务器上。
-
工作流程:
- 当你尝试通过 SSH 连接到服务器时,服务器会要求你进行身份验证。
- 你会提供你的私钥。
- 服务器会用你之前存放在那里的公钥来验证你的私钥是否匹配。
- 如果匹配成功,服务器就确认了你的身份,允许你登录。
这个过程比传统的密码登录更安全,因为私钥不会被在网络上传输,而且通常比复杂密码更难被暴力破解。
生成 SSH 密钥对
如果你的本地计算机上还没有 SSH 密钥对,你需要先生成一个。

打开你的终端(在 macOS/Linux 上)或 PowerShell/CMD(在 Windows 上),运行以下命令:
ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
参数解释:
-t rsa:指定密钥类型为 RSA,RSA 仍然是广泛使用的标准,你也可以使用ed25519(-t ed25519),它更新、更快、更安全,但可能需要较新的服务器支持。-b 4096:指定密钥的位长为 4096 位,位数越长,安全性越高。-C "your_email@example.com":为你的密钥添加一个注释,这通常是一个邮箱地址,方便你识别这个密钥是哪个设备或用途的。
执行过程:
-
选择保存位置:
(图片来源网络,侵删)Enter file in which to save the key (/home/user/.ssh/id_rsa):直接按回车键,接受默认路径
~/.ssh/id_rsa,这是 SSH 客户端默认查找私钥的位置。 -
设置密码(可选但强烈推荐):
Enter passphrase (empty for no passphrase):系统会要求你输入一个密码(称为 "passphrase"),这个密码是为你的私钥本身设置的加密密码。
- 强烈建议设置! 这样即使有人窃取了你的私钥文件,没有这个密码也无法使用。
- 如果你不想每次连接都输入密码,可以使用
ssh-agent来缓存它(稍后介绍)。 - 如果不想设置,直接按回车键(不推荐)。
-
确认密码:
Enter same passphrase again:再次输入密码。
完成后,你会在 ~/.ssh/ 目录下找到两个文件:
id_rsa:你的私钥。id_rsa.pub:你的公钥。
将公钥复制到远程服务器
你需要将公钥(id_rsa.pub添加到远程服务器的 ~/.ssh/authorized_keys 文件中,这个文件列出了所有被允许使用密钥登录该服务器的公钥。
有几种方法可以实现:
使用 ssh-copy-id 命令(最简单、最推荐)
如果你的本地系统支持 ssh-copy-id 命令,这是最简单的方法。
ssh-copy-id -i ~/.ssh/id_rsa.pub user@remote_server_ip
参数解释:
-i ~/.ssh/id_rsa.pub:指定你的公钥文件路径,如果默认就是id_rsa.pub,可以省略。user@remote_server_ip:你的远程服务器用户名和 IP 地址或域名。
执行后,系统会提示你输入 user 用户的登录密码。ssh-copy-id 会自动完成以下操作:
- 通过密码登录到服务器。
- 在服务器上创建
~/.ssh目录(如果不存在)。 - 将你的公钥内容追加到
~/.ssh/authorized_keys文件中。 - 设置正确的文件权限(
authorized_keys文件权限必须是600,.ssh目录权限必须是700)。
手动复制(ssh-copy-id 不可用)
-
查看并复制公钥内容:
cat ~/.ssh/id_rsa.pub
这会输出一长串以
ssh-rsa开头,以你的邮箱结尾的文本。完整地复制这一整行文本。 -
登录到服务器并添加公钥:
ssh user@remote_server_ip
使用密码登录到服务器。
-
在服务器上创建/编辑文件:
mkdir -p ~/.ssh echo "粘贴你刚才复制的公钥内容到这里" >> ~/.ssh/authorized_keys chmod 700 ~/.ssh chmod 600 ~/.ssh/authorized_keys
>>表示将内容追加到文件末尾。chmod命令用于设置文件权限,这是 SSH 安全所必需的。
使用私钥进行 SSH 连接
一切准备就绪,你可以使用私钥进行连接了。
基本用法
如果你的私钥文件是默认的 ~/.ssh/id_rsa,并且已经通过 ssh-agent 添加了密码(或者没有设置密码),你可以直接连接:
ssh user@remote_server_ip
SSH 客户端会自动在 ~/.ssh/ 目录下寻找名为 id_rsa、id_ecdsa、id_ed25519 等的私钥文件。
指定私钥文件(-i 选项)
如果你的私钥文件不是默认名称,或者存放在其他位置,你需要使用 -i 选项来明确指定。
ssh -i /path/to/your/private_key user@remote_server_ip
示例:
假设你的私钥文件在 ~/Documents/my_keys/github_key,连接命令就是:
ssh -i ~/Documents/my_keys/github_key git@github.com
处理私钥密码(Passphrase)
如果你在生成私钥时设置了密码,每次使用这个私钥连接时,系统都会提示你输入密码。
为了避免每次都输入,你可以使用 ssh-agent 来在后台缓存你的私钥密码。
在 macOS 或现代 Linux 系统上:
- 启动 ssh-agent:
eval "$(ssh-agent -s)"
- 添加私钥到 agent:
ssh-add ~/.ssh/id_rsa
系统会提示你输入一次私钥的密码,之后,只要你的终端会话没有关闭,再次使用 SSH 连接时就无需再输入密码了。
常见问题与技巧
连接时提示 Permission denied (publickey).
这通常意味着:
- 远程服务器上的
~/.ssh/authorized_keys文件中没有你的公钥。 - 文件或目录权限不正确,确保:
- 远程服务器上
~/.ssh目录的权限是700(chmod 700 ~/.ssh)。 - 远程服务器上
authorized_keys文件的权限是600(chmod 600 ~/.ssh/authorized_keys)。
- 远程服务器上
- 本地私钥文件权限太开放,确保本地私钥文件
~/.ssh/id_rsa的权限是600(chmod 600 ~/.ssh/id_rsa)。
连接时提示 Could not resolve hostname
检查你输入的远程服务器 IP 地址或域名是否正确。
为不同的服务器使用不同的密钥
你可以为不同的项目或服务器创建不同的密钥对,并在 ~/.ssh/config 文件中进行配置,这样就不需要每次都手动指定 -i。
编辑 ~/.ssh/config 文件:
# 编辑配置文件 nano ~/.ssh/config
添加如下内容:
# 为服务器 'web-server' 配置
Host web-server
HostName 192.168.1.100
User admin
IdentityFile ~/.ssh/web_server_key
# 为 GitHub 配置
Host github.com
HostName github.com
User git
IdentityFile ~/.ssh/github_key
你可以使用更简单的命令连接:
ssh web-server ssh github
| 步骤 | 命令/操作 | 描述 |
|---|---|---|
| 生成密钥 | ssh-keygen -t rsa -b 4096 -C "email" |
在本地创建私钥和公钥对。 |
| 复制公钥 | ssh-copy-id user@host |
(推荐) 将公钥安全地添加到远程服务器。 |
| 手动复制 | cat id_rsa.pub + 手动添加到服务器 |
手动复制公钥内容到服务器的 authorized_keys 文件。 |
| 连接 | ssh user@host |
使用默认私钥连接。 |
| 指定私钥 | ssh -i /path/to/key user@host |
当私钥文件名或位置不是默认时使用。 |
| 缓存密码 | eval "$(ssh-agent -s)" + ssh-add key |
避免每次 SSH 连接都输入私钥的密码。 |
| 配置别名 | 编辑 ~/.ssh/config |
为不同服务器创建简洁的连接别名。 |
遵循以上步骤,你就可以安全、高效地使用 SSH 私钥进行连接了。
