Графический сервер терминалов - защищённый удалённый вход, без потери информации в случае последующего разрыва

Данная статья описывает настройку и работу с программами в ОС Lubuntu.
Тем не менее, описанные процедуры должны быть идентичны и в других дистрибутивах семейства Ubuntu.

Возникла потребность, работая на слабом переносном компьютере подключаться к мощному серверу и использовать вычислительные ресурсы только мощной машины. А также: при отключении переносного компьютера все запущенные на мощной машине программы остаются запущенными, спустя произвольное время можно подключиться обратно и продолжить работу с того же места, где остановился. Мощной машиной может быть домашний настольный компьютер, назовём его Сервер. Переносным может быть слабенький планшет, назовём его Клиент. При этом возможная параллельная, локальная для Сервера сессия и удалённая сессия друг на друга не влияют. На Сервере могут независимо работать несколько человек. В т.ч., один из них может работать сидя за физическими клавиатурой и монитором.

Есть много разных описаний как сделать похожее, но редкость найти как сделать вышеописанную конфигурацию. А уж о том, что VNC и X-Server forwarding через SSH не позволяют 3D вычисления переложить на видео плату мощной машины, нагружая тонкого клиента - это мне совсем не попадалось.

В разное время для разных VNC и сходных серверов по разному была устроена защита передаваемой по сети информации. Проще говоря - раньше её не было. Сейчас у кого-то защита есть, у кого-то - нет. Здесь описывается соединение через канал защищённый SSH.

В статье неоднократно упоминаются файлы и каталоги изначально отсутствующие в системе. Такие каталоги и файлы надо создать, содержимое файлов описано или непосредственно в статье, или в отдельном списке, в конце статьи.

Во всех случаях, если не оговорено иного, считается что все команды и действия осуществляются от имени пользователя для которого настраивается доступ. И для Сервера, и для Клиента.

Предполагается, что команды выполняются в графическом эмуляторе терминала, имеющем возможность copy-paste, там, где эта возможность нужна.

Слово username означает в статье имя пользователя. Слово hostserver в статье означает доменное имя или IP адрес Сервера, hostclient - Клиента.

Cущественные замечания, поправки, предложения, касающиеся статьи и конфигураций, обеспечивающих решение сформулированной выше задачи (именно той), буду рад видеть в теме форума - «Графический сервер терминалов - защищённый удалённый вход» http://www.lubuntu.ru/forum/viewtopic.php?f=2&t=826

Настройки сервера

Используемые программы:

tightvncserver - сам VNC сервер,
openssh-server - SSH сервер для защиты соединения
fbpanel - "панель задач", используется для упрощения настройки многих сессий для одного пользователя,
feh - примитивная поддержка фонов экрана,
zenity - используется для отображения на экране оповещений.

У 'tightvncserver' есть синоним 'vncserver'. Наличие этого синонима, возможные параметры командной строки для синонима, неуникальны для семейства Ubuntu. В некоторых дистрибутивах (не поручусь за все) можно устанавливать другие реализации VNC сервера, использовать этот синоним и изложенное ниже будет работоспособно.

Установка программ:

sudo apt-get install tightvncserver openssh-server fbpanel feh zenity

Все настройки SSH сервера можно оставить как есть. Однако удобно настроить авторизацию с помощью ключей вместо паролей. Это и улучшает безопасность, и позволяет вводит пароль один раз за время работы Клиента. Такая настройка отдельная тема и здесь её не освещаю, пусть настройки остаются как есть.

В зависимости от ситуации может оказаться удобным использовать не обычную LXDE сессию, а OpenBox, например. Поэтому делаются минимальные настройки для удобной работы в OpenBox.

При нескольких сессия для одного пользователя удобно иметь панель независимую от LXPanel. Это fbpanel и её настройка сводится к размещению в '~/.config/fbpanel' файла 'vnc-fbpanel.conf', содержимое которого приведено в конце статьи.

Вводим команды:

mkdir -p ~/.config/openbox/
mkdir -p ~/.config/fbpanel/
touch ~/.config/openbox/autostart.sh
echo "" >> "${HOME}/.config/openbox/autostart.sh"
echo "feh -bg-scale '/usr/share/lubuntu/wallpapers/lubuntu-default-wallpaper.png' &" >> "${HOME}/.config/openbox/autostart.sh"
echo "fbpanel --profile vnc-fbpanel.conf &" >> "${HOME}/.config/openbox/autostart.sh"

