文章

SSH免密登陆

SSH免密登陆

SSH免密登陆

1 本机生成ssh密钥对

1
2
3
4
5
# 该步骤不是必须的,其他文件夹也行
cd ~/.ssh

# 密码可留空
ssh-keygen -t rsa -C "xxx@xxx.xxx"

注意:ssh-keygen会生成两个文件:

  1. 你输入的私钥文件名,该文件为私钥

  2. 你输入的私钥文件名.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

  1. 如果尚未创建,请创建一个~/.ssh/config文件。换句话说,在家目录的.ssh中,创建一个名为的文件config

  2. 在该.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 配置的密钥,彻底解决账户混淆问题。

本文由作者按照 CC BY 4.0 进行授权