zzxworld

SSH 的易用性基础配置和免密证书登陆

从接触 Linux 服务器开始,就一直在和 SSH 打交道。没办法,这是远程登录并操作 Linux 服务器最方便的途径。由于我喜欢在终端环境下使用 ssh 命令来操作,为了有更舒服的使用体验,通常我都会对 SSH 做一些配置。

先来看看没有任何配置的情况下,该如何在终端环境下通过 SSH 登陆远程服务器:

ssh -p 3333 zzxworld@192.168.1.100
    ------- -------- -------------
      端口    用户名     服务器 IP

每次操作都需要输入这么一大串命令字符,要管理的服务器多了后,这非常麻烦。使用 SSH 配置文件可以解决这个问题。

SSH 配置文件通常位于 ~/.ssh/ 目录下,文件名为 config。它的配置格式如下:

Host my-server-01
    Hostname 192.168.1.100
    Port 3333
    User zzxworld

这样我就只需要通过以下命令来登录相同的远程服务器了:

ssh my-server-01

不需要再提供端口和用户名,只需要记住自定义的主机名称就可以了。如果有多个服务器只要按上面的配置格式配置多次即可:

Host my-server-01
    Hostname 192.168.1.100
    Port 3333
    User zzxworld

Host my-server-02
    Hostname 192.168.2.200
    Port 2222
    User zzx

这样用起来就方便了很多。

上面的配置只是解决了命令使用时输入繁琐和一部分记忆负担的问题,在登录时依然还是还是要输入密码。密码对我来说也是一项记忆负担,特别是在为了安全每台服务器都设置成不同密码的情况下。所以使用证书免密码登陆的方式就成了唯一选择。

SSH 使用证书登陆主要分为两步:

  1. 使用 ssh-keygen 命令生成一个公钥和私钥。
  2. 复制公钥的内容,单独一行保存到服务器端登录用户的 ~/.ssh/authorized_keys 文件中。

然后再次使用 ssh 命令登录该服务器,不用输入密码就能直接进入。如果在生成证书的时候自定义了证书名称,可能需要在 config 文件中使用 IdentityFile 配置项指定一下证书私钥路径:

Host my-server-01
    Hostname 192.168.1.100
    Port 3333
    User zzxworld
    IdentityFile ~/.ssh/zzxworld

这样一个无缝登录到线上服务器的操作环境就配置完成了。以后更换电脑或是重装系统只需要备份一下本地的 ~/.ssh 目录,复制到新电脑上立马就能开始和之前一样使用。不过这里要注意一下复制后的权限问题,如果复制到新的系统环境下不能使用,很大可能就是权限问题导致的。可以按照以下三条标准来检查:

  1. .ssh 目录的权限应该是 700
  2. .ssh 目录下的 config 文件权限应该是 644
  3. .ssh 目录下的证书文件应该是 600

如果相关目录和文件的权限不正确,通过 chmod 命令设置下权限就能解决。

最后还建议配置下保持 SSH 登录状态,具体可参考之前分享过的一篇文章:让 SSH 保持登录连接。按照文章的步骤配置后,可以避免长时间登陆远程服务器而没任何操作时导致的断线卡死问题。