公司使用服务器,初次接触Linux的远程连接操作,记录使用Vscode作为开发工具的操作实践与疑惑。
文章目录
1 VsCode工具
1.1 vscode远程Remote-ssh操作实践与疑惑
1.1.1 vscode配置Remote-ssh
1.安装vscode,插件中安装Remote-ssh;
2.通过Remote-ssh设置按钮,打开C:\Users\XXX.ssh\config文件;
3.修改config文件:
# Read more about SSH config files: https://linux.die.net/man/5/ssh_config
Host MyIDC
HostName 10.4.202.13
Port 18923
User root
IdentityFile "C:\Users\XXX\.ssh\id_rsa" #设置私钥路径
💭发现若私钥路径设置在其他位置,则识别不到,让输入密码,难道私钥路径要和.ssh\config文件路径一致?
4.连接,选择操作系统Linux即可。
1.1.2 遇到的问题
1.1.2.1 Setting up SSH Host “MyIDC” Downloading VS Code Server 卡住等待
使用VSCode Remote-SSH插件,想连接远程服务器,卡在Setting up SSH Host “MyIDC” Downloading VS Code Server。
✐原因是在远程的服务器下home目录/.vscode-server/bin/f80445acd5a3da24aa209168452a3d97cc32(一串很的东西,这里叫做commit_id吧)/vscode-servlet.tar.gz 没有下载下来。
这里可以使用ls - la来进行查看这个文件的大小,大小是0,看一下是不是没有下载成功。(一般情况都是这个原因,没有下载成功)
✎解决方法:手动下载,不让服务器下载。
1.手动下载vscode-servlet.tar.gz:
https://update.code.visualstudio.com/commit:${commit_id}/server-linux-x64/stable(注意把:commit_id替换成对应的Commit ID,dollar符也要替换掉)
2.记录commit_id。家目录/.vscode-server/bin/f80445acd5a3da24aa209168452a3d97cc32(一串很的东西,这里叫做commit_id吧)。
3.依次运行下面命令,进行拷贝解压等操作:
rm ~/.vscode-server/bin/* -rf 把bin目录下的东西删除干净
mkdir -p ~/.vscode-server/bin 创建目录
cd ~/.vscode-server/bin
tar -zxf vscode-server-linux-x64.tar.gz 解压
mv vscode-server-linux-x64 commit_id 移动重命名
4.重新启动vscode即可。
1.1.2.2 VsCode更新后RemoteSSH连接卡在Setting up SSH Host XX:Copying VS Code Server to host with scp
解决方法同1.2.1,手动下载//.vscode-server/bin/的vscode-server-linux-x64.tar.gz文件,解压重命名为id号
1.1.3 vscode Remote-ssh其他操作技巧
- Ctrl+J打开远程终端
- 关闭ssh连接:点击左下角连接,在弹出的选项列表框点最下面一个Close Remote Connection
- 编辑界面自动换行:菜单栏View–>Toggle Word Wrap选项或快捷键alt + Z
1.2 Vscode开发Python程序操作实践与疑惑
1.2.0 debug配置文件
vscode依靠.vscode目录下的launch.json来管理你的debugger程序,下面是一个该文件的实例:
其中"configurations"中的一个实例则为一个debugger程序配置,当想增加多个debugger程序时(如你可能需要两组不同的参数分别来debug,而不想每次都修改),则可以在"configurations"新加一个配置文件,如下所示:
{
"version": "0.2.0",
"configurations": [
{
"name": "Python: Current File",
"type": "python",
"request": "launch",
"program": "${file}",
"console": "integratedTerminal",
"justMyCode": true
},
{
"name": "the second debugger",
"type": "python",
"request": "launch",
"program": "${file}",
"console": "integratedTerminal",
"justMyCode": true
}
]
}
- name是该debugger的名字,会显示在运行和调试侧边栏中的下拉框中,选择对应的debugger,并点击绿色三角则可以启动对应的debugger。
- type设置使用什么的debugger,设为python,无需修改。
- request是调试模式,它能选择两种类型,一个是launch模式,一个是attach模式:
launch模式:在program指定的文件上启动debugger,由VSCode来启动一个独立的具有debug功能的程序。
attach模式:监听一个已启动的程序(其必须已经开启debug模式)。将debugger附到(注入到)一个正在运行的python进程上。用以远程debug,也可以用来解决多参数问题,具体请参考后面的部分。 - program文件的绝对路径,提供具体想要debugger去运行的python脚本文件,可以是相对路径也可以是绝对路径,比如上面配置文件中的${file}代表当前vscode激活的文件(即当前打开的,而且输入光标所在的文件),也可以指定某特定文件,如设置"program": “${workspaceFolder}/main.py”
则代表在工作目录下的main.py上启动debugger。 - console: 终端的类型, integratedTerminal 指使用vscode终端。
当然,我们还可以设置其他参数,比如 stopOnEntry: true , 可以在进入程序的时候就暂停执行。
其他参数参考:
1.如何在vscode中debug python代码,包括如何优雅地传入多个参数
1.2.1 在vscode中debug python代码
debug两种方式:
- 基本debugging(basic debugging):可以解决大部分情况
- 命令行debugging(command line debugging): 用于需要传参数繁多或者远程调试的程序
要求在vscode先安装Python扩展(extension),Python扩展提供了python的语法,运行,环境选择等支持,是vscode写python代码的一个好助手。
安装完Python扩展后,打开python脚本文件则会在右下角(低版本可能在左下角)出现环境设置以选择你想用的python解释器,而右上角则会出现运行和debug的选项。
如果你只是想简单地debug程序,没有其他需求,可以直接打断点,然后右上角点击debug,程序会自动地debug当前打开的python文件。
如果你想定制化一些debug选项,则:
打开VS Code的DEBUG设置,先点侧边栏的虫子(运行和调试),点击Run and Debug,点击后提示选择一种语言,选择Python。然后要指定相应的文件类型,可以看到,它支持许多种Python的调试方法,有Django, Flask, 甚至是 Pyramid. 由于下面我们要讲的只是单文件的代码调试,因此选择Python File.
然后会自动在当前文件夹的根目录/.vscode中生成一个launch.json的配置文件,该文件则配置了你的debug配置。
1.3 Vscode开发C++程序操作实践与疑惑
2 图形化界面转发 (目前未成功,待后续再研究)
我们能看到的图形界面(GUI)都依赖于显示服务器(Display Server)。显示服务器(Display Server)是任何图形用户界面(尤其是窗口系统)中的关键组件。它是图形用户界面(GUI)的基本组件,位于图形界面和内核之间。借助显示服务器(Display Server),我们才可以将计算机与GUI一起使用。没有它,我们将只能使用命令行界面(TTY)。
桌面环境(Gnome、KDE、Xfce、MATE等)使用了底层的显示服务器
因为X系列协议(X11表示X协议11代版本)已经存在很久了,有一些历史设计包袱。所以Linux为了更安全合理。Ubuntu 21.04之后,现在默认启用Wayland协议了。但是也正因为X11协议已经在市场上存续了很多年,所以很多软件还是基于X11实现的,这就导致了一些不兼容的问题。在未来或许还是Wayland协议的天下。
客户端应用需要移植到 Wayland 协议,或使用具有 Wayland 后端(如 GTK)的图形工具包,以便能够与基于 Wayland 的合成器和显示服务器原生工作。
无法移植到 Wayland 的传统 X11 应用程序将自动使用 Xwayland 作为 X11 传统客户端和 Wayland 合成器之间的代理。XWayland 同时作为 X11 服务器和 Wayland 客户端。Xwayland 的角色是将 X11 协议转换为 Wayland 协议或相反,从而使旧的X11应用程序可以与基于 Wayland 的显示服务器一起工作。
在 GNOME Shell on Wayland 上,Xwayland 在启动时自动启动,这样可确保大多数 X11 传统应用程序在使用 GNOME Shell on Wayland 时能按预期工作。但是,X11 和 Wayland 协议不同,因此某些依赖于 X11 特定功能的客户端在 Xwayland 下的行为可能有所不同。对于这些特定的客户端,您可以切换到 X.Org 显示服务器。
2.1 X11图形化转发简述
SSH的X11转发原理–来自ssh的manpage:
如果 ForwardX11 变量设为 “yes” (或参见后面对 -X 和 -x 选项的描述), 并且用户正在使用 X11 (设置了 DISPLAY 环境变量), 和 X11 显示器的连接将自动以这种形式转发到远端: 任何用 shell 或命令启动的 X11 程序将穿过加密的通道, 从本地机器连接真正的 X 服务器. 用户不应该手动设置 DISPLAY. 可以在命令行上, 也可以在配置文件中设置 X11 连接的转发.
ssh 设置的 DISPLAY 值将指向服务器, 但是显示器号大于零. 这很自然, 因为 ssh 在服务器上创建了一个 “proxy” X 服务器,把连接通过加密通道转发出去.
从原理来讲,对于用户login来说,本地主机是客户端(SSH Client),远程主机是服务端(SSH Server);对于X11程序来说,本地主机是服务端(X Server),远程主机是客户端(X Client)。
从实际使用体验来说,是用户在本地主机通过 SSH Client 登录到启用了 X11 转发功能的远程主机的 SSH Server 上执行 GUI 图形界面程序,此时本地主机的显示器(X Server DISPLAY)上会呈现远程主机的GUI程序的图形界面。
X Window System(常被简称为X11或X),是一套基于X display protocol的windowing system,X GUI环境的功能包括窗口的绘制、移动,以及与鼠标、键盘等输入设备的交互。
X采用C/S模型(这是关键):一个X server 和多个应用程序(client)通信。server接收client的请求绘制窗口,并将来自鼠标、键盘等设备的输入传递给client。
因此 X server和client可以位于同一计算机上,例如在Linux主机上使用KDE等桌面环境就是这种模式。X server也可以通过同构网络、异构网络或Internet与client通信。
X server与client之间的通信是不加密的,这个问题可以通过SSH解决。SSH是Secure Shell的简称,SSH可以看作是通信被加密压缩版的telnet。
需要用到SSH的forwarding功能,当X server与client所在计算机都支持SSH协议时,X server与client之间不安全的TCP/IP连接可以转送到(forwarding)二者之间建立的SSH连接上。
了解原理后,我们就可以在本地自建X服务,然后服务器作为X client,把绘图的请求发给本地的X server。 这样就实现了本地显示图像的目的。
X server是X Window System (简称X11或者X)系统中的显示服务器(display server),用于监听X client发送来的图形界面显示请求,并且将图形界面绘制并显示在屏幕(screen)上。
- X client:X客户端。通常是各类GUI应用,如Firefox浏览器、xterm、xclock等等
- screen:逻辑概念上的屏幕。可以是一台物理显示器、多台物理显示器或者是VNC虚拟显示器
- X client与X server的通信方式有三种:TCP,unix socket和通过内存通信。后两种方式仅限于X client与X server都位于同一机器的情况,通信效率更高。
- DISPLAY变量用于控制“在哪里绘制和显示图形界面”。
DISPLAY变量值的格式:
(1)X client与X server都位于同一机器,通过unix socket或内存通信
:<机器运行的第几号X server>.<该X server管理的第几号screen>
如:0.0,:0.1,:1.0
(2)X client与X server位于不同机器,通过TCP协议通信
<机器的IP或主机名>:<该机器运行的第几号X server>.<该X server管理的第几号screen>如192.168.1.2:0.0,127.0.0.1:1.0,localhost:10.0
注意:
- :0.0,127.0.0.1:0.0和localhost:0.0效果上都是在同一机器绘图,但是:0.0走的是unix socket或内存通信,后两者则是TCP协议通信。
- localhost是一个特殊的主机名,特指机器自身。在IPV4语境下,localhost主机名经过查表后会被翻译为IP地址127.0.0.1。因此,127.0.0.1:0.0和localhost:0.0表意相同。
例:在树莓派的Linux系统里运行火狐浏览器,然后把浏览器的图形界面展现在笔记本电脑上。
设备说明:
<1>笔记本电脑,IP为192.168.31.200,仅有一块显示屏,笔记本电脑的系统里运行着一个0号X server。该X server管理着一个0号screen。0号screen的内容会展现在笔记本的显示屏中。
<2>还有一块树莓派Linux开发板。树莓派和笔记本电脑处于同一局域网,并且树莓派没有连接显示屏。
操作说明:
<1>在笔记本电脑上,通过SSH登录树莓派系统的Shell,然后运行如下命令:
export DISPLAY=192.168.31.200:0.0 # 给变量DISPLAY赋值192.168.31.200:0.0并将其设置为当前Shell的环境变量
firefox # 在Shell中运行”火狐浏览器“
- 前提条件:我的笔记本电脑上运行着0号X server,它会监听本机所有IP(包括127.0.0.1,192.168.31.200等)上来自6000 + 该服务器运行的第几号X server(即6000)TCP端口的绘图请求
- 火狐浏览器此刻的身份是X client。X client为了找到自己应该“在哪里绘制和显示图形界面”,首先会获取当前Shell中DISPLAY变量的值192.168.31.200:0.0。
- X client解析完DISPLAY的值后,会把GUI绘图请求通过TCP协议发送至192.168.31.200机器的6000 + 0(即6000)端口,请求“将绘制结果显示在该X server管理的第0号screen上”。
- 在192.168.31.200机器上,负责监听6000端口的0号X server收到请求。X server解析绘图指令,并在指定的0号screen中绘图。
2.2 X11 Forwarding
本地机器的Shell
配置本地机器的DISPLAY环境变量
export DISPLAY=127.0.0.1:0.0
开启X11 Forwarding功能的SSH连接
ssh -X 远程机器用户名@远程机器IP地址
登录远程机器的Shell后
Shell的DISPLAY环境变量会被SSH server自动设置为localhost:10.0
在远程机器的Shell中运行一个GUI程序:
- 远程机器的X client解析Shell环境变量DISPLAY的值localhost:10.0,通过TCP协议向远程机器自身的第10号X server发送绘图请求。
- 远程机器上的SSH server会充当第10号X server,接收这个请求。
- SSH server把请求通过加密隧道传输给本地机器的SSH client。
- 本地机器的SSH client接受到绘图请求后,会充当X client,解析本地Shell环境变量DISPLAY的值127.0.0.1:0.0,然后向对应的X server发送绘图请求。
- 本地机器的第0号X server接收到绘图请求,在指定的0号screen中绘图。
- 图形界面出现在本地机器的0号screen对应的显示器中。
X11 相关的现代技术
Xpra
https://github.com/Xpra-org/xpra
X2Go
https://wiki.x2go.org/doku.php
2.3 操作方法
2.3.1 远程服务器设置
- 配置sshd:设置允许X11转发,启用X11 Forwarding
sudo vim /etc/ssh/sshd_config
X11Forwarding yes #允许X11转发
X11UseLocalhost no #禁止将X11转发请求绑定到本地回环地址上
AddressFamily inet #(可选)强制使用IPv4通道。
X11DisplayOffset 10 #可选
2.重启sshd服务:systemctl restart sshd / sudo systemctl restart sshd.service
3.安装实验用GUI程序,采用 xclock,一个简单的时钟。
CentOS系统,执行:sudo yum install xclock
2.3.2 本地操作系统设置
1.Linux类操作系统
(1) 安装依赖:
xauth用于授权,fonts用于字体显示。
Arch系统,执行:
sudo pacman -S xorg-xauth xorg-fonts-*
其他发行版软件包名称可能是 xorg-x11-xauth 和 xorg-x11-fonts-。
安装 X11 转发相关软件
yum install xorg-x11-xauth xorg-x11-fonts- xorg-x11-font-utils xorg-x11-fonts-Type1 xclock
(2)修改客户端的ssh设置:sudo vim /etc/ssh/ssh_config
添加以下三行:
ForwardAgent yes
ForwardX11 yes
ForwardX11Trusted yes
(3)重启客户端的ssh服务:sudo systemctl restart ssh.service
(4)添加-X参数连接服务器:
xhost + //允许服务器的的x11界面连接过来
ssh -X song@10.199.160.252 #-X参数表示转发X11数据, 把用户名称tsfh 以及服务器S的ip地址替换为你自己的
2.Windows操作系统
Windows下X11 Server一般的方案使用的比较多的有三类:
Xmanager、MobaXterm
Cygwin以及其衍生软件(例如babun)这些庞大的软件包
使用putty + Xming
2.3.2 实验与验证:
本地Linux操作系统(X Server)通过ssh连接远程Linux操作系统(X Client),注意选项 -X
ssh -X 172.18.253.19 xclock
此时会直接在本地的X Server DISPLAY上(也就是本地的显示器上)打开xclock的GUI图形界面。
当然也可以ssh -X 172.18.253.19登录后执行xclock命令,同样的效果。