Для включения отображения текста гладкими шрифтами нужно создать файл '~/.fonts.conf' и поместить в него содержимое:

~/.fonts.conf
<?xml version="1.0"?>
<!DOCTYPE fontconfig SYSTEM "fonts.dtd">
<fontconfig>
  <!-- Включить сглаживание для всего и вся. -->
  <match target="font" >
    <edit mode="assign" name="hinting" ><bool>true</bool></edit>
  </match>
  <match target="font" >
    <edit mode="assign" name="hintstyle" ><const>hintfull</const></edit>
  </match>
  <match target="font" >
    <edit mode="assign" name="antialias" ><bool>true</bool></edit>
  </match>
</fontconfig>

При желании в этом же файле можно гибко настраивать сглаживание и hinting для отдельных шрифтов и семейств шрифтов. Файл обрабатывается последовательно. Можно сначала включить все возможности, а потом избирательно отключать для конкретных шрифтов, для конкретных начертаний(жирный и т.п.) шрифта.

Однако наибольшее влияние оказывает правильный выбор разрешения экрана. Для определения значения оптимального количества точек на дюйм нужно непосредственно на Сервере запустить команду:

xdpyinfo | egrep "(dimensions|resolution)"

Команду надо запускать из физической консоли. Т.е. сидя за монитором сервера, набирая команду на физической клавиатуре сервера. Похоже, что по SSH не удаётся просто так получить разрешение используемое Сервером локально, а именно оно равно или близко к оптимальному. Плотность точек может быть выдана не симметричная, что-то вроде 95×96, например.

Пускай у нас получилось: 96×96, разрешение в dpi равно 96. Запоминаем это число, в голове или на бумажке. Оно понадобится при запуске VNC сервера, но до этого ещё далеко. Если пара была несимметричная - оба числа запоминаем.

Попутно, выше приведённая команда покажет размер изображения на мониторе в точках. Эта возможность не используется для Сервера, но используется на Клиенте.

Нужно создать файл запускающий на сервере по вызову VNC сервера сессию с графическим окружением.

Выполняем команды:

mkdir -p ~/.vnc/
touch ~/.vnc/xstartup
nano ~/.vnc/xstartup

Теперь копируем в буфер обмена приведённое в конце статьи содержимое файла '~/.vnc/xstartup', делаем вставку из буфера в окно терминала, где была дана команда 'nano ~/.vnc/xstartup'. Дальше надо нажать Ctrl+O, согласится с записью в файл, нажать Ctrl+X для выхода. Теперь команда:

chmod +x ~/.vnc/xstartup

VNC сервер умеет проверять аутентичность по паролю. Не все из VNC серверов умеют защищать трафик после ввода пароля. Независимо - включим защиту паролем. Точнее, даже не паролем, а файлом-ключом.

Вводим команду:

vncpasswd ~/.vnc/passwd
cp ~/.vnc/passwd ~/.vnc/passwd.username.hostserver

В процессе выполнения будут созданы копия и сам файл-ключ, описывающий пароли для полного доступа и для доступа «только чтение».

Созданная копия файла - '~/.vnc/passwd.username.hostserver' - нужна для настройки Клиента, если в последующем не охота вводить дополнительный пароль при каждом VNC подключении. Копия файла помещается в '~/.vnc/' на Клиенте. Эту копию надо перенести на Клиента.

Файл бинарный. Не выйдет просто так сделать copy-paste - зайти с Клиента на Сервер через SSH, сделать копировать в консоли Сервера и вставить в консоли Клиента в редактор nano. Вероятно, можно использовать 'hexedit'. Также можно задействовать 'sshfs', если она установлена, и скопировать файл на сервер обычным путём. См. SSHFS - файловый сервер быстро и просто. С точки зрения наличия 'sshfs' логистика верна. С точки зрения отсутствия 'sshfs' и т.п., принципов безопасности - файл надо переносить на флешке и т.п.

Настройка клиента

