测试环境:ubuntu 20.04
一、ssh服务
SSH(Secure Shell Protocol,安全的壳程序协议,基于tcp协议默认使用22端口),它可以通过数据包加密技术将待传输的数据包加密后再传输到网络上。通过ssh协议/服务,我们可以访问登录到远程服务器。
1、安装
ubuntu环境下,默认已安装ssh server,可以使用"ssh"命令查看。
developer@ubuntu:~$ ssh
usage: ssh [-46AaCfGgKkMNnqsTtVvXxYy] [-B bind_interface]
[-b bind_address] [-c cipher_spec] [-D [bind_address:]port]
[-E log_file] [-e escape_char] [-F configfile] [-I pkcs11]
[-i identity_file] [-J [user@]host[:port]] [-L address]
[-l login_name] [-m mac_spec] [-O ctl_cmd] [-o option] [-p port]
[-Q query_option] [-R address] [-S ctl_path] [-W host:port]
[-w local_tun[:remote_tun]] destination [command]
如果未安装可以使用apt源进行安装。
sudo apt install openssh-server
ssh server的状态可以使用service命令进行管理。
sudo service ssh start
sudo service ssh stop
sudo service ssh restart
# ...
2、ssh登录
示例:
# 登录到远程主机
ssh <user_name>@<host_name/ip>
# 在远程主机执行特定命令
ssh <user_name>@<host_name/ip> "<remote_shell_cmd>"
常用参数:
- -p: 指定端口,默认为22端口
- -o StrictHostKeyChecking=no: 连接远程主机时,忽略公钥检查(yes/no确认,自动化脚本使用ssh时通常增加该选项)。
3、scp文件传输
示例:
# 将本地文件cp到远程设备
scp <local_file> <user_name>@<host_name/ip>:<remote_path>
# 将远端文件cp到本地
scp <user_name>@<host_name/ip>:<remote_file> <local_path>
常用参数:
- -P: 指定端口,默认为22端口(注意大小写:ssh为小写,scp为大写)
二、xrdp服务
基于ssh,我们可以借助各类终端软件对远程主机进行访问,但当涉及到使用UI界面的工具/软件时需要使用远程桌面进行访问。
xrdp 是一个微软远程桌面协议(RDP)的开源实现,通过xrdp可以登录远程机器,并且创建一个真实的桌面会话,通过客户端软件设置可以像使用本地机器一样的访问远程主机。
借助ubuntu xrdp服务和windows 远程桌面连接客户端,就可以实现在windows环境下访问远程ubuntu桌面。
1、安装
ubuntu环境下,默认未安装xrdp工具,我们可以使用apt源进行安装。
sudo apt install xrdp
在ubuntu环境下,使用systemd管理xrdp服务,安装完成后我们可以使用systemd查看或管理xrdp服务状态。
developer@ubuntu:~$ sudo systemctl status xrdp
● xrdp.service - xrdp daemon
Loaded: loaded (/lib/systemd/system/xrdp.service; enabled; vendor preset: enabled)
Active: active (running) since Thu 2023-10-12 10:00:07 CST; 3min 35s ago
Docs: man:xrdp(8)
man:xrdp.ini(5)
Main PID: 4604 (xrdp)
Tasks: 1 (limit: 9387)
Memory: 756.0K
CGroup: /system.slice/xrdp.service
└─4604 /usr/sbin/xrdp
Oct 12 10:00:06 ubuntu xrdp[4603]: (4603)(139830378088256)[INFO ] address [0.0.0.0] port [3389] mode 1
Oct 12 10:00:06 ubuntu xrdp[4603]: (4603)(139830378088256)[INFO ] listening to port 3389 on 0.0.0.0
Oct 12 10:00:06 ubuntu xrdp[4603]: (4603)(139830378088256)[INFO ] xrdp_listen_pp done
Oct 12 10:00:06 ubuntu xrdp[4603]: (4603)(139830378088256)[DEBUG] Closed socket 7 (AF_INET6 :: port 3389)
Oct 12 10:00:06 ubuntu systemd[1]: xrdp.service: Can't open PID file /run/xrdp/xrdp.pid (yet?) after start: Operation not permitted
Oct 12 10:00:07 ubuntu systemd[1]: Started xrdp daemon.
Oct 12 10:00:08 ubuntu xrdp[4604]: (4604)(139830378088256)[INFO ] starting xrdp with pid 4604
Oct 12 10:00:08 ubuntu xrdp[4604]: (4604)(139830378088256)[INFO ] address [0.0.0.0] port [3389] mode 1
Oct 12 10:00:08 ubuntu xrdp[4604]: (4604)(139830378088256)[INFO ] listening to port 3389 on 0.0.0.0
Oct 12 10:00:08 ubuntu xrdp[4604]: (4604)(139830378088256)[INFO ] xrdp_listen_pp done
# 管理状态
sudo systemctl start xrdp
sudo systemctl stop xrdp
sudo systemctl restart xrdp
# 使能自启动
sudo systemctl enable xrdp
注:xrdp服务默认使用系统的3389端口。
2、连接
这里我们使用windows自动的“远程桌面连接”访问xrdp服务。
- 输入主机名/ip(端口非3389时需加端口号),点击连接
- 输入远程主机的用户名和密码,点击OK
- 连接成功后可以看到ubuntu桌面
注1:当用户在远程主机使用桌面登录,可以连接但会始终黑屏,需要将远程主机的桌面登录用户登出(Logout)或者重启远程主机后重新连接。
注2:现在看到的远程桌面(Xorg)和使用本地登录使用的桌面(GNOME)存在些差异,可以修改配置进行调整。
3、优化
a. 移除/隐藏"~/thinclient_drives"文件夹
- 打开sesman.ini配置文件:
sudo vim /etc/xrdp/sesman.ini
- 修改FuseMountName配置项
将
FuseMountName=thinclient_drives
修改为:
FuseMountName=.xrdp/thinclient_drives
并创建~/.xrdp目录(可选,没有该目录不会创建thinclient_drives文件夹)
mkdir
- 移除现有"thinclient_drives"目录
sudo umount thinclient_drives
sudo rm -rf thinclient_drives
- 重启xrdp服务(或直接重启远程主机)
sudo systemctl restart xrdp
b. 修改桌面环境
- 打开~/.xsessionrc文件
vim ~/.xsessionrc
- 增加以下环境变量声明:
export GNOME_SHELL_SESSION_MODE=ubuntu
export XDG_CURRENT_DESKTOP=ubuntu:GNOME
export XDG_CONFIG_DIRS=/etc/xdg/xdg-ubuntu:/etc/xdg
- 重启xrdp服务(或直接重启远程主机)
sudo systemctl restart xrdp
- 配置生效后远程连接后的桌面如下:
三、vscode开发环境
基于ssh服务,我们可以访问登录到远程主机,但当涉及到大量文件修改、编码实现时还是有很多不方便的;xrdp可以直接访问桌面,但受限于网络速度通常存在桌面UI刷新卡顿的情况。
vscode提供了远程开发的功能,对不涉及UI界面的编程开发,我们可以借助于vsode将性能更强大的远程主机作为日常的开发环境。
1、安装ssh插件
在vscode的扩展中查找ssh插件,并安装
安装完成后会增加远程连接的侧边栏:
2、添加远程主机
点击”+“(New Remote) 添加新的远程连接:
输入用户名、主机名/IP、端口(可选)进行连接:
注:vscode的远程连接基于ssh服务,建立”New Remote“时使用的就是ssh访问命令。
刷新后在ssh下面可以对应的主机名/IP:
3、连接远程主机
使用图标或右键,选择“Connect in Current Window…”或“Connect in New Window…”连接远程主机,根据弹窗选择远程主机系统、用户密码:
连接成功后左下角可以看到主机名/IP:
连接成功后,再选择“Open File”或“Open Folder”,我们可以看到访问到的就是远程主机上的文件目录:
后续就可以像在本地使用vscode一样的操作,存在的差异就是此时创建、编译的文件均存储在远程主机上面,使用终端时打开的也是远程主机的shell终端。