X11 전달은 일부 프로그램에서 작동하고 다른 프로그램에서는 $DISPLAY를 무시합니까?

X11 전달은 일부 프로그램에서 작동하고 다른 프로그램에서는 $DISPLAY를 무시합니까?

2 대의 Linux 시스템이 실행 중입니다. 내가 다른 사람을 통해 연결하면

ssh -X 192.168.1.6

xtermor 를 실행할 수 firefox있고 작업 중인 컴퓨터에서 창이 예상대로 표시됩니다.

gnome-terminal하지만 또는 을 실행하면 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 로그인 화면에서는 로그인 화면에서 거의 숨겨진 메뉴를 사용할 수 있습니다.뒤쪽에로그인할 사용자를 선택했습니다. 작은 기어가 있는데, 현재 그놈 버전에서는 오른쪽에 있습니다. "X11 아래의 그놈"을 선택하면 Wayland 문제를 해결할 수 있습니다. 터치스크린이 작동하면 글꼴 렌더링이 훨씬 향상되고 마우스 포인터 보정이 완벽하게 작동합니다. 그들 중 누구도 Wayland와 협력하지 않습니다... 참고로요! 참고: 호스트 측과 원격 측 모두에서 항상 Wayland를 비활성화해야 합니다!

답변1

내가 이해한 바로는 X11 전달을 사용하는 부트스트랩의 중요한 부분은 변수입니다 GDK_BACKEND=x11. 이것이 없으면 GNOME 응용 프로그램은 기본적으로 Wayland 창 시스템을 사용하게 되며, 이로 인해 창이 원격 시스템에 표시됩니다.

이는 원격 호스트의 동일한 사용자 계정(해당 호스트의 로컬 세션과 연결됨)에서 실행 중이거나 주문형 D-Bus 세션에 의해 시작될 수 있는 다른 기존 인스턴스에 연결하려는 시도를 --app-id방지하기 위한 것 입니다 . X11 전달 요청 사용을 인식하지 못합니다. 대신 X11 전달 및 환경 변수를 사용하라는 특정 인스턴스에만 통신 합니다 .gnome-terminalgnome-terminal-servergnome-terminalgnome-terminal-serverGDK_BACKEND=x11

gnome-terminal이것은 실제로 터미널 응용 프로그램이 아니기 --app-id때문에 필요한 것입니다 . 이는 D-Bus를 호출하고 실제 터미널 창을 생성하는 작은 클라이언트 응용 프로그램일 뿐입니다. 구별할 수 없는 해결 방법은 다음 과 같습니다 . "이 새 터미널 창을 만들 때 이미 가지고 있는 기본 디스플레이 배열 대신 X11 백엔드를 사용하세요."gnome-terminalgnome-terminal-servergnome-terminalgnome-terminal-server$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

실제 meld위치가 이라고 가정하면 /usr/bin/meld이 스크립트의 이름을 지정 하고 /usr/bin 이전 디렉토리 meld에 배치하면 로컬에서 실행하든 SSH X11 전달을 통해 실행하든 항상 올바른 작업을 수행합니다.$PATHmeld

~/.bash_profile또는 세션이 X11 전달을 통한 SSH 연결과 연결된 경우 모든 프로그램에 대해 설정하기 위해 ~/.profile원격 시스템에 간단한 테스트를 추가 할 수도 있습니다.GDK_BACKEND=x11

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

답변2

반대의 경우도 있습니다. 양쪽 끝에 waypipe를 설치합니다(이렇게 하면 wayland 응용 프로그램이 ssh -X 또는 ssh -Y가 X11에 대해 수행하는 방식으로 전달됩니다). "ssh -X (blah)" 대신 "waypipe ssh -X (blah)"를 실행하면 waypipe는 ssh 명령줄을 수정하여 포트를 전달하고, 원격 waypipe를 실행하고, wayland 응용 프로그램이 이를 사용하도록 환경 변수를 설정합니다.

그런 다음 wayland를 비활성화하는 대신 X11 응용 프로그램은 X 전달을 통해 전달되고 wayland 응용 프로그램은 waypipe를 통해 전달됩니다.

(참고로 저는 현재 X11을 사용하고 있어서 아직 시도하지 않았지만 웨이파이프는 잘 작동한다고 합니다.)

관련 정보