Предлагается использовать 'xtightvncviewer'. Вероятно кому-то подойдёт что-то другое. Инсталлируем:

sudo apt-get install xtightvncviewer

Созданный ранее на сервере и перенесённый на клиента файл-ключ помещается в файл '~/.vnc/passwd.username.hostserver'.

Налаживаем защищённый туннель к серверу. Пробуем работоспособность SSH вообще. Команда:

ssh username@hostserver

Если сервер впустил к себе, написал в приглашении к вводу команды своё имя, то всё хорошо. Закрываем эту сессию командой:

exit

Пробуем команду:

ssh -L 12345:localhost:5901 username@hostserver

Если не было сообщений об ошибках, то туннель создан, факт его существования можно увидеть по команде:

ps ax -o pid,command | grep ssh | grep "\-L"

Закрывается туннель утилитой kill. Способом описанным выше, через команду ps, получаем число-идентификатор процесса отвечающего за туннель (первое число в полученной строке, или число в первом столбце списка). Далее команда:

kill -9 число-идентификатор

Нужно узнать размер экрана Клиента. Получаем его по команде:

xdpyinfo | egrep "(dimensions|resolution)"

Запоминаем.

Запуск сервера и подключение клиента

На стороне сервера

Запуск VNC сервера на Сервере выполняется командой:

tightvncserver :1 -geometry 800x600 -dpi 96 -localhost -nolisten tcp :1

Остановка сервера:

tightvncserver -kill :1

Здесь 800×600 это размер экрана Клиента, а 96 это плотность точек полученная ранее на Сервере. Причём 96 совсем не факт, что хорошее значение. Можно поиграться +/-1 или больше, посмотреть как оно глазам будет комфортнее. Плотность точек в наибольшей степени влияет на отрисовку шрифтов. На размеры окон, линеек в разных программах влияете тоже, но к эргономике это имеет куда меньше отношения. Скорее всего есть минимум два значения: 1) когда на экране отличное изображение и размеры близки к реальным, 2) когда размеры мелки, но шрифты легко читаемы. Не исключено, что это может быть интересно для ультра малых экранов Клиента.

800×600 можно заменить на уместную величину. Обычно - чуть меньше размера экрана клиента.

Обозначение ':1' это системный идентификатор виртуального экрана. Вероятно, имеет смысл выбирать его большим. Во всяком случае, на Сервере, в момент запуска VNC службы, не должно быть других виртуальных экранов с этим номером. Номера идут от 0 для локального пользователя. Потом выделяются по мере надобности. В случае использования локального переключения пользователей единица может оказаться занятой. Можно выбрать следующий номер. Использованные номера можно увидеть в выводе команды:

ls -a /tmp/.X*-lock /tmp/.X11-unix/X*

На стороне клиента

Подключение со стороны клиента происходит в два этапа. Сначала создаётся туннель:

ssh -L 12345:localhost:5901 username@hostserver

Потом инициируется подключение к виртуальному экрану:

vncviewer  -passwd "${HOME}/.vnc/passwd.username.hostserver" localhost:12345

Если ошибок не было, то появится окно соответствующее отдельному виртуальному экрану Сервера. Внизу будет 'fbpanel', обычное меню для запуска программ и т.п.

Со стороны Клиента VNC сервер можно удалённо стартовать в одну команду:

ssh username@hostserver "tightvncserver :1 -geometry 800x600 -dpi 96 -nevershared -localhost -nolisten tcp :1" && ssh -L 12345:localhost:5901 username@hostserver

Останавливать:

ssh username@hostserver "tightvncserver -kill :1"

В файле '~/.bash_aliases' можно описать короткие синонимы этих команд:

alias vncstart-username-hostserver='ssh username@hostserver "tightvncserver :1 -geometry 800x600 -dpi 96 -nevershared -localhost -nolisten tcp :1" && ssh -L 12345:localhost:5901 username@hostserver'
alias vncclose-username-hostserver='ssh username@hostserver "tightvncserver -kill :1"'
alias vncconnect-username-hostserver='vncviewer localhost:12345 &'

При использовании '~/.bash_aliases' надо в файле '~/.bashrc' найти секцию отвечающую за синонимы и снять в ней комментарии. В итоге секция должна выглядеть так:

