使用VSCode进行远程炼丹

作者:韩冰

链接:

转自:知乎

本文分享一下我使用vscode作为我的炼丹炉的使用心得。在我们开发过程中,经常需要连接远程的服务器进行炼丹。通常情况下,我们会使用Pycharm的远程开发功能,同步服务器与本地的项目文件,使用远程解释器进行开发。但是使用过的同学都知道,重量级的Pycharm每次远程同步、加载远程解释器都需要相当长的时间。如果我们想要随时切换公司、学校、家里的各个场景,pycharm的同步、加载就成了一场噩梦。特别是当我们的python环境安装了很多依赖包,项目生成了大量文件的时候更是这样。直到vscode推出了Remote Development开发包,便完全解决了这个问题。让我可以在不同的场景快速切换,无需等待同步文件、环境。因为vscode远程开发完全是运行在服务器上的,我们本地的vsocde只是一个前端界面,所以根本无需同步服务器上的文件、解释器依赖库就可以体验到与本地开发完全相同的体验。自从使用了vscode的Remote Development功能,我便完全抛弃了Pycharm。

下载安装

官网下载vscode对应系统版本的安装包。

安装远程开发插件

安装完成后,vscode左侧多出了一个菜单栏,我们点击配置按钮配置远程服务器的地址。

选择当前用户目录下的ssh配置文件进行配置

每个服务器需要配置ip,用户名,ssh端口等信息。配置完成后,点击连接到远程的按钮

按照提示输入登录密码后,如果左下角显示了服务器的名称,就说明连接成功了。

连接成功后,你便可以在远程服务器上安装各种插件

图示的图标说明插件已经在远程安装。此时你便可以打开远程的任何文件夹进行项目开发,所有的编辑修改,运行代码也都会在远程进行执行。体验过之后就会感觉超级方便。妈妈再也不用担心我同步文件,切换开发机了。同时,vscode还会非常贴心地为我们记录曾经打开过的文件夹,我们可以直接点击,连接服务器打开文件夹一步到位。

设置免密登录

上述配置完成后,还有一个小问题就是我们每次远程连接都要输入密码,很麻烦。所以这里我们设置一下ssh的免密登录。

在本地pc生成ssh公钥和私钥

ssh-keygen -t rsa

这样会在当前目录生成名为id_rsa的私钥文件和名为id_rsa.pub的公钥文件,-t表示密钥类型是rsa。如果你只输入ssh-keygen生成的RSA密钥长度为2048,如果你对安全性要求比较高可以指定4096位的长度:

ssh-keygen -b 4096 -t rsa

这里-b就是多少位,当你在生成SSHKEY的时候在命令行下会提示你Enter file in which to save the key,让你确认密钥文件保存的路径,一般回车即可(一般默认会在当前用户家目录下的.ssh目录下)。第二个提示是 Enter passphrase (empty for no passphrase) 让你输入一个密钥的密码,如果不输入则留空;回车生成公私钥完毕 。(这里建议密码留空)

手动上传公钥文件

将本地的公钥文件上传到服务器上,然后在服务器需要免密登录的用户家目录下查看是否有 ~/.ssh/authorized_keys 这个文件,如果没有手动创建一个:

touch ~/.ssh/authorized_keys

然后我们将公钥内容写入到authorized_keys文件中,因为这个文件可能已经有内容了,所以你可以使用如下方式

cat -n ~/.ssh/rsa.pub ~/.ssh/authorized_keys

将.ssh目录的权限为700

将authorized_keys目录的权限为600

chmod 700 ~/.ssh/chmode 600 ~/.ssh/authorized_keys

自动上传本地公钥

ssh-copy-id 复制公钥

这个工具还蛮有用的,不过它会将我本地的所有公钥都传到服务器,使用方法:

ssh-copy-id -p 22 username@remote-server

windows中没有ssh-copy-id可以使用以下命令代替

cat ~/.ssh/id_rsa.pub | ssh -p 22 username@remote-server "cat >> ~/.ssh/authorized_keys"

配置完成后,再次使用vscode远程连接服务器就不用再输入密码了。

使用autossh进行内网穿透

设想这样的场景,你在公司或者学校有一台用于炼丹的服务器,但是只能在内网访问。我在家里使用笔记本也想连接到远程的服务器中,这时我们应该怎么办呢。

答案是我们需要一台具有公网ip的服务器作为中继,使用autossh将公网服务器作为代理服务器。假设公网服务器为主机A,内网炼丹炉为主机B,我们的笔记本为C则

主机B上的操作

将主机B上的公钥拷贝到公网主机C实现B对C的免密登录(具体参考《ssh设置免密登录》),在主机B上执行autossh命令(可以在screen环境下执行)

screen -S reverse_proxyautossh -M 5555 -NR 9999:127.0.0.1:22 -p 22 username@remote-server

-M是公网主机echo的地址,9999是公网服务器的转发端口,第一个22是B主机ssh端口,-p 后面是外网主机ssh端口,最后一个参数是公网主机远程登录地址。使用该命令时保证公网主机5555, 9999端口都是空闲状态。(这两个端口可以改成任意空闲端口)

主机A上操作

主机A此时可以直接通过ssh访问公网主机的9999端口访问到B主机的终端,具体操作为

ssh -p 9999 username@remote-server

验证登录成功后,我们在vscode中配置A服务器的ip,和转发端口后就可以连接我们的内网主机了。

功能展示

连接加载速度超快,与本地体验完全相同的远程调试。

无需配置,直接运行远程的jupyter notebook。而且jupyter notebook还支持自动补全和调试功能,比原生的notebook更加强大。

推荐阅读

同样都是调参,为什么人家的神经网络比我牛逼100倍?

开源!TensorFlow 2.0中文开源书项目

谈谈我在PyTorch踩过的12坑

我们是一群哈工大和西湖大学的硕士博士,分享总结知识,欢迎关注[程序员大白],大家一起学习进步!