Linux 远程桌面:SSH

Bash RSA SSH Socket Unix X11 事件 磁盘挂载 网络 操作系统 远程桌面 Linux

有时不在电脑旁却需要操作电脑,这时会用到远程桌面。它可以获得远程主机的Shell,与Adobe、QQ的远程控制不同的是,远程桌面利用操作系统服务和确定的网络协议来提供底层的远程控制。

对于微软的mstsc,使用RDP(Remote Desktop Protocol)协议;而linux远程多采用ssh(Secure Shell)进行安全的数据交换。

windows之间用mstsc远程很简单,唯一要注意的就是局域网的端口映射,毕竟windows是注重GUI的操作系统。然而在使用App Engine、VPS、ECS等服务器时,最有用的莫过于ssh和vim(当然,Emacs党仍然经久不衰)。本文介绍一些常用的ssh技巧和X11转发。

ssh 基础

ssh用于计算机之间的安全数据交换,数据采用公钥加密。服务器启动sshd服务,监听22端口;客户端用ssh连接到服务器。协议的整个过程大致如下:

  1. 服务器sshd启动时,生成密钥对,存放于/etc/ssh/ssh_host_*
  2. 客户端ssh发出请求连线请求;
  3. 服务器发送服务器的公钥给客户端;
  4. 客户端验证该公钥(通过公共密钥基础设施,现在还未普及,因此这时常常无法验证该公钥是否可靠,接受这个warning就可以);
  5. 客户端随机计算并发送自己的公钥给服务器;
  6. 采用这两对密钥开始加密的通信。

公私钥加密 又称 非对称加密 ,有很多可选的加密算法,常用的RSA算法是基于大数分解。每个通信方拥有自己的一对密钥(公钥和私钥),顾名思义公钥都是公开的用于加密,而私钥是保密的用于解密。

例如,Bob给Alice发的数据要用Alice的公钥进行加密,此密文只有Alice的私钥能解。公开密钥加密的关键便是公钥验证(避免公钥伪造),即公钥基础设施的建立。

# 连接到121.40.72.111,采用用户名harttle
ssh harttle@121.40.72.111

# 连接到121.40.72.111,采用当前的local用户名
ssh 121.40.72.111

# 连接并启用X11转发
ssh -X user@host

# 启用trusted X11转发,当上述命令有错误时可尝试
ssh -Y user@host

文件共享,可以用secure cp来拷贝文件:

scp something.local user@host:/to/your/path

也可以直接把磁盘挂载过去

# 服务器设置共享路径
# file: /etc/export 
/home/dir 192.168.20.203(rw,no_root_squash,async)

# 在客户端挂载该共享路径
mount 192.168.20.111:/home/dir /home/dir

X11基础

X11是Unix的GUI系统,1984年由MIT开发,现在由xorg基金会接管。X11采用网络架构,包括X server和X client,它们通过socket进行通信。

远程桌面只要一个X11客户端,而不需要特殊的图形转发协议。这正是Unix的设计哲学带来的好处:一切皆文件。socket正是一种特殊的文件(即符合打开->读写->关闭的操作模式),因此X11采取的CS架构可以提供统一的接口(文件)。

常见术语

下面是一些与X11相关的术语,很常见的:

  • X server 管理硬件、屏幕绘制和字体。接管着鼠标、键盘和屏幕,给各种各样的终端提供服务。
  • X client 负责处理 X server 的事件处理。及时处理图形事件并通知 X server 进行绘图。
  • X Window Manager 用来管理其他的 X client,进行统一的绘图,这样才能提供统一的桌面系统。否则各client间会互相干扰。
  • X Display Manager 用来提供图形登录控制,一般在tty7。常见的有gdm,kdm等。

常用命令

startx用来启动X,该脚本会调用xinit分别启动X server和X client,它们的配置文件分别位于:

~/.xserverrc, /etc/X11/xinit/xserverrc
~/.xinitrc, /etc/X11/xinit/xinitrc

在远程时,往往希望将远程主机的图形界面显示在本地,也就是实现远程桌面。这时需要在本地打开X server的访问控制。

# 将远程主机添加到X server访问控制列表
xhost + 17.200.10.5
# 打开X server访问控制
xhost +
# 将远程主机从X server访问控制列表删除
xhost - 17.200.10.5
# 关闭X server访问控制
xhost -

然后,命令远程服务器将窗口显示在某个X client(本地)上。

setenv DISPLAY 128.100.2.16:0.0

ssh配置

对ssh进行设置,可以方便地完成自动登录、X11转发、保持在线等功能。ssh服务器与客户端配置文件分别为:

/etc/ssh/sshd_config
/etc/ssh/ssh_config, ~/.ssh/config

一个客户端的示例配置如下:

# file: ~/.ssh/config
Host bit
    Hostname 121.40.72.111
    ServerAliveInterval 120
    User harttle

X11转发

在服务器设置:

AllowTcpForwarding  yes
X11Forwarding       yes
X11DisplayOffset    10
X11UseLocalhost     yes

客户端设置:

ForwardX11          yes
# 如果有大量的GUI绘制
ForwardX11Trusted   yes

加速登录

当需要登录多个shell时,让同一主机的所有会话使用同一个连接来避免重复登录。

Host examplehost.com
    ControlMaster auto
    ControlPersist yes
    ControlPath ~/.ssh/socket-%r@%h:%p

为了提高速度,可以采用数据压缩、指定ipv4以避免ipv6查找:

Compression yes
AddressFamily inet

在线保持

在客户端可以定时发送信号,以保持在线:

ServerAliveInterval 120

相反地,也可以在服务器设定客户端在线间隔:

ClientAliveInterval 120
Harttle

致力于简单的、一致的、高效的前端开发

看看这个?