classicemi / blog

🖋 my personal blog
https://wushuang.name/
32 stars 2 forks source link

设定 ssh 过程备忘录 #24

Open classicemi opened 5 years ago

classicemi commented 5 years ago

过去很少远程 ssh 连接服务器去做一些事情,这次重新部署博客在 Linode 上免不了要经常 ssh 上服务器去改些东西,建立一个 ssh 连接就是必须的了。之前每次做这件事都是临时去查一下怎么弄然后照着做,一直记不住,为了把这项技能内化成自己的东西,写一篇备忘录存一下。

在远程服务器上设定 ssh

首先要知道 ssh 的原理,简单来说它是建立在个人电脑和远程服务器之间的一个信任凭据,就像对暗号一样,在本地电脑上生成两个文件,一个是公钥一个是私钥,只有它们之间可以配对成功,公钥用来存放在服务器上,私钥放在本机。需要和某个服务器建立 ssh 登录关系时,就把公钥扔在服务器上,本机保存好私钥,所以私钥就像一把钥匙一样。

那么第一步就是生成这两个文件,用到 ssh-keygen 命令:

$ ssh-keygen

接下去会询问要给新的 ssh key 起什么名字,默认的名字是 id_rsa 和 id_rsa.pub(公钥)。理论上用默认的就可以,id_rsa.pub 可以放在多个服务器上。但是过去我对这个一知半解,选择了每次都生成一个不同名字的 key,也成为了后来的一个坑。

下面要将公钥上传至服务器,只需要一行命令即可:

$ ssh-copy-id -i <公钥文件路径> <User@HostName>

这里可能会需要输入服务器的登录密码,因为这个过程需要确认是有权限的人才能做。上传好公钥后,可以直接用 ssh <User@HostName> 来测试是否可以正常登录。之前如果使用的是默认的 id_rsa 名字的 key 的话,应该就可以直接登录了。但如果给 key 起了别的名字,这里会不可以直接登录而需要输入密码,也就是 ssh 失败。

原因其实很简单,因为本机存放了各种奇奇怪怪名字的私钥,ssh 并不知道哪个才是可以登录服务器的,在不指定私钥的情况下,ssh 会默认验证 id_rsa 这个私钥,而之前上传的并不是 id_rsa.pub,自然配对失败了。这个问题解决的办法有两个,一个是手动指定使用哪个私钥来进行 ssh 验证:

$ ssh -i <私钥文件路径> <User@HostName>

但是每次输入很烦,那么第二种方法就是写一个配置,告诉 ssh 每次在连接某个服务器时使用哪个私钥。在 ~/.ssh 目录下新建 config 文件,如果有了可以直接修改,在文件中加入下面的配置:

Host         <host_alias>   #服务器别名
HostName     <IP 或服务器名>
IdentityFile <私钥文件路径>
User         <UserName>     #用于登录的用户名

配置好后使用 ssh <host_alias> 命令就可以使用指定的私钥来登录对应的服务器了。