IT
March 11, 2025

VNC on ubuntu server

Сидел я вчера, и думал, что еще интересное можно придумать с ubuntu server(я свой старый пк использую как сервер). Вспомнил о существовании такой технологии как vnc, которая позволяет "транслировать" экран с одной системы в другую. Никогда до того момента, я не настраивал vnc, и первым делом полез в chatgpt, чтобы спросить как это делается, он выдал мне +- рабочее решение, но не во всем. Начнем с обновления репозиториев и установки рабочего окружения и самого vnc сервера.

sudo apt update && sudo apt install xfce4 xfce4-goodies xorg dbus-x11 x11-xserver-utils

Chatgpt посоветовал мне установить Tigervnc, ну я не стал спроить и поставил его.

sudo apt install tigervnc-standalone-server

Дальше он предложил поставить пароль, и кто мы такие, чтобы его не поставить

vncpasswd

И дальше можно уже запустить его, однако, я использовал эту команду для проверки

vncserver -localhost no :1
После запуска VNC-сервер будет работать на порту 5901 (потому что :1 → 5900 + 1).

Дальше, я изменил команду, чтобы можно было подключться, не только с localhosно и локальной сети, также добавил глубину цвета, разрешения экрана, и чтобы он запускался на 0.0.0.0

vncserver -interface 0.0.0.0 :1 -fg -localhost no -geometry 1920x1080 -depth 24

Но каждый раз запускать его ручками не очень удобно, вспоминать команду, в линуксе как никак есть сервисы, которые позволяют удобно запускать те или иные программы в фоне. Я создал сервис для vncserver по стандартному пути /etc/systemd/system/vncserver.service

[Unit]
Description=Start TigerVNC server
After=syslog.target network.target

[Service]
Type=simple
WorkingDirectory=/home/kill_your_soul
User=kill_your_soul
Group=kill_your_soul
Environment=HOME=/home/kill_your_soul
ExecStartPre=-/bin/sh -c "/usr/bin/vncserver -kill :1 > /dev/null 2>&1"
ExecStart=vncserver -interface 0.0.0.0 :1 -fg -localhost no -geometry 1920x1080 -depth 24
ExecStop=/usr/bin/vncserver -kill :1

[Install]
WantedBy=multi-user.target

Вот такой сервис у меня получился, тут из интересного — это команда остановки, которая все той же командой убивает vncserver, который работает на 5901 порту, и перенаправляет весь вывод в поток /dev/null

Но запускать каждый раз ручками этот сервис, я не хочу, и попросил написать chatgpt скрипт на bash, который будет стартовать и останавливать сервис vncserver, не с первой попытки, но получился скрипт, который меня устроил.

#!/bin/bash

# Имя сервиса
SERVICE="vncserver.service"

# Функция для старта сервиса
start_vnc() {
    echo "Запуск сервиса $SERVICE..."
    sudo systemctl start $SERVICE
    echo "Сервис $SERVICE успешно запущен."
}

# Функция для остановки сервиса
stop_vnc() {
    echo "Остановка сервиса $SERVICE..."
    sudo systemctl stop $SERVICE
    echo "Сервис $SERVICE успешно остановлен."
}

# Проверка аргумента
case "$1" in
    start)
        start_vnc
        ;;
    stop)
        stop_vnc
        ;;
    *)
        echo "Использование: $0 {start|stop}"
        exit 1
        ;;
esac

В принципе это универсальный скрипт, который легким движением руки будет запускать и останавливать сервис.

Ну и итог, как выглядит сам vnc. Так подключаемся к нему

Подключение

А вот и сам рабочий стол сервера

Рабочий стол

Some refs: