Типичная ситуация: коннектимся с машины M1 на машину M2 через SSH, затем на машине M2 меняем юзера через sudo и хотим там запустить X11-приложение, чтобы оно открылось на дисплее машины M1. Это может быть, например, отладчик или графическая гуйня к базе.
Дальше я по шагам распишу все этапы подключения с комментариями.
Сначала соединяемся с машиной M2 (server-M2.example.com) с включённым X11-форвардингом и логином ubuntu
:
$ ssh -X [email protected]
Ключик -X
включает X11-форвардинг, после соединения на стороне машины M2 автоматически делается несколько вещей, чтобы заработал форвардинг:
- в переменную окружения
DISPLAY
прописывается строка видаlocalhost:10.0
; - в домашнем каталоге юзера создаётся файл
.Xauthority
с секретной строкой для авторизации X11-подключений (чуть подробнее об этом можно тут, например, прочитать).
Теперь из этой сессии можно запустить X11-приложение и оно откроется на дисплее машины M1.
Следующий шаг — смена юзера на devuser
через команду sudo -u devuser -i
, она открывает полноценный shell, но уже принадлежащий полностью юзеру devuser
. И вот уже здесь X11-приложения запускаться не будут:
$ xterm
X11 connection rejected because of wrong authentication.
X11 connection rejected because of wrong authentication.
X11 connection rejected because of wrong authentication.
X11 connection rejected because of wrong authentication.
xterm Xt error: Can't open display: localhost:10.0
devuser@ubuntu:~$
Решение: нужно «пробросить» X11-куку в sudo-сессию, быстрее всего это сделать вот таким шаманством:
$ sudo -u devuser -i xauth add $(xauth list | xargs -n 3) && sudo -u devuser -i
В этой команде делается простое:
- берём авторизационную куку из текущей сессии (
$(xauth list | xargs -n 3)
); - добавляём её в файл с куками для юзера
devuser
(xauth add ...
); - запускаем интерактивную сессию для юзера через sudo.