Ssh

X11 轉發適用於某些 progs,其他 progs 忽略 $DISPLAY?

  • January 4, 2022

我有 2 台 linux 機器正在執行。如果我從一個連接到另一個

ssh -X 192.168.1.6

我能夠啟動xterm,或者firefox視窗在我正在使用的機器上按預期顯示。

但是如果我啟動gnome-terminalor meld,這些程序的視窗就會顯示在遠端機器上。

似乎沒有一般的身份驗證問題,因為我沒有收到錯誤消息。我已經找到了那個執行緒:如何在我的無頭伺服器上遠端啟動 gnome-terminal?(無法通過 X11 轉發啟動)

並從那裡腳本:

#! /bin/bash
ID=foo.bar$RANDOM
GDK_BACKEND=x11 /usr/libexec/gnome-terminal-server --app-id "$ID" &
sleep .4        # yuck
gnome-terminal --app-id "$ID"
wait

gnome-terminal. 但對於meld是沒有選擇--app-id 的。

我有辦法讓視窗顯示在正確的機器上嗎?

順便說一句:兩台機器上的 linux 版本都是 5.15.12-200.fc35.x86_64 fedora

如何在沒有任何額外腳本和環境黑客的情況下使其工作:

只需在任何地方禁用 Wayland!在您選擇要登錄的使用者, fedora gdm 登錄螢幕會在登錄螢幕上提供一個幾乎隱藏的菜單。有一個小齒輪,在目前的gnome版本中它在右下,並且選擇“gnome under X11”以擺脫wayland問題。在這也觸摸屏工作之後,字型渲染得到了很大改進,滑鼠指針校準工作完美。他們都沒有與 Wayland 合作……僅作為旁注!注意:您必須在主機和遠端端隨時隨地禁用 Wayland!

據我了解,指示程序使用 X11 轉發的重要部分是GDK_BACKEND=x11變數。沒有它,GNOME 應用程序將預設使用 Wayland 視窗系統,這將導致視窗顯示在遠端機器上。

--app-id只是停止gnome-terminal嘗試連接到任何其他現有實例,這些實例gnome-terminal-server可能在遠端主機上的同一使用者帳戶上執行(與該主機上的本地會話相關聯),或者可能由會話按需啟動D-Bus,不知道使用 X11 轉發的要求。相反,gnome-terminal只會與gnome-terminal-server被告知使用 X11 轉發和GDK_BACKEND=x11環境變數的特定實例對話。

gnome-terminal只需要這個--app-id東西,因為gnome-terminal它並不是真正的終端應用程序:它只是一個小型客戶端應用程序,它呼叫 D-Bus 來gnome-terminal-server創建實際的終端視窗。這是一種gnome-terminal無法分辨的解決方法gnome-terminal-server:“嘿,在創建這個新的終端視窗時,使用 X11 後端,$DISPLAY$XAUTHORITY不是你可能已經擁有的任何預設顯示安排。”

如果我的理論是正確的,那麼你應該可以從meld一個簡單的開始:

GDK_BACKEND=x11 meld

如果這可行,那麼您可以創建一個簡單的包裝腳本,如下所示:

#!/bin/sh
if [ "$SSH_CONNECTION" != "" ] && [ "$DISPLAY" != "" ]; then
   GDK_BACKEND=x11 /usr/bin/meld "$@"
else
   exec /usr/bin/meld "$@"
fi

假設 realmeld位於/usr/bin/meld,您可以命名此腳本meld並將其放置$PATH在 /usr/bin 之前的某個目錄中,然後meld總是會做正確的事情,無論您是在本地執行還是通過 SSH X11 轉發。

或者,您甚至可以在遠端電腦上添加一個簡單的測試來為所有程序設置一個簡單的測試,~/.bash_profile只要您的會話與具有 X11 轉發的 SSH 連接相關聯:~/.profile``GDK_BACKEND=x11

if [ "$SSH_CONNECTION" != "" ] && [ "$DISPLAY" != "" ]; then
   export GDK_BACKEND=x11
fi

引用自:https://unix.stackexchange.com/questions/684955