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
  • 原因:

    1. su -登录gpadmin,不会继承来自vagrant的环境变量,从而导致$DISPLAY为空
    2. 上面创建的.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 ~]$

黑暗森林
12 声望2 粉丝

弱小和无知不是生存的障碍,傲慢才是!