简介
在 VSCode 有了 Remote SSH 之前,大多数 Linux 服务器开发者通常用 VS 远程,或者用 XShell 配合 Vim,或者在本地开发编辑好代码 XFtp 上传,或者用 Samba 等文件共享进行远程开发。虽然 VS 很强大,可是实际使用的时候,打开 VS 的时间和启动调试的时间一直是开发者埋怨的地方。
零、环境需求
- x86_64 Debian 8+, Ubuntu 16.04+, CenOS / REL 7+
- ARMv7l (AArch32) Raspbian Stretch/9+ (32-bit)
- ARMv8l (AArch64) Ubuntu 18.04+ (64-bit)
- Window 10 / Server 2016/2019 (1803+) using the official OpenSSH Server
- macOS 10.14+ (Mojave) SSH host with Remote Login enabled
说白了就是让远程端支持 SSH Server,没有的话用以下指令安装:
1 2 3 4 5 6 7 8 9 10 |
# Debian 8+ / Ubuntu 16.04+ sudo apt-get install openssh-server # RHEL / CentOS 7+ sudo yum install openssh-server sudo systemctl start sshd.service sudo systemctl enable sshd.service # Windows 10 1803+ / Server 2016/2019 1803+ Install the Windows OpenSSH Server |
一、前期准备
其实 Remote Development 开发插件里头就包含了 Remote-WSL、Remote-Containers、Remote-SSH 三种远程开发功能。
- 安装、打开 VSCode 编辑器,左边竖列的扩展(expand),或者用 Ctrl + Shift + x,搜索 “Remote Development” 和 “Remote SSH” 插件并安装
- 然后重新启动 VSCode,因为用了中文语言包的话,安装后是不会显示的,需要重启才能生效
二、配置 SSH 用户以及 IP(Windows to Linux 为例)
安装完后,左侧那个竖列工具栏会出现 Remote SSH 的图标(一个显示器什么的),在 左侧弹出栏 里是空白的(没有 CONNECTIONS)的字眼,在配置完毕之后才会有这样的字眼。
1 2 3 4 5 |
这里设定一个服务器的信息 IP:172.31.70.80 Account:futuremedia Passwd:就不写了 WorkSpace Path:/home/futuremedia/PythonSpace |
Remote-SSH 配置步骤:
- 现在在左侧栏里的 SSH TARGETS 是没有东西的,首先使用快捷键 Ctrl + Shift + P 或 F1 打开活动栏(有东西说明有 config,跳到步骤 3 )。
- 输入 Remote-SSH: Open Configuration File,选择 C:\Users\Administrator\.ssh\config,这时候会进入编辑文件界面,写好信息重新载入即可。
12345678910111213141516171819这时候,如果出现错误,弹出:Unable to open '.ssh':File is a directoryCommand 'Remote-SSH:Connect to Host...' resulted in an error(EISDIR: illegal operation on a directory, read)这是因为在这个文件夹里没有相关的文件,如 config注意:如果没有设置 SSH Host,即在默认的文件夹 <strong>C:\Users\Administrator\.ssh\config </strong>中没有 <strong>config</strong> 这个文件和其他相关的文件,就需要创建一个这种情况,找到、打开这个文件夹,在文件夹下新建一个 <strong>config</strong> 文件,并编辑如下:Host futuremedia-Precision-3630-TowerHostName 172.31.70.80User futuremedia每一个连接最少包括有★的三行:★Host★HostNameport★UserIdentityFile D:\Path\conf\ssh\id_rsa-remote-ssh - 顺利的话,在左侧栏 SSH TARGETS 就会出现图标了,这时候的小显示器是没有绿勾勾的,这时候右键需要连接的 Host,选择 Connect to Host to Current Window:当前窗口连接 Host,然后敲入远程端用户的访问密码即可,成功连接后可以在左下角看到 SSH: futuremedia-Precision-3630-Tower 的字样。
- 成功连接后,这时候在资源管理器(Ctrl + Shift + E)中也是空的,因为你仅仅是连接上了,默认访问的当前路径为 /home/futuremedia/,就和普通 SSH 使用一样。这时候需要点击打开文件夹添加工作空间。点击后会自动弹出 Linux 远程端当前地址的目录列表,选择需要访问的空间(这里选择了/home/futuremedia/PythonSpace/ 为工作空间,下面会用到),之后就可以访问该目录进行远程开发了。
PS 1. 如果需要同时管理多个 Host,可以在 C:\Users\Administrator\.ssh\config 中 每间隔一个回车 继续添加三元素(Host HostName User)即可,如:
1 2 3 4 5 6 7 8 9 10 11 |
Host futuremedia-Precision-3630-Tower HostName 172.31.70.80 User futuremedia Host my12 HostName 172.31.70.90 port 22 User Admin IdentityFile E:\RSA\conf\ssh\id_rsa ... |
PS 2. 如果想要关闭远程开发连接,点击左下角的 “><” ,然后点击关闭远程连接即可,同样的,点击在这里也可以弹出 Host 列表快速连接
PS 3. 在各种选择加载远程信息时,会要求多次的密码验证操作,这时候建议使用 ssh-keygen,在 C:\Users\Administrator\.ssh\config 中的如果有 id_rsa、 id_rsa.pub 这些文件就是因为设置了 keygen。如何生成密钥文件?
- 在 Windows 系统(客户端)中使用 PowerShell 进入 C:\Users\Administrator\.ssh\ 这个文件夹,运行 ssh-keygen 命令生成密钥文件(ssh-keygen 是基于 OpenSSH Client 的,windows 10 系统是自带)
1234567891011121314151617# 提示进入SSH私钥生成Generating public/private rsa key pair.# 提示私钥文件存储的本机位置,括号中为默认地址Enter file in which to save the key (C:\Users\Administrator/.ssh/id_rsa):# 输入私钥口令,直接回车则设置为没有口令Enter passphrase (empty for no passphrase):# 再输入一遍,确认口令Enter same passphrase again:# 生成成功,并显示生成的私钥文件存储位置Your identification has been saved in C:\Users\Administrator/.ssh/id_rsa.# 显示生成的远程端的私钥配置文件Your public key has been saved in C:\Users\Administrator/.ssh/id_rsa.pub.# 其他输出The key fingerprint is:.....The key's randomart image is:...... - 这时候这个文件夹里,会生成了两个文件:id_rsa 和 id_rsa.pub(文件名称不定,可以自行命名,这里是默认),将生成的 id_rsa.pub 里的内容复制到远程端主机的 ~/.ssh/authorized_keys 文件中,远程端目标目录 ~/.ssh/ 里没有这个文件就创建一个
- 这时候再进行远程连接就会提示 ‘Enter passphrase for key ‘C:\Users\Administrator/.ssh/id_rsa’: 输入在创建的时候设置的私钥口
123456从这里可以看到一个好处:使用了私钥,利用ssh-keygen生成的RSA账号,在远程端已有用户futuremedia中放入了对应私有账号的.pub内容信息,给与代理权限,即:客户端(windows)用 RSA 账号访问,使用 远程端(linux)futuremedia 账户的授权和其权限,去访问远程端的文件。无需给与 futuremedia 用户的密码即可访问了!!★扩展想法:应该所有用了Openssh Server和Openssh Client远程访问机制的应该都有这样一种不用用户密码而拥有用户权限的访问方法。 - 如果在第二步生产私钥的时候,没有设置 passphrase 就可以直接访问,这样就可以 配置无密码的远程访问,这也可以结合 git 来使用,如
三、运行与调试
<步骤一:终端进行运行>
其实,这时候也有一种方式进行运行,就如平时使用 XShell 那样,用 Terminal 用命令行运行文件。在登录的时候,下方显示栏 终端 会打印登录信息(输入 passphase 的地方),右侧有个下选栏是使用 Channel 2: install,这时候我们选择为 Channel 1: bash 就会显示为我们熟悉的 Bash 界面,这里能像 Xshell 那样使用命令行运行程序。
但我们还不能一键 F5 进行直接运行。按 F5 会弹出选择调试环境,没有在服务端安装插件是没有对应的选项的,但我们可以选择 Edge: Launch 去生成运行环境配置。它会在当前的工作空间(这里是在远程端的 /home/futuremedia/PythonSpace/)里,创建 .vscode 目录,并新建 launch.json 远程调试配置文件,默认内容如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
{ // 使用 IntelliSense 了解相关属性。 // 悬停以查看现有属性的描述。 // 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387 "version": "0.2.0", "configurations": [ { "type": "pwa-msedge", "request": "launch", "name": "Launch Chrome against localhost", "url": "http://localhost:8080", "webRoot": "${workspaceFolder}" } ] } |
如果有安装了 Python 调试插件,在这里就可以选择服务端有的环境了。因为还没有安装,所以不能用 F5 实现一键运行。
<步骤二:安装 Python 环境,自动生成环境配置文件 settings.json>
注意:
1、这时候左下角只有 “>< SSH:…” 的字样,没有环境。如果载入了环境,该字样后面会跟着一个环境的信息①
2、/home/futuremedia/.vscode-server/extensions/ 是使用 VSCode 登录时生成的,但里面没有 Python 扩展插件。如果安装了,就会有按钮可以选择
3、如果没有执行上面的<方法一…>,这里还是没有 .vscode 文件夹
首先配置好调试的所有插件,每种语言不一样。以 Python 为例子,在登录好远程端的状态下,Ctrl + Shift + X 查找 Python,这时候和在本机正常用 VSCode 的安装按钮不一样, 变成了 在 SSH: futurmedia-Precision-3630-Tower 中安装,选择,安装好后,这时候远程端会:
- 在远程端 /home/futuremedia/.vscode-server/extensions/ 添加 Python 的远程调试扩展:ms-python.python-2020.7.96456(一个扩展,我觉得本质是 Interface)
- 另外安装 C/C++ 扩展插件,会在上述的地址安装了 C/C++ 远程调试扩展:ms-vscode.cpptools-0.29.0
(如果有显示 需要重新载入 ,则进行点击它,安装->加载,这样这个插件才能生效)
如果服务端有 Python 的环境,可能会自动载入,在 ① 会显示,这里自动载入了 ~/anaconda3/bin/python 了(Python 3.7.4 64-bit (‘base’:conda) 字样)。点击 F5 调试,在 Select a debug configuration 中选择 Python File,就会自动在控制台终端处创建一个会话并自动载入 anaconda 的环境(就是自动连接并执行 conda activate base 之类的命令)。
问题:这时候的环境会默认导入 futuremedia 这个用户的环境下的 Anaconda,如果我想使用或者每次连接的时候自动导入 系统自带的 Python 环境怎么办?
答:使用 settings.json 环境配置文件。
在 /home/futuremedia/PythonSpace/ 自动生成 .vscode/settings.json 文件(或者自己手动编辑),内容如下:
1 2 3 |
{ "python.pythonPath": "home/futuremedia/anaconda3/bin/python" } |
说明:这表示我这里配置的运行环境是在远程端自己配置的 Anaconda 虚拟环境下的 Python。
将之改变为系统的 Python 路径:
1 2 3 |
{ "python.pythonPath": "/usr/bin/python3" } |
这样 VSCode 进行连接的时候就会载入这个文件里的路径了。
PS 1. 同样 C/C++ 的环境设置也是在一个文件里完成。
PS 2. 注意权限
到这里为止,可以算能用 F5 运行和调试了,但是还是不够,还不是一键!因为每次执行 F5,都需要进行各种选择。到这里还是和方法一差不多,多了个自动识别服务端环境并帮你载入的功能。
<步骤三:文件运行配置文件 launch.json>
点击下方的 调试按钮 并选择添加配置,在弹出的选择栏中选择 Debug Python,将会自动生成 .vscode/launch.json 文件,内容如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
{ // 使用 IntelliSense 了解相关属性。 // 悬停以查看现有属性的描述。 // 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387 "version": "0.2.0", "configurations": [ { "name": "Python: 当前文件", "type": "python", "request": "launch", "program": "${file}", "console": "integratedTerminal" } ] } |
这时候在编辑各种文件的运行方式,这里设置的是:python 文件的时候直接按 F5 就可以一键运行和调试了。
<总结>
这里只要注意好几个关键的地方:
- 区分 用户根路径 /home/futuremedia/ 和 工作区路径 /home/futurmedia/PythonSpace/
- 插件相关文件在 用户根路径下:~/.vscode-server/
- 运行环境配置文件 settings.json 和 文件运行文件 launch.json 都放在 工作区路径 下的 .vscode 目录 下,并在该工作区生效