Open classicemi opened 5 years ago
过去很少远程 ssh 连接服务器去做一些事情,这次重新部署博客在 Linode 上免不了要经常 ssh 上服务器去改些东西,建立一个 ssh 连接就是必须的了。之前每次做这件事都是临时去查一下怎么弄然后照着做,一直记不住,为了把这项技能内化成自己的东西,写一篇备忘录存一下。
首先要知道 ssh 的原理,简单来说它是建立在个人电脑和远程服务器之间的一个信任凭据,就像对暗号一样,在本地电脑上生成两个文件,一个是公钥一个是私钥,只有它们之间可以配对成功,公钥用来存放在服务器上,私钥放在本机。需要和某个服务器建立 ssh 登录关系时,就把公钥扔在服务器上,本机保存好私钥,所以私钥就像一把钥匙一样。
那么第一步就是生成这两个文件,用到 ssh-keygen 命令:
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 <User@HostName>
原因其实很简单,因为本机存放了各种奇奇怪怪名字的私钥,ssh 并不知道哪个才是可以登录服务器的,在不指定私钥的情况下,ssh 会默认验证 id_rsa 这个私钥,而之前上传的并不是 id_rsa.pub,自然配对失败了。这个问题解决的办法有两个,一个是手动指定使用哪个私钥来进行 ssh 验证:
$ ssh -i <私钥文件路径> <User@HostName>
但是每次输入很烦,那么第二种方法就是写一个配置,告诉 ssh 每次在连接某个服务器时使用哪个私钥。在 ~/.ssh 目录下新建 config 文件,如果有了可以直接修改,在文件中加入下面的配置:
~/.ssh
Host <host_alias> #服务器别名 HostName <IP 或服务器名> IdentityFile <私钥文件路径> User <UserName> #用于登录的用户名
配置好后使用 ssh <host_alias> 命令就可以使用指定的私钥来登录对应的服务器了。
ssh <host_alias>
过去很少远程 ssh 连接服务器去做一些事情,这次重新部署博客在 Linode 上免不了要经常 ssh 上服务器去改些东西,建立一个 ssh 连接就是必须的了。之前每次做这件事都是临时去查一下怎么弄然后照着做,一直记不住,为了把这项技能内化成自己的东西,写一篇备忘录存一下。
在远程服务器上设定 ssh
首先要知道 ssh 的原理,简单来说它是建立在个人电脑和远程服务器之间的一个信任凭据,就像对暗号一样,在本地电脑上生成两个文件,一个是公钥一个是私钥,只有它们之间可以配对成功,公钥用来存放在服务器上,私钥放在本机。需要和某个服务器建立 ssh 登录关系时,就把公钥扔在服务器上,本机保存好私钥,所以私钥就像一把钥匙一样。
那么第一步就是生成这两个文件,用到
ssh-keygen
命令:接下去会询问要给新的 ssh key 起什么名字,默认的名字是 id_rsa 和 id_rsa.pub(公钥)。理论上用默认的就可以,id_rsa.pub 可以放在多个服务器上。但是过去我对这个一知半解,选择了每次都生成一个不同名字的 key,也成为了后来的一个坑。
下面要将公钥上传至服务器,只需要一行命令即可:
这里可能会需要输入服务器的登录密码,因为这个过程需要确认是有权限的人才能做。上传好公钥后,可以直接用
ssh <User@HostName>
来测试是否可以正常登录。之前如果使用的是默认的 id_rsa 名字的 key 的话,应该就可以直接登录了。但如果给 key 起了别的名字,这里会不可以直接登录而需要输入密码,也就是 ssh 失败。原因其实很简单,因为本机存放了各种奇奇怪怪名字的私钥,ssh 并不知道哪个才是可以登录服务器的,在不指定私钥的情况下,ssh 会默认验证 id_rsa 这个私钥,而之前上传的并不是 id_rsa.pub,自然配对失败了。这个问题解决的办法有两个,一个是手动指定使用哪个私钥来进行 ssh 验证:
但是每次输入很烦,那么第二种方法就是写一个配置,告诉 ssh 每次在连接某个服务器时使用哪个私钥。在
~/.ssh
目录下新建 config 文件,如果有了可以直接修改,在文件中加入下面的配置:配置好后使用
ssh <host_alias>
命令就可以使用指定的私钥来登录对应的服务器了。