( Linux 에서 적응 : ssh + screen을 통해 세션이 시작되면 wmctrl이 디스플레이를 열 수 없음 )
디스플레이 및 권한
X 프로그램은 X 디스플레이에 연결하기 위해 두 가지 정보가 필요합니다.
그것은 일반적으로 디스플레이의 주소가 필요 :0
당신은 로컬 또는 로그인 할 때를 :10
, :11
등 당신은 원격으로 로그인 한 (그러나 숫자가 활성화 얼마나 많은 X 연결에 따라 변경 될 수 있습니다) 때. 디스플레이의 주소는 일반적으로 DISPLAY
환경 변수에 표시됩니다 .
디스플레이 암호가 필요합니다. X 디스플레이 암호를 매직 쿠키 라고 합니다 . 매직 쿠키는 직접 지정되지 않습니다. 쿠키는 항상 X 표시 파일에 저장됩니다.이 파일은“display :42
has cookie 123456
” 형식의 레코드 모음입니다 . X 권한 파일은 일반적으로 XAUTHORITY
환경 변수에 표시됩니다 . 설정 $XAUTHORITY
되어 있지 않으면 프로그램은을 사용 ~/.Xauthority
합니다.
데스크탑에 표시된 창에서 작동하려고합니다. 데스크톱 컴퓨터를 사용하는 유일한 사람인 경우 표시 이름은 :0
입니다. X 권한 파일의 위치를 찾는 것은 더 어렵습니다. 데비안 스퀴즈 또는 우분투 10.04에서 gdm을 설정하면 임의로 생성 된 이름을 가진 파일에 있기 때문입니다. 이전 버전의 gdm에서 기본 설정 (예 :에 저장된 쿠키)을 사용했기 때문에 문제가 없었습니다 ~/.Xauthority
.
변수 값 얻기
DISPLAY
및 의 값을 얻는 몇 가지 방법은 다음 과 XAUTHORITY
같습니다.
당신은 체계적에서 로그인 스크립트 (아마도 자동으로 바탕 화면에서 화면 세션을 시작할 수 ~/.profile
있지만 그것은 단지 X에서 로그인하는 경우 수행 테스트를하는 경우 DISPLAY
로 시작하는 값으로 설정 :
(즉, 모든 경우 당신은 가능성이있어이 포함되어야 발생)). 에서 ~/.profile
:
case $DISPLAY in
:*) screen -S local -d -m;;
esac
그런 다음 ssh 세션에서
screen -d -r local
또한의 값을 절약 할 수 DISPLAY
및 XAUTHORITY
파일에하고 값을 기억합니다. 에서 ~/.profile
:
case $DISPLAY in
:*) export | grep -E '(^| )(DISPLAY|XAUTHORITY)=' >~/.local-display-setup.sh;;
esac
ssh 세션에서 :
. ~/.local-display-setup.sh
screen
당신의 값을 감지 할 수 DISPLAY
및 XAUTHORITY
실행중인 프로세스에서입니다. 자동화하기가 더 어렵습니다. 작업하려는 디스플레이에 연결된 프로세스의 PID를 파악한 다음 /proc/$pid/environ
( eval export $(</proc/$pid/environ tr \\0 \\n | grep -E '^(DISPLAY|XAUTHORITY)=')
¹) 에서 환경 변수를 가져와야합니다.
쿠키 복사
Arrowmaster 의 제안에 따른 또 다른 접근법 $XAUTHORITY
은 ssh 세션에서 값을 얻으려고 시도하지 않고 대신 X 세션에서 쿠키를에 복사하는 것 ~/.Xauthority
입니다. 쿠키는 로그인 할 때마다 생성되므로에서 값을 오래 유지해도 문제가되지 않습니다 ~/.Xauthority
.
원격 관리자가 해당 내용을 볼 수 있도록 NFS 또는 다른 네트워크 파일 시스템을 통해 홈 디렉토리에 액세스 할 수있는 경우 보안 문제가있을 수 있습니다. X TCP 연결을 활성화하지 않은 경우 (어쨌든 데비안은 기본적으로 꺼져 있습니다) 여전히 컴퓨터에 연결해야합니다. 따라서 대부분의 사람들에게 이것은 적용되지 않거나 (NFS 없음) 문제가 아닙니다 (X TCP 연결 없음).
데스크탑 X 세션에 로그인 할 때 쿠키를 복사하려면 ~/.xprofile
또는 다음 라인을 추가하십시오 ~/.profile
(또는 로그인 할 때 읽히는 다른 스크립트).
case $DISPLAY:$XAUTHORITY in
:*:?*)
# DISPLAY is set and points to a local display, and XAUTHORITY is
# set, so merge the contents of `$XAUTHORITY` into ~/.Xauthority.
XAUTHORITY=~/.Xauthority xauth merge "$XAUTHORITY";;
esac
¹ 이 인용 적절한하지만,이 특정 인스턴스에 부족 원칙 $DISPLAY
과 $XAUTHORITY
어떤 쉘 메타 문자가 포함되지 않습니다.