# Alias definitions.
# You may want to put all your additions into a separate file like
# ~/.bash_aliases, instead of adding them here directly.
# See /usr/share/doc/bash-doc/examples in the bash-doc package.
 
if [ -f ~/.bash_aliases ]; then
    . ~/.bash_aliases
fi

Как запускать программы

На Клиенте, в окне с виртуальным экраном есть все стандартные средства запуска программ в графической среде - кнопки запуска в панели, терминал. Однако, если запускать просто так, то вся обработка трёхмерных инструкций отрисовки будет выполнятся мощностями Клиента. 3D вычисления можно перенести от Клиента на мощности любого сервера программой VirtualGL.

По состоянию на февраль 2013 года невозможна простая и автоматизированная настройка VirtualGL (утилита vglserver_config) в сочетании с LightDM, см. в приложении. Это случай Ubuntu после 2011 года. После замены LightDM на GDM, например, обычные инструкции оказываются работоспособны.

Пакеты для инсталляции есть в официальных репозиториях. Можно взять по ссылке - www.virtualgl.org и установить. Я скачивал по ссылке и устанавливал, не факт, что это оптимальный выбор.

Программы на Сервере запускаются так:

vglrun имя-программы

Например:

vglrun blender
vglrun -d $DISPLAY imagination

В таком случае 3D обработка происходит на Сервере. Параметр '-d $DISPLAY' иногда нужно указывать. Возможно, необходимость зависит от сочетаний настроек в разных дистрибутивах и от версий программ.

Удобно иметь отдельные панели задач для VNC сессии. Для чего, в т.ч., нужна 'fbpanel', как отдельная панель - в ней настраиваются кнопки и меню, запускающие нужное в нужном режиме.

Тот же самый трюк пригоден для применения в случае использования X-forwarding в SSH. Причём запускать можно не программы поштучно, а сразу - FB панель. Однако, в случае X-forwarding, при отключении все программы будут закрыты, в сравнении с VNC. Но в отношении SSH работа ведётся - http://mosh.mit.edu

Какую сессию запускать

В LUbuntu можно запустить LX сессию, со всеми настройками и фичами как есть. Можно запустить OpenBox сессию с 'fbpanel' вместо 'lxpanel'. Выше упомянутый скрипт '~/.vnc/xstartup' запускает ту или иную сессию. В скрипте есть строка:

declare -r sessionId="OPENBOX"

Эта строка определяет, что при входе через VNC будет запускаться OpenBox. Можно заменить «OPENBOX» на «LUBUNTU» - будет запускаться LXDE со всеми фичами LUbuntu.

Есть заковыка - пока открыта единственная LX сессия (VNC или локальная для Сервера) - всё хорошо. Но если запущено две LX сессии, то LX панель сильно сбоит. Я думаю это всё легко настраивается, но это отдельная тема. Которая специфична для LXDE, а в Gnome или KDE будут другие приёмы. Потому сделан тупой ход - запускать совсем другую сессию: легковесную, с другими панелями - OpenBox + Fbpanel.

Кстати, для продвинутых, можно для FB панели сделать кнопку для переключения режима «скрывать автоматически». Скриптуется подмена значения в конфигурации панели и перезапуск панели. Выглядит как: нажал кнопку панель стала прячущейся, нажал второй раз - панель постоянно видна. В сочетании с «быстренько» подключился-отключился по VNC - удобно. Если на Клиенте используется LUbuntu, то LX панель можно настроить «скрывать автоматически», пристроить её в углу и каким-либо полезным содержимым, типа регулировки громкости и дополнительного меню запуска любимых программ, а основной панелью сделать FB панель. Подробнее см. Fbpanel для удалённной работы с GUI приложениями...

Запуск в полный экран без потери связи с локальной панелью клиента

VNC-клиенты позволяют запускать виртуальный экран во весь дисплей, но тогда нельзя без прикосновений к клавиатуре переключаться между удалённым виртуальным экраном и окнами существующими на экране Клиента. В режиме «не разворачивать на весь экран» обычные VNC-клиенты имеют заголовок окна, меню - на них уходит чувствительно много места. Утилита 'devilspie' в сочетании с 'vncviewer' позволяют отыграть максимум места, сохраняя возможность не касаясь клавиатуры мышкой переключаться между локальными и удалёнными окнами. Здесь же начинает играть заметную роль возможность быстро переключать локальную панель задач Клиента в режим «скрывать автоматически», что является преимуществом для 'fbpanel' перед 'lxpanel'.

