xauth 문제: sudo(root) 로 사용하려면?

ssh 에서 제공하는 X11-Forwarding 을 사용해서, 사용자는 서버에 있는 그래픽 프로그램을 실행시키고, 그 결과를 내 PC 에서 볼 수 있다. 이를 위해서 ssh 는 매번 연결 시에 사용자 홈디렉토리에 .Xauthority 라는 파일을 생성한다.
좀 더 자세한 내용을 알고 싶다면.. 좋은 글을 찾았는데, 너무 길어서 대충 보다 말았다.

ssh man page 에는 이렇게 나와있다.

ssh will also automatically set up Xauthority data on the server machine. For this purpose, it will generate a random authorization cookie, store it in Xauthority on the server, and verify that any forwarded connections carry this cookie and replace it by the real cookie when the connection is opened. The real authentication cookie is never sent to the server machine (and no cookies are sent in the plain).

여기서 중요한 점은, ‘random’ 이다. 즉, 이 값은 늘 바뀌기 때문에(로그인 할 때마다), sudo, su 등을 실행하려면, .Xauthority 를 root 에 추가하는 작업도 매번 해줘야 한다. 물론, 한번 해주면 터미널 창을 닫을 때까진 유효하다.

하는 법은 stackexchange 에 크게 두 가지로 설명돼 있긴 한데, 첫번째 방법은 내 상황에선 약간 수정이 필요했다. 기타 여러 다른 문서를 찾을 수 있었는데, 모두 방법은 대동소이.

왜 root 로는 안되나?

위에서 말했듯, ssh 세션이 열릴 때마다 그 사용자용으로 새 .Xauthority 파일이 생성되고, 그 세션동안만 값이 유지된다. 다른 사용자로 사용하려면 그 사용자용(root)으로 새로운 ssh 세션을 열어야 하는데, root 로는 아예 로그인이 안되게끔 설정했으므로 .Xauthority 를 생성할 수가 없다.

그리하여, 일단 일반 사용자로 ssh 로그인한 후, 그 사용자용 .Xauthority 를 root 로 복사하는 편법(?)이 필요하다. (그냥 cp 로 복사를 해도 되긴 된다.)

일반 사용자용 xauth 정보를 root 로 복사

첫번째 : 다소 복잡하고, 실패 가능성도 있는 방법(tail 필요)

위에 언급한 StackExchange 의 첫번째 방법.
이걸 정리하면 다음과 같다. 당연하지만, ssh 접속 후 서버에서 실행한다.

$ xauth list | grep unix$(echo $DISPLAY | cut -c10-12) | tail -1 > /tmp/xauth
$ sudo -i
# xauth add $(cat /tmp/xauth)

몇몇 명령을 살짝 바꿨는데..
xauth list 가 한 줄만 나오는 때도 있지만, 여러 줄 나오는 때도 있다. 왜 이런 건지는 잘 모르겠다. 아무튼 필요한 항목은 가장 아랫줄이므로, 그것만 취한다. 만약 항목이 여러 개이고, tail -1 이 없다면 xauth add 시에 오류가 발생한다.

이 명령의 문제점? 너무 길다!

두번째: 간단 명료

역시 ssh 접속 후 서버에서 실행한다.

$ sudo -i
# xauth merge /home/userX/.Xauthority

또는, 그냥 sudo 사용.
$ sudo xauth merge ~/.Xauthority

원문에선 sudo -s 와 preserve-env 를 사용했는데, 그냥 sudo -i 를 하는게 더 나은 듯 한데? 왜 그리 했는진 모르겠다. 게다가, 우분투 서버 계열에선 sudo -i 나 sudo -s 나 $DISPLAY 값은 같다.
sudo/su 역시 StackExchange 에서 깊고 짙게 논의된 적이 있다.

alias 로 만드는게 좋을 듯.

alias suxauth='sudo xauth merge ~/.Xauthority'

세번째 : 단순 무식

그냥 복사 해도 되긴 된다.

$ sudo cp ~/.Xauthority /root

이랬을 때 어떤 문제점이 있을 지는 모름!


다시 한번 기록한다.
이 방법 모두, ssh 접속을 새로 하면 다시 명령을 실행해줘야 한다.

Author: 아무도안

안녕하세요. 글 남겨주셔서 고맙습니다.