CentOS6에서 실행하려는 오래된 응용 프로그램이 있는데 abc1과 abc2 등 여러 시스템을 사용합니다.
abc1에 로그인하고 ssh를 통해 abc2에 연결된 애플리케이션을 실행하고 변수를 DISPLAY
abc1 abc1:0.0
에서 새 창을 열려고 시도하는 프로세스를 실행했습니다. 그러나 실패합니다.cannot open display
ssh -X abc2
or 을 수행하면 ssh -Y abc2
문제 없이 xterm을 열 수 있지만 DISPLAY 변수는 다음과 같이 설정됩니다.localhost:10.0
abc1이 올바르게 구문 분석된다는 점에 유의하세요(abc2에서 abc1을 ping할 수 있음).
애플리케이션을 전혀 수정할 수 없으므로 애플리케이션 DISPLAY
이 사용하는 변수를 제어할 수 없습니다. 그러나 abc1 및 abc2의 구성을 수정할 수 있습니다. 저는 격리된 네트워크에 있고 보안에 관심이 없습니다.
SSH 구성에 뭔가가 있거나 abc1:0.0
이것이 작동하도록 변경할 수 있는 다른 것이 있습니까?
답변1
로컬로 로그인한 경우 abc1
에는 관련이 없을 수도 있습니다... 하지만 SSH X11 전달을 사용하여 워크스테이션에서 연결하는 경우 abc1
시작할 수도 있습니다.중첩된 X 서버abc1
들어오는 연결을 캡처하여 abc1:0.0
보안 SSH X11 터널 내 워크스테이션의 로컬 X 서버로 전달합니다.
RHEL/CentOS 6에서 필요한 RPM 패키지는 또는 xorg-x11-xserver-Xnest
( xorg-x11-xserver-Xephyr
최신 구현일수록 성능이 더 좋을 수 있음)입니다.
원래:
- 일반 X 서버를
abc1
TCP 연결을 수신하지 않는 기본 상태 로 둡니다. - 워크스테이션에서 로컬 X 서버 실행
- 워크스테이션에서 X11 전달 SSH 연결을 설정합니다.
abc1
- 적절한 옵션을 사용하여 백그라운드에서 듣기를 시작
Xnest
하거나 허용하세요.Xephyr
abc1
abc1:0.0
- 애플리케이션을 시작하세요.
이 질문에 대한 @roaima의 의견을 참조하세요. 오래된 X 응용 프로그램을 사용하더라도 응용 프로그램에 DISPLAY 설정을 하드코딩하는 것은 항상 매우 성가신 일입니다.
DISPLAY 변수는 구성 가능한 위치에 설정될 가능성이 높습니다. 예를 들어, 애플리케이션을 실행하는 데 사용되는 사용자 계정의 로그인 스크립트에 지정될 수 있습니다. 그러나 수정이 애플리케이션 수정으로 간주되면 권장 해결 방법을 사용해야 합니다.
답변2
무슨 일이 일어났는지에 대한 간략한 설명:
X 전달을 통해 ssh
원격 컴퓨터의 X 서버처럼 원격 컴퓨터(abc2)에 로컬 X 프로토콜 소켓을 생성한 다음 SSH 터널을 통해 X-ray 프로토콜을 원래 컴퓨터(abc1)로 전달합니다. 로컬 소켓은 으로 식별됩니다 localhost:10.0
.
OTOH, abc1:0.0
모니터는 이전 X 네트워크 프로토콜을 사용하고 abc1의 X 서버가 올바른 포트에서 수신 대기할 것으로 예상합니다. 이 기능은 매우 안전하지 않기 때문에 최신 시스템에서는 기본적으로 비활성화되어 있습니다.
따라서 상황에 따라 abc2에서 실행되는 응용 프로그램이 abc1에서 실행되는 X 서버를 사용해야 하는 경우 가장 쉬운 방법은 이 -nolisten
옵션을 사용하지 않고 abc1에서 X 서버를 시작하는 것입니다. 이렇게 하려면 X 서버가 시작되는 방법(일반적으로 xdm/gdm/kdm/lightdm과 같은 디스플레이 관리자에 의해)을 찾아 시작 호출을 수정해야 합니다.
다음으로 해야 할 일은 액세스 제어를 활성화하는 것입니다. 격리된 네트워크에서는 xhost +
모든 연결을 사용하고 허용하세요. 그렇지 않으면 xauth
현재 MIT 매직 쿠키를 사용하고 추가할 수 있습니다. 세부 사항은 부분적으로 X 서버가 컴퓨터에 구성되는 방식에 따라 달라집니다.