Утилита 'devilspie' позволяет манипулировать окнами, их обрамлением. Можно для Клиента убрать обрамление окна с виртуальным экраном и выбрать значение параметра запуска VNC сервера такое, что окно с виртуальным, удалённым экраном аккуратно впишется в свободное пространство на «рабочем столе». При этом сохраняется возможность перемещения этого окна - нажать Alt+пробел и перемешать стрелками курсора, конец перемещения - кнопка Enter. Система запоминает положение окна, при следующих запусках окно будет там же, где было перед выключением.

Утилита 'devilspie' должна быть предварительно запущена: в автозапуск - в каталог '~/.config/autostart' - добавляется файл 'devilspie-start.desktop'. Содержимое файла:

~/.config/autostart/devilspie-start.desktop
[Desktop Entry]
Type=Application
Name=Devilspie starter
Exec=devilspie -a

Требуется выход-вход в систему или перезагрузка, чтобы запущенная 'devilspie' начала обрабатывать указанные ей окна. Или достаточно руками перезапустить саму утилиту:

killall -9 devilspie ; nohup devilspie -a 1>/dev/null 2>/dev/null &

Окна для обработки 'devilspie' выбирает согласно своим конфигурационным файлам. Например, для окна с заголовком «TightVNC: userName's X desktop (hostName:1)» в каталоге '~/.devilspie/' нужно поместить файл 'xVNCviewer-window.ds' c содержимым:

