MobaXterm 中X11-forwarding问题
我的环境:
. host: win11 . hypervisor: virtualbox . vm: centos8 . terminal: mobaXterm 在mobaXterm中新建ssh session,连接vm,默认用户vagrant。
- 问题背景:
我需要利用xclip以便在tmux下cope-mode下拷贝的内容可以发送到host的clipboard,从而可以在host中的notepad++等编辑器中粘贴使用。 问题现象:
在我的mobaXterm ssh session中xclip、xeyes等不work,报错如下。┌────────────────────────────────────────────────────────────────────┐ │ • MobaXterm 20.6 • │ │ (SSH client, X-server and networking tools) │ │ │ │ ➤ SSH session to vagrant@192.168.xx.xx │ │ • SSH compression : ✔ │ │ • SSH-browser : ✔ │ │ • X11-forwarding : ✘ (disabled or not supported by server) │ │ • DISPLAY : 192.168.a.b:0.0 │ │ │ │ ➤ For more info, ctrl+click on help or visit our website │ └────────────────────────────────────────────────────────────────────┘ [vagrant@dw1-cn ~]$ pwd [vagrant@dw1-cn ~]$ su Password: [root@dw1-cn vagrant]# xclip Error: Can't open display: (null) [root@dw1-cn vagrant]# xeyes Error: Can't open display:
X11介绍:
X11指的是X协议的第11个版本,这个协议是Linux操作系统下图形用户界面(GUI)的标准。它是由X server和X client组成的,X server主要管理显示相关的硬件设置并负责屏幕画面的绘制与显示,以及将输入设置的动作告知X client,而X client主要负责事件的处理即程序的逻辑。X11-forwarding则是指通过支持X Server的SSH客户端,如MobaXterm,连接到远程Linux服务器后,可以在本地通过MobaXterm运行操作一个远程Linux服务器上有图形界面的程序。简单来说,X11-forwarding就是将远程服务器上的图形界面操作和显示传递到本地,使得用户可以在本地看到并操作远程服务器上的图形界面。
- 问题原因:
而xclip、xeyes等是通过X11-forwarding来实现。而vm的centos系统中缺少了xauth,导致X11-forwarding无法开启。
排查过程
检查sshd配置:
vi /etc/ssh/sshd_config X11Forwarding yes
重启sshd:
sudo systemctl restart sshd
检查mobaXterm中x11-forwarding设置:
需要勾选 settings->configuration->ssh->x11-forwarding
检查xauth是否安装:
yum install xauth
新问题:xauth安装后,.Xauthority缺失问题
现象:
mobaXterm再次登录后,仍然可能 报错 /usr/bin/xauth: file /home/vagrant/.Xauthority does not exist
解决办法
创建.Xauthority[vagrant@dw1-cn ~]$ touch /home/vagrant/.Xauthority [vagrant@dw1-cn ~]$ chown vagrant:vagrant /home/vagrant/.Xauthority
重新连接后,xeyes work了。
###### vagrant ok [vagrant@dw1-cn ~]$ echo $DISPLAY localhost:11.0 [vagrant@dw1-cn ~]$ xeyes
如果不是直接通过mobaXterm ssh session登陆,通过ssh登陆的话,需要添加-XY
ssh -XY vagrant@192.168.x.x
新问题:nest登录的用户xclip不work问题
现象:
测试xeyes,ssh登录的初始用户vagrant以及root是ok的,但是nest登录的其它用户gpadmin不ok###### vagrant ok [vagrant@dw1-cn ~]$ echo $DISPLAY localhost:11.0 [vagrant@dw1-cn ~]$ xeyes [vagrant@dw1-cn ~]$ su Password: ###### root ok [root@dw1-cn ~]$ xeyes [root@dw1-cn ~]# echo $DISPLAY localhost:11.0 ###### gpadmin ng [root@dw1-cn ~]# su - gpadmin Last login: Tue Sep 26 07:45:11 UTC 2023 on pts/15 [gpadmin@dw1-cn ~]$ xeyes Error: Can't open display: [gpadmin@dw1-cn ~]$ echo $DISPLAY [gpadmin@dw1-cn ~]$ logout
原因:
- su -登录gpadmin,不会继承来自vagrant的环境变量,从而导致$DISPLAY为空
- 上面创建的.Xauthority gpadmin用户因为权限问题无法访问。.Xauthority存储了用户的身份验证信息和访问权限。
解决办法:
$DISPLAY为空问题,改变su - gpadmin为su gpadmin,即可以继承该环境变量。但是我的环境下刚好需要su - gpadmin的登录方式,以便屏蔽环境变量对我的开发过程影响。.Xauthority登录信息需要共享给gpadmin。
root用户添加utility命令xsu:
. 将vagrant用户.Xauthority中的登录信息进行提取。然后添加到gpadmin用户的.Xauthority中,实现.Xauthority信息的共享。
. 将$DISPLAY保存到临时文件,在gpadmin登录后load该文件,来设置$DISPLAY。这样可以支持su - gpadmin方式。
说明:这里不使用command substitution而使用临时文件,是因为在shell函数中将command substitution通过pipeing传递遇到问题。root的xsu命令,用法:xsu gpadmin
~/utils/myutl.sh
xsu() { TARGETUSER="$1" if [ -z "$TARGETUSER" ]; then echo "Please provide a target user." return 1 fi # Extract X11 authentication data from the vagrant user's .Xauthority file and save to a temporary file TMP_XAUTH_FILE="/tmp/xauth_data_for_$TARGETUSER" xauth -f /home/vagrant/.Xauthority extract - "$DISPLAY" > "$TMP_XAUTH_FILE" 2>/dev/null # Merge the extracted X11 authentication data from the temporary file into the target user's .Xauthority file cat "$TMP_XAUTH_FILE" | sudo -u "$TARGETUSER" xauth -f "/home/$TARGETUSER/.Xauthority" merge - rm -f "$TMP_XAUTH_FILE" # Clean up the temporary file # Store the DISPLAY value in a temporary file accessible to the target user echo "$DISPLAY" > "/tmp/display_for_$TARGETUSER" # Switch to the target user su - "$TARGETUSER" }
root 的~/.bashrc
source ~/utils/myutl.sh
gpadmin 的~/.bashrc
# Load the DISPLAY value set by the xsu command if [ -f /tmp/display_for_$(whoami) ]; then export DISPLAY=$(cat /tmp/display_for_$(whoami)) fi
效果
[root@dw1-cn vagrant]# xsu gpadmin
Last login: Tue Sep 26 13:07:20 UTC 2023 on pts/8
[gpadmin@dw1-cn ~]$ vi ~/.bashrc
[gpadmin@dw1-cn ~]$ echo $DISPLAY
localhost:12.0
[gpadmin@dw1-cn ~]$ xeyes
[gpadmin@dw1-cn ~]$
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。