Порой возникает необходимость к удаленному доступу до графического интерфейса компьютера.
Для Linux оптимальным решением такой задачи является VNC.
В стандартных репозиториях Дебиана много различных VNC-серверов, а различия в их настройке не очень существенны. Разберем настройку VNC-сервера xtigervnc, т.к. он является наиболее гибким в настройке и не имеет ряда проблем с совместимостью приложений (так, в tightvnc не всегда корректно отображается кодировка на сервере, это связано с проблемами совместимости между библиотеками tightvnc и qt). Доступ к серверу должен быть у одного и уже имеющегося реального пользователя системы (если нет, или нужен отдельный пользователь, его можно создать).
Установка из репозитория производится стандартным способом:
1 |
$ sudo apt update && apt -y install tigervnc-standalone-server |
Запуск сервера производится командой:
1 |
$ vncserver |
При первом запуске сервер запросит задать пароль для доступа к рабочему столу.
После запуска будет выведено сообщение, что сервер успешно запущен, и номер дисплея, на котором он работает.
Остановка сервера производится командой
1 |
$ vncserver -kill :1 |
где 1 — это номер дисплея.
Следующий шаг — создание сервиса systemdдля автоматического запуска сервера при старте системы. Для этого проще всего написать скрипт, запускающий сервер, и указать его в сервисе как команду запуска.
Пусть скрипт называется myvnc и располагается в /usr/local/bin
Тело скрипта:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
#!/bin/bash PATH="$PATH:/usr/bin/" DISPLAY="1" # Номер дисплея для работы сервера, поскольку сервер запускается только в единственном экземпляре и для одного пользователя, то и дисплей всегда будет один и тот же DEPTH="24" GEOMETRY="1280x800" OPTIONS="-localhost no -depth ${DEPTH} -geometry ${GEOMETRY} :${DISPLAY}" # Если не указать ключ -localhost no, то сервер будет слушать только 127.0.0.1 и не будет принимать соединения извне case "$1" in start) /usr/bin/vncserver ${OPTIONS} ;; stop) /usr/bin/vncserver -kill :${DISPLAY} ;; restart) $0 stop $0 start ;; esac exit 0 |
Сервис systemd должен располагаться в каталоге: /lib/systemd/system/
Пусть он называется vncserver.service
Тело:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
[Unit] Description=Start VNC server at startup After=syslog.target network.target [Service] Type=forking User=myuser ExecStart=/usr/local/bin/myvnc start ExecStop=/usr/local/bin/myvnc stop ExecReload=/usr/local/bin/myvnc restart [Install] WantedBy=multi-user.target |
Где в строке User после = необходимо указать имя пользователя,от имени которого будет работать сервер.
После написания скриптов, остается включить сервис командой:
1 |
$ sudo systemctl enable vncserver.service |
И можно его останавливать или перезапускать так же, как и любой другой системный сервис, командой
1 |
$ sudo service vncserver restart |
На этом стандартная настройка VNC-сервера закончена. Но иногда может возникнуть ситуация, когда в VNC-сессии одного пользователя нужно запустить какое-то графическое приложение от имени другого (в т.ч. от root). По умолчанию, доступ к дисплею есть только у владельца VNC, то есть того, под чьим именем происходит подключение к серверу. Чтобы дать другому пользователю право запуска графических приложений и доступа к его дисплею, в домашнем каталоге пользователя (владельца сервера) в файле .bashrc нужно добавить строчку:
1 |
xhost + SI:localuser:root > /dev/null |
Xhost — утилита управления дисплеями. + SI открывает доступ, далее следует указание, кому — локальному пользователю, в данном случае root. Так же можно открыть доступ и группе пользователей, или наоборот запретить. Более подробную информацию о ключах утилиты можно найти в её мануале.
Источники:
- https://habr.com/company/ua-hosting/blog/273201/
- https://wiki.archlinux.org/index.php/TigerVNC
- https://askubuntu.com/questions/115675/xhost-setting-at-boot