测试环境:ubuntu 20.04
SSH(Secure Shell Protocol,安全的壳程序协议,基于tcp协议默认使用22端口),它可以通过数据包加密技术将待传输的数据包加密后再传输到网络上。通过ssh协议/服务,我们可以访问登录到远程服务器。
ubuntu环境下,默认已安装ssh工具,可以使用"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]
如果未安装ssh服务可以使用apt源进行安装。
sudo apt install openssh-server
ssh server的状态可以使用service命令进行管理。
sudo service ssh start
sudo service ssh stop
sudo service ssh restart
# ...
示例:
# 登录到远程主机
ssh <user_name>@<host_name/ip>
# 在远程主机执行特定命令
ssh <user_name>@<host_name/ip> ""
常用参数:
示例:
# 将本地文件cp到远程设备
scp <local_file> <user_name>@<host_name/ip>:<remote_path>
# 将远端文件cp到本地
scp <user_name>@<host_name/ip>:<remote_file> <local_path>
常用参数:
相对于密码登录,密钥登录使用非对称加密算法保证了系统的安全性。
使用密钥登录的首先需要在主机创建密钥对(已有密钥对可以忽略该步骤)。
ssh-keygen
创建完成后会获取一个私钥和对应的公钥,一般位于家目录.ssh目录下。
root@dev:~$ ls ~/.ssh
id_rsa id_rsa.pub
私钥一定要妥善保管,公钥需要传输到服务器用于免密登录。
# 传输公钥到服务器(在主机操作)
scp id_rsa.pub <user>@<hostname>:~
# 将公钥写入认证key文件(在服务端操作)
cat id_rsa.pub >> ~/.ssh/authorized_keys
写入成功后,再次使用ssh登录会自动登录成功。
注:如果使用的密钥对不是系统默认的密钥对,可以ssh登录时使用-i参数指定使用的私钥。例如:ssh -i ./ssh/id_rsa
基于ssh,我们可以借助各类终端软件对远程主机进行访问,但当涉及到使用UI界面的工具/软件时需要使用远程桌面进行访问。
xrdp 是一个微软远程桌面协议(RDP)的开源实现,通过xrdp可以登录远程机器,并且创建一个真实的桌面会话,通过客户端软件设置可以像使用本地机器一样的访问远程主机。
借助ubuntu xrdp服务和windows 远程桌面连接客户端,就可以实现在windows环境下访问远程ubuntu桌面。
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端口。
这里我们使用windows自动的“远程桌面连接”访问xrdp服务。
sudo vim /etc/xrdp/sesman.ini
FuseMountName=thinclient_drives
修改为:
FuseMountName=.xrdp/thinclient_drives
并创建~/.xrdp目录(可选,没有该目录不会创建thinclient_drives文件夹)
mkdir ~/.xrdp
sudo umount thinclient_drives
sudo rm -rf thinclient_drives
sudo systemctl restart xrdp
vim ~/.xsessionrc
export GNOME_SHELL_SESSION_MODE=ubuntu
export XDG_CURRENT_DESKTOP=ubuntu:GNOME
export XDG_CONFIG_DIRS=/etc/xdg/xdg-ubuntu:/etc/xdg
sudo systemctl restart xrdp
sudo vim /etc/xrdp/xrdp.ini
tcp_send_buffer_bytes=4194304
tcp_recv_buffer_bytes=6291456
sudo systemctl restart xrdp
基于ssh服务,我们可以访问登录到远程主机,但当涉及到大量文件修改、编码实现时还是有很多不方便的;xrdp可以直接访问桌面,但受限于网络速度通常存在桌面UI刷新卡顿的情况。
vscode提供了远程开发的功能,对不涉及UI界面的编程开发,我们可以借助于vsode将性能更强大的远程主机作为日常的开发环境。
在vscode的扩展中查找ssh插件,并安装
安装完成后会增加远程连接的侧边栏:
点击”+“(New Remote) 添加新的远程连接:
输入用户名、主机名/IP、端口(可选)进行连接:
注:vscode的远程连接基于ssh服务,建立”New Remote“时使用的就是ssh访问命令。
刷新后在ssh下面可以对应的主机名/IP:
使用图标或右键,选择“Connect in Current Window…”或“Connect in New Window…”连接远程主机,根据弹窗选择远程主机系统、用户密码:
连接成功后左下角可以看到主机名/IP:
连接成功后,再选择“Open File”或“Open Folder”,我们可以看到访问到的就是远程主机上的文件目录:
后续就可以像在本地使用vscode一样的操作,存在的差异就是此时创建、编译的文件均存储在远程主机上面,使用终端时打开的也是远程主机的shell终端。