~/.devilspie/xVNCviewer-window.ds
; generated_rule xVNCviewer-window
; Ниже регулярное выражение:        ^TightVNC: [a-zA-Z0-9]+[']{1}s X desktop [(]{1}[a-zA-Z0-9:]+[)]{1}$
; соответствует реальной сроке:     TightVNC: userName's X desktop (hostName:1)
( if
( begin
( matches (window_class ) "^TightVNC: [a-zA-Z0-9]+[']{1}s X desktop [(]{1}[a-zA-Z0-9:]+[)]{1}$" )
( matches (application_name ) "^TightVNC: [a-zA-Z0-9]+[']{1}s X desktop [(]{1}[a-zA-Z0-9:]+[)]{1}$" )
( matches (window_name) "^TightVNC: [a-zA-Z0-9]+[']{1}s X desktop [(]{1}[a-zA-Z0-9:]+[)]{1}$" )
)
( begin
( undecorate )
( geometry "+2+2" )
( println "match" )
)
)

Эта конфигурация приводит к удалению обрамления соответствующего окна. Есть утилита 'gdevilspie' - графический интерфейс для создания этих конфигураций.

Документация автора на регулярные выражения никакая (та что в man), но в сети можно найти примеры: foosel.org/linux. Здорово, если кто поймёт и напишет сюда какие конкретно регулярные выражения задействованы. Правила рег.выражений рознятся в разных языках программирования и утилитах. Этот диалект я не опознал, вероятно надо лезть в исходные коды и там прямой ответ - по именам функций и названию языка найдётся вся документация.

Вместо регулярных выражений можно просто вписать в кавычках точную строку-название окна программы. Но тогда придётся создать по набору правил отдельно на каждый возможный заголовок окна…

Правила ufw

Для защиты сервера от перебора паролей к SSH и от внешних подключений к VNC серверу полезно применить брандмауэр. Например, 'ufw'. Вот команды для защиты:

sudo ufw limit 22/tcp
sudo ufw deny in on eth0 from any to any port 5901
sudo ufw limit in proto tcp from lo to 127.0.0.1 port 5901
sudo ufw deny from any to any
sudo ufw enable

Имя 'eth0' надо заменить на имя вашего сетевого интерфейса. Если интерфейсов много, то для каждого должно быть отдельное правило. Список интерфейсов можно увидеть в выводе команды:

ip a

Поскольку есть правила с действием 'limit', то вполне легальные, но слишком частые попытки подключиться вызовут временную блокировку Клиента на Сервере. Надо подождать пару минут - автоматически разблокируется. Факты блокировок можно увидеть в фале '/var/log/ufw.log'. Это вполне обыденная защита, не позволяющая вводить пароль чаще единиц раз в минуту. При таком условии подбор сложного пароля или ключа становится нереален.

Литература

Приложения

Проблема с VirtualGL и LightDM

В настоящее время утилита 'vglserver_config' для конфигурации среды VirtualGL сервера не умеет правильно создавать настройки, в случае использования LightDM. Именно это сочетание есть в Ubuntu 12.04 и др. (после 2011 года). ( Исправлено в версии VirtualGL 2.3.2: vglserver_config should now work properly with LightDM.)

Типичный вывод утилит в консоли:

user@host $ glxinfo
...
Xlib:  extension "GLX" missing on display "localhost:10.0".
...
user@host $ vglrun glxinfo   
[VGL] NOTICE: Automatically setting VGL_CLIENT environment variable to
[VGL]    192.168.0.3, the IP address of your SSh client.
No protocol specified
No protocol specified
[VGL] ERROR: Could not open display :0.

Это поправимо, надо заменить LightDM на что ещё. GDM как замена - неплохой выбор. Для замены останавливается сервис 'lightdm', инсталлируется 'gdm', запускается сервис 'gdm', выполняется 'sudo vglserver_config'. В процессе установки 'gdm' будет предложено выбрать, что использовать: LightDM или GDM. Надо выбрать GDM.

Более подробные инструкции выходят за рамки этой статьи. Предлагаю использовать, как источник информации, публикацию http://sourceforge.net/tracker/?func=detail&aid=3543408&group_id=117509&atid=678327

Нужно предупредить. Настройка внешнего вида GDM выполняется просто, но только если заранее знать как. Для LUbuntu почти рабочее решение для замены фоновой картинки описано тут: http://smashingweb.info/change-the-background-of-gnome-3-gdm-login-screen/ В процессе будут сообщения об отсутствии прав доступа к каталогам - да, для пользователя 'gdm' нужно разрешить доступ к этим файлам, чтение и запись. Есть другие способы, но они часто расчитаны на графические инструменты полновесного Gnome, требуют компонент Gnome, которые в LUbuntu отсутствуют.

Ещё одно предупреждение: ошибки при замене LightDM на что-то ещё, ошибки в вообще настройке display manager могут привести к временной потере автоматического запуска графической среды. Тренируйтесь в виртуальных машинах, если есть неуверенность в результате.

Файл конфигурации Fbpanel

~/.config/fbpanel/vnc-fbpanel.conf
Global {
    edge = bottom
    allign = center
    margin = 0
    widthtype = percent
    width = 100
    height = 48
    transparent = true
    tintcolor = #0e0e0e
    alpha = 150
    setdocktype = true
    setpartialstrut = true
    autohide = false
    heightWhenHidden = 2
    roundcorners = false
    roundcornersradius = 7
    layer = none
    MaxElemHeight = 24
}
Plugin {
    type = space
    config {
        size = 2
    }
}
Plugin {
    type = menu
    config {
        IconSize = 22
        icon = start-here
        systemmenu {
        }
        separator {
        }
        menu {
            name = Computer
            icon = computer
            item {
                name = Terminal
                icon = terminal
                action = lxterminal
            }
            item {
                name = Lock Display
                icon = gnome-lockscreen
                action = xscreensaver-command -lock
            }
            item {
                name = Suspend
                icon = xfpm-suspend
                #action = 
                action = zenity --info --text "This command is blocked in panel for VNC session."
            }
            item {
                name = Hibernate
                icon = xfpm-hibernate
                #action = 
                action = zenity --info --text "This command is blocked in panel for VNC session."
            }
            separator {
            }
            item {
                name = Reboot
                icon = gnome-session-reboot
                #action = 
                action = zenity --info --text "This command is blocked in panel for VNC session."
            }
            item {
                name = Shutdown
                icon = gnome-session-halt
                #action = 
                action = zenity --info --text "This command is blocked in panel for VNC session."
            }
            separator {
            }
            item {
                name = Logout
                icon = gnome-session-logout
                #action = /bin/bash -c "sync && openbox --exit"
                #action = lxsession-logout
                action = zenity --info --text "This command is blocked in panel for VNC session."
            }
        }
    }
}
Plugin {
    type = space
    config {
        size = 5
    }
}
Plugin {
    type = launchbar
    config {
        button {
            icon = terminal
            tooltip = Terminal
            action = lxterminal
        }
        button {
            icon = system-file-manager
            tooltip = PCManFM file manager
            action = pcmanfm
        }
    }
}
Plugin {
    type = space
    config {
        size = 5
    }
}
Plugin {
    type = taskbar
    expand = true
    config {
        ShowIconified = true
        ShowMapped = true
        ShowAllDesks = false
        tooltips = true
        IconsOnly = false
        MaxTaskWidth = 300
    }
}
Plugin {
    type = space
    config {
        size = 15
    }
}
Plugin {
    type = wincmd
    config {
        icon = gnome-fs-desktop
        tooltip = Left click to iconify all windows. Middle click to shade them.
    }
}
Plugin {
    type = pager
    config {
        showwallpaper = true
    }
}
Plugin {
    type = space
    config {
        size = 2
    }
}
Plugin {
    type = mem
    expand = false
    padding = 2
    config {
        ShowSwap = false
    }
}
Plugin {
    type = space
    config {
        size = 2
    }
}
Plugin {
    type = cpu
    config {
        Color = green
    }
}
Plugin {
    type = space
    config {
        size = 3
    }
}
Plugin {
    type = tray
}
Plugin {
    type = space
    config {
        size = 3
    }
}
Plugin {
    type = tclock
    config {
        ClockFmt = <span font="Ubuntu Condensed 18" color="#ffffff"><b>%H:%M</b></span>&#xA;<span font="Ubuntu Condensed 12" color="#ffffff">%a/%d</span>
        TooltipFmt = %A %x
        Action = xmessage Please define some command &
        ShowCalendar = true
        ShowTooltip = true
    }
}
Plugin {
     type = space
     config {
          size = 1
     }
}

Файл запуска графической сессии

bash ~/.vnc/xstartup
#!/bin/bash
 
# Put this content into ~/.vnc/xstartup
# Do chmod +x ~/.vnc/xstartup
 
declare -r sessionId="OPENBOX"
 
#Uncommment this line if using Gnome and your keyboard mappings are incorrect.
#export XKL_XMODMAP_DISABLE=1
 
# Здесь принудительно определяются настройки локализации.
# Предпочитаемый язык для приложений, язык для сообщений,
# национальный формат даты, способы сортировки и др.
# Эти праметры влияют на возможность ввода символов национального
# алфавита - т.е. на русском. См. 'man locale' и по ссылкам оттуда.
export LANG=en_US.UTF-8
export LC_CTYPE="ru_RU.UTF-8"
export LC_NUMERIC="ru_RU.UTF-8"
export LC_TIME="ru_RU.UTF-8"
export LC_COLLATE=C
export LC_MONETARY="ru_RU.UTF-8"
export LC_MESSAGES="en_US.UTF-8"
export LC_PAPER="ru_RU.UTF-8"
export LC_NAME="ru_RU.UTF-8"
export LC_ADDRESS="ru_RU.UTF-8"
export LC_TELEPHONE="ru_RU.UTF-8"
export LC_MEASUREMENT="ru_RU.UTF-8"
export LC_IDENTIFICATION="ru_RU.UTF-8"
export LC_ALL=
 
# Здесь можно задать прочие переменные окружения:
export BROWSER=firefox
 
# Load X resources (if any)
[ -e "${HOME}/.Xresources" ] \
    && xrdb "${HOME}/.Xresources"
 
case "${sessionId}" in
OPENBOX)
    if which openbox-session >/dev/null ; then
        ssh-agent openbox-session &
    fi
    break
;;
LUBUNTU)
    if which startlubuntu >/dev/null ; then
        ssh-agent startlubuntu &
    fi
    break
;;
GENERIC)
    xsetroot -solid "#DBB183"
    x-terminal-emulator -geometry "80x24+10+10" -ls -title "VNCDESKTOP" &
    x-window-manager &
    break
;;
esac

Ссылки