SSH免密登陆
SSH免密登陆
1 本机生成ssh密钥对
1
2
3
4
5
# 该步骤不是必须的,其他文件夹也行
cd ~/.ssh
# 密码可留空
ssh-keygen -t rsa -C "xxx@xxx.xxx"
注意:ssh-keygen会生成两个文件:
你输入的私钥文件名,该文件为私钥你输入的私钥文件名.pub, 该文件为公钥。
2 使用密钥
2.1 临时使用密钥:添加密钥到ssh代理,相当于缓存
1
2
3
4
5
6
7
# 让ssh 识别新生成的密钥,在关机后该命令失效,需要重新输入
# linux
ssh-add ~/.ssh/id_rsa_new
# macos
ssh-add --apple-use-keychain ~/.ssh/id_rsa_new
ssh-add只是把私钥和密码添加到ssh agent缓存里,让其管理,不用每次都输入密码以及指定使用哪个密钥。
而–apple-use-keychain则是说把使用的密钥及密码添加到keychain里,可以打开keychain搜ssh即可找到。
但也可以直接不设置私钥密码,效果相同,linux上好像也能安装类似keychain的工具。
2.2 永久使用密钥: 配置ssh config
如果尚未创建,请创建一个
~/.ssh/config文件。换句话说,在家目录的.ssh中,创建一个名为的文件config。在该
.ssh/config文件中,添加以下行:1 2 3 4 5 6 7 8 9
# 以下配置可以设置多个 Host [自己设置一个别名] HostName [ip/domain] IdentityFile ~/.ssh/id_rsa # 该配置可以实现永久添加私钥到ssh agent Host * AddKeysToAgent yes UseKeychain yes # 该行应该是macos特定的,linux可能没有
1、注意,Host别名并不是起了就没用了,后续使用ssh命令时可以直接使用
ssh [别名]连接,它会自动匹配到对应的配置,2、注意,匹配不是匹配到了一个就结束了,它会匹配所有能匹配上的,***** 是通配符,能匹配所有别名,匹配上的配置会合并(我的初步判断)
3 添加公钥
生成密钥以后,公钥必须上传到服务器,才能使用公钥登录。
OpenSSH 规定,用户公钥保存在服务器的~/.ssh/authorized_keys文件。你要以哪个用户的身份登录到服务器,密钥就必须保存在该用户主目录的~/.ssh/authorized_keys文件。只要把公钥添加到这个文件之中,就相当于公钥上传到服务器了。每个公钥占据一行。如果该文件不存在,可以手动创建,权限644。
3.1 ssh-copy-id 命令:自动上传公钥
OpenSSH 自带一个ssh-copy-id命令,可以自动将公钥拷贝到远程服务器的~/.ssh/authorized_keys文件。如果~/.ssh/authorized_keys文件不存在,ssh-copy-id命令会自动创建该文件。
用户在本地计算机执行下面的命令,就可以把本地的公钥拷贝到服务器。
1
ssh-copy-id -i key_file user@host
上面命令中,-i参数用来指定公钥文件,user是所要登录的账户名,host是服务器地址。如果省略用户名,默认为当前的本机用户名。执行完该命令,公钥就会拷贝到服务器。
注意,公钥文件可以不指定路径和.pub后缀名,ssh-copy-id会自动在~/.ssh目录里面寻找。
4 常见问题
4.1 当VPN屏蔽22端口时,无法访问git clone 等操作
解决办法:请在 ~/.ssh/config 编辑该文件,并添加以下部分:
1
2
3
4
Host github.com
Hostname ssh.github.com
Port 443
User git
参考:在 HTTPS 端口使用 SSH - GitHub 文档
4.2 经常被远程断开连接
在客户端的~/.ssh/config中添加:
1
2
3
Host *
ServerAliveInterval 60
ServerAliveCountMax 3
这表示每60秒发送一次心跳,最多尝试3次。
4.3 多账户配置密钥登陆后,只使用第一次连接github的密钥
这是由于ssh agent缓存密钥出现的问题,SSH 默认尝试所有可用密钥,导致只用一个账户
解决方法: 1.清除缓存
1
ssh-add -D # 清除所有缓存的密钥
2.在客户端的~/.ssh/config目标配置中添加:
1
2
Host <域名>
IdentitiesOnly yes # 关键设置:仅使用指定密钥
这样配置后,每次连接都会严格使用对应 Host 配置的密钥,彻底解决账户混淆问题。