Created: August 16, 2023 3:27 PM
Tags: 博客, 工作, 技术
事情起源于我对于远程开发的依赖,每次写代码或者运行程序都需要连接到我的开发服务器。tunnel并不是一个可靠的工具,而最实用的,始终是SSH
我相信许多人和我一样,正在使用vscode远程连接到自己的另一台电脑上进行工作。这样可以在某种程度上实现工作上云从而减轻对于手头终端的依赖。你不再需要背着一台沉重的电脑走来走去,可以在任何地方专注手头任务,在任何时候结束它并随便换一台电脑继续开始;另一个好处就是你也能不再考虑手头设备的性能,专注于它的续航、外观、键盘等等。在使用远程开发接近两个月后,我的结论是这么做只有好处,没有坏处,每个人都应该试试。
然而好的期望往往不能成真,远程开发也有它自己的问题。目前最困扰我的是每次连结SSH服务时,我总是需要手动输入密码,更可气的是当我身处异地,和服务器之间的链接并不总是那么稳定,每次网络断开或是切换工作目录我总是需要重新输入密码。这样的工作体验相当糟糕,你需要不断的输入那串可怕的密钥来证明你对这台服务器的所有权。特别是当我们在聚精会神的时候,一个不期而遇的打断要比意料之内的高延迟讨厌的多。
试想一下你被反复拦在门外。或每十分钟输入一次密码,即使你一直活跃在终端(这里本应该是ssh输入密码截图)
vscode利用一个配置文件来保存ssh信息,这个config文件被保存为用户home目录下的一个/.ssh/config
文件,文件内容就像:
1 | Host Myserver |
这个config文件指定了一个ssh链接的别名,用户可以直接通过ssh Myserver
命令来连接到服务器而不需要再指定IP和用户名。可惜的是我并不能在这个config文件中直接添加密码,这被认为是不安全的,谁会把密码明文放在一个文本文件中呢?(我真的想啊!)
幸运的是,这个配置文件依然支持其他身份验证方式,那就是密钥。通过在一个配置文件中添加类似IdentityFile ~/.ssh/id_rsa
的内容,我们就可以指定一个私钥文件,从而实现自动身份验证。
搞明白这一点,我们就知道需要做什么。把密钥部署到服务器和客户端就行,步骤如下
- 生成一对密钥
- 在服务器端完成公钥配置
- 在本地
config
文件指定私钥文件路径
我使用的是Windows笔记本作为客户端,Ubuntu作为服务端。以下操作是我的实现步骤供你们参考:
密钥生成
在windows终端下,使用ssh-keygen命令就可以生成一对密钥。输入该命令后一直回车,默认的密钥生成位置就是你的用户目录下的.ssh文件夹内。
在默认设置下,公钥和私钥的文件名都会是id_rsa,公钥会带着.pub的后缀。
接下来就是把公钥配置到服务器上了
公钥配置
在Linux上,如果想要使用密钥登陆,则需要将公钥储存在用户主目录下的.ssh
文件夹中的authorized_keys
文件中,每个公钥一行,每行包括三个部分分别是:
- Key Type: 密钥的类型,通常是 “ssh-rsa” 或 “ssh-ed25519”。
- Key Data: 公钥的内容。
- Comment: 注释,通常是用于标识此公钥的说明,例如用户名或用途。
如果打开id_rsa.pub
文件,会发现生成的公钥就是这个格式
只要在需要登录的用户根目录下创建这个authorized_keys
文件,再稍稍修改下权限就就好了,使用sudo chmod 600 authorized_keys
,最后别忘了优雅的重启ssh服务service sshd restart
authorized_keys 文件权限:
authorized_keys
文件应该具有600(rw——-)的权限,以确保只有所有者可以读写该文件。这是因为该文件包含了允许连接到服务器的公钥信息。
本地config文件配置
如果你在完成上面的两步后,试着登录ssh,可能就已经发现这台电脑和服务器之间不再需要密码了。Windows自带ssh工具可以直接读取你生成的私钥,这项功能也会影响到vscode。
但万一你很叛逆喜欢把私钥放在其它地方呢?就像我之前说的,config文件格式中可以加入一行来指定密钥。如果不想把密钥文件放在.ssh文件夹中,只需要
1 | Host Myserver |
完成了这一切之后,保存config
文件,为自己泡上一杯咖啡。
无惧网络波动,优雅打开vscode连接自己的服务器,让身份认证不再是困扰。