你在自己电脑上生成了一对密钥(密钥 + 公钥),你应该在代码托管(远程仓库)服务商的个人帐户里,把自己的 SSH Key(公钥) 添加进去。这样你就可以直接在电脑上把项目的代码 Push 到项目的远程仓库,因为会使用 SSH Key 的方式去验证你的身份。
远程仓库的地址一般有两种,HTTPS 与 SSH,推荐使用 SSH 类型的地址,这样你就可以用自己的 SSH Key 去验证身份,不需要输入你在远程仓库上的用户名与密码。项目的远程仓库我们的服务器也需要有权限可以访问。因为在服务器上需要从远程仓库那里拉取项目最新的代码。
你可以在服务器上也生成一对密钥,然后把公钥添加到远程仓库的帐户里。或者,可以用 ssh-agent 转发,让服务器直接使用我们自己电脑上的 SSH Key 去验证身份。
试验
做个试验,假设你把电脑上的公钥添加到了 Github 的帐户里。打开命令行工具,Windows 上用 Bash 模式的 Cmder(完整版),macOS 打开终端。执行:
ssh -T git@github.com
如果返回:
Hi ninghao! You've successfully authenticated, but GitHub does not provide shell access.
说明我们成功地用自己的 SSH Key 通过了 Github 网站的身份验证。假设我们成功了。再做个试验,登录到你的服务器,执行同样的命令。
如果返回:
Permission denied (publickey).
说明我们现在还不能用 SSH Key 通过 Github 的身份验证,你需要在服务器上生成密钥,再把公钥(~/.ssh/id_rsa.pub)里的内容添加到你在 Github 网站的个人帐户里面。
现在我们可以配置使用 ssh-agent 转发的功能,让服务器使用我们电脑上的 SSH Key 去在 Github 上验证自己的身份。
配置
Windows
新建一个 Bash 模式的 Cmder 命令行标签。 先在后台运行 ssh-agent:
eval "$(ssh-agent -s)"
然后编辑一下当前用户主目录下的 SSH 的配置文件:
vi ~/.ssh/config
添加内容:
Host * ServerAliveInterval 60 AddKeysToAgent yes IdentityFile ~/.ssh/id_rsa Host 42.120.40.68 ForwardAgent yes
macOS
打开终端。编辑一下当前用户主目录下的 SSH 的配置文件:
vi ~/.ssh/config
添加内容:
Host * ServerAliveInterval 60 AddKeysToAgent yes UseKeychain yes IdentityFile ~/.ssh/id_rsa Host 42.120.40.68 ForwardAgent yes
解释
- ServerAliveInterval 60,每隔 60 秒向用 SSH 连接的服务器发送一点数据,这样服务器就不会自动断开跟你的 SSH 连接了。“哦,你还在 ~ ”
- AddKeysToAgent yes,就是把自己的 SSH Key 添加到 ssh-agent 里面使用。
- IdentityFile ~/.ssh/id_rsa,设置了密钥的位置。
- Host 42.120.40.68,在指定的 IP 地址主机,应用下面这些配置。
- ForwardAgent yes,使用 ssh-agent 转发。
macOS:
- UseKeychain yes,把 SSH Key 添加到系统的钥匙链里。这样就不需要每次手工把 SSH Key 添加到 ssh-agent 里面了。
测试
这里再登录到服务器,执行:
ssh -T git@github.com
这回服务器就会用 ssh-agent 里的 SSH Key,也就是我们自己电脑上的 SSH Key 去验证身份。如果你的电脑上的 SSH Key 添加到了 Github 个人帐户的设置里,在服务器上执行上面这行命令,应该就会返回:
Hi ninghao! You've successfully authenticated, but GitHub does not provide shell access.
注意
Windows 用户需要注意,每次启动命令行以后,你都需要手工去在后台运行 ssh-agent。我们可以配置一下命令行工具,启动它的时候让它自动在后台运行 ssh-agent。
Bash 模式的 Cmder 命令行工具的配置文件是 cmder/config/user-profile.sh,打开这个文件,添加一行:
eval "$(ssh-agent -s)"
评论
SSH 的玩法很多样嘛~~
7 年 1个月 以前