有时候我们跑大型项目的时候,数据量往往比较大,这样造成本地计算机无法运行,需要把数据和代码都上传到服务器上。然而,服务器往往是Linux系统,没有图形化界面,进行代码的调试十分麻烦,很多时候需要靠写很多个print来观察变量,或者pdb调试,或者本地小数据调试完再上传到服务器等等操作,无法像本地计算机一样设置断点和其他查看功能那么方便。接下来,本文将以Python语言为示例,讲解一下如何通过VS Code这款比较好用的IDE进行远程调试代码。
其实我们常用的JetBrains家族(IntelliJ IDEA、Pycharm等)的开发工具里已经实现了远程开发功能,但是为什么本文要选择VS Code作为开发工具呢?原因有以下两点:
(1)JetBrains工具需要安装专业版才有远程调试的功能,而专业版是收费的,大部分人平时还是使用社区版。VS Code是微软的一款IDE软件,又开源又支持远程调试,而且还是免费的。
(2)JetBrains工具远程开发时通过FTP、SFTP(File Transfer Protocol,文件传输协议)实现,它们的远程开发的原理是通过文件传输协议连接到远程服务器,通过上传和下载的方式进行远程项目和本地项目的同步,这样的缺点是:不能实时同步、操作繁琐。而VS Code是通过SSH(Secure Shell)的方式连接到远程服务器,换句话说,VS Code在远程开发过程中扮演的角色更像是一款终端模拟工具,它不需要繁琐的上传和下载步骤,而且实时性更好,只需要在Windows上保存一下,就会瞬间同步到远程服务器。
本地环境:Windows 10 专业版
远程环境:Ubuntu 16.04(64bit)
Python版本:3.6
VS Code:1.43.2
第1步:安装软件
需要安装VS Code,建议选择Syetem Installer,具体bit根据自己电脑的情况下载。
第2步:安装插件
安装Remote Development这个插件,步骤如下图所示:
第3步:配置远程服务器
在SSH TARGETS配置远程服务器,具体步骤如下:
这里需要注意一个,Host是一个名称,自己可以随意命名。Hostname是远程服务器的IP,User是用于登录远程服务器的账户名称。
第4步:修改设置
打开VS Code设置,搜索Show Login Terminal,勾选下方"Always reveal the SSH login terminal",记得一定要操作这一步,不然会一直提示报错。
第5步:打开远程连接窗口
把鼠标放在上一步配置的远程连接条目上,右键,有两个条目可以选择,一个是Connect to Host in New Window,另一个是Connect to Host in Current Window,随便选哪个都行。然后就会在窗口打开我们想要的远程连接。
由于VS Code是通过SSH远程连接到远程服务器的方式进行远程开发,因此,每次打开远程连接是都会提示输入密码,显然这是非常繁琐的。我们可以通过配置免密登录的方式避免每次打开连接时都需要重复输入密码。
第1步:生成Windows公钥
进行这一步需要Windows配置有SSH工具,可以通过安装git、openssh实现。
这里先讲解下面这句命令行语句:
$ ssh-keygen -t rsa -b 4096 -C "[email protected]" -f ~/.ssh/文件名
上述命令会在当前~/.ssh目录下生成id_rsa和id_rsa.pub两个文件。其中id_rsa是私钥文件,id_rsa_.pub是公钥文件。
参数解释:
-t type 指定要创建的密钥类型。可以使用:“rsa1”(SSH-1) “rsa”(SSH-2) “dsa”(SSH-2)
-b bits 指定密钥长度。对于RSA密钥,最小要求768位,默认是2048位。DSA密钥必须恰好是1024位(FIPS 186-2 标准的要求)。
-C comment 提供一个新注释
-f ~/.ssh/文件名 公钥和私钥的输出位置和对应的文件名
前三个参数一般情况可以不用去管它,配置完SSH后打开cmd,这里需要说明一下,如果直接输入ssh-keygen
,一路Enter下去,可以在~/.ssh/
下生成两个文件——一个是公钥id_rsa.pub,一个私钥id_rsa,但是这样会遇到一个问题,如果你有多台服务器需要连接,你这样做会让后面的服务器的公私钥覆盖吊前面的服务器,这样其实不太好,所以这里还是建议大家使用下面这条语句,也就是在后面自定义文件名:
$ ssh-keygen -f C:/Users/user_name/.ssh/文件名
# 记得将“user_name”替换成自己的用户名,如果是Administrator,直接复制下面这条命令
$ ssh-keygen -f C:/Users/Administrator/.ssh/文件名
假如你有两台服务器,你可以输入如下:
服务器1:ssh-keygen -f C:/Users/user_name/.ssh/id_rsa_user1
服务器2:ssh-keygen -f C:/Users/user_name/.ssh/id_rsa_user2
然后一直点击Enter键,不用输入任何内容,最后会在C:\Users\user_name\.ssh\路径下看到服务器1对应的私钥文件id_rsa_user1、公钥文件id_rsa_user1.pub和服务器2对应的私钥文件id_rsa_user2、公钥文件id_rsa_user2.pub 。之后通过FTP等方式把公钥文件上传到对应的远程服务器。
第2步:配置远程服务器
用MobaXterm等终端模拟工具登录远程服务器,输入
$ cd ~/.ssh
$ ls
进入SSH配置目录,查看一下是否有一个名为authorized_keys的文件,如果没有就创建一个,然后把刚上传的id_rsa_user.pub中的内容附到authorized_keys文件中,输入
$ touch authorized_keys
$ cat id_rsa_user.pub >> authorized_keys
第3步:修改文件权限
这一步非常重要,如果没有这一步,前面的操作都没有用。就是给authorized_keys修改为600的权限,输入
$ chmod -R 600 authorized_keys
第4步:修改config文件
打开前面讲到的VS Code中的config文件,添加一个配置IdentityFile,如下图所示,目的是用本地的私钥登录远程服务器,去给它所上传的公钥验证。
这样就完成了免密登录的配置,按照第三部分讲到的那样进行远程连接即可,连接成功后,界面如下。点击图中箭头处的远程服务器,可以控制断开或连接服务器。
第1步:打开服务器文件夹
按照上面步骤,打开服务器内部你所指定的一个工作文件夹
第2步:配置Python环境
在上面打开的文件夹下随便新建一个helloworld.py,然后写一段简单的代码。之后按照如下步骤:
{
"name": "Python: Current File",
"type": "python",
"request": "launch",
"program": "${file}",
"console": "integratedTerminal",
"cwd": "${fileDirname}" // 设置相对路径,在debug时可以切换到当前文件所在的目录
},
方法1:
当保存launch.json这个文件的修改时,左边一栏变成如下的样子,多了一个调试的选项键,这个debug键的右边选择的是“Python: Current File”:
切回helloworld.py,设置断点:
方法2:
在launch.json这个文件里添加如下的语句:
{
"name": "Python: Remote Attach",
"type": "python",
"request": "attach",
"port": 5678, //这个端口随便设置
"host": your_ip, //这是远程服务器的ip
// "pathMappings": [
// {
// "localRoot": "${workspaceFolder}",
// "remoteRoot": "."
// }
// ]
}
debug键的右边选择的是“Python: Remote Attach”:
之后在服务器上安装ptvsd库:
pip install ptvsd
然后在待执行文件(本文使用的示例是helloworld.py)的最顶上加入如下代码:
import ptvsd
ptvsd.enable_attach(address = ('0.0.0.0', 5678))
ptvsd.wait_for_attach()
然后在服务器终端执行python helloworld.py
,再回到windows上点击debug键,同样会得到如下图所示的断点调试界面:
这两种方法,我更倾向于第二种,因为以我个人体验来说,它的运行会更加流畅一点。
OK,到这里我们就成功设置了VS Code进行Python的远程调试,接下来我们就可以愉快地写代码和debug了。
本文参考以下博客,并融入了自己的思考:
https://zhuanlan.zhihu.com/p/93239107
https://blog.csdn.net/Hreticent/article/details/82968466
https://www.oschina.net/question/3637446_2282455
https://zhuanlan.zhihu.com/p/43656542