Raspberry Pi как информационное табло — с помощью VNC на localhost

в 15:55, , рубрики: Без рубрики

Идея использовать одноплатный миникомпьютер Raspberry Pi в качестве информационного табло не нова, однако, как мне кажется, раскрыта далеко не полностью. Одним из не достаточно раскрытых аспектов, по моему мнению, является ограничение доступа. Безусловно, самым надежным способом ограничения доступа является физическое ограничение — для каких-нибудь публичных табло (к примеру на остановках маршрутного транспорта) такое ограничение необходимо, иначе не избежать вандализма, краж (если не самого Raspberry Pi то как минимум SD карты) или «спуффинга» (путем подмены той же SD карты).

Но предположим что речь идет не о совсем публичном табло, а о таком, которое расположенном внутри офиса какой-нибудь компании — к примеру о «билд мониторе» для отображения статуса билдов на каком-нибудь Дженкинсе или ТимСити. Было бы неплохо ограничить возможность молодым горячим джуниорам открывать на билд мониторе порносайты. Об этом и пойдет речь.

Т.к. информационное табло работает, вероятно, не в режиме терминала, а с GUI, для управления ним логично использовать VNC (с ssh туннелем для пущей безопасности). Суть освновной идеи вкратце сводится к тому, что для отображения информации на табло можно использовать VNC viewer в view-only режиме, запущенный от имени пользователя с ограниченными правами. Таким образом подключив к Малинке клавиатуру и мышь нельзя будет «просто так взять» и помешать работе вашего табло. Конечно, знатоки линуксов всегда найдут обходные пути, но по крайней мере пользователей Windows это гарантированно отпугнет (-:

Тоесть вкратце задача сводится к следующему — при запуске Raspberry Pi:

  • Автоматически запускать VNC сервер от имени заданного пользователя (хотя бы того же pi);
  • Автоматически запускать VNC просмотрщик, настроенный на отображение происходящего на локальном VNC сервере, от имени заданного ограниченного пользователя (какого-нибудь guest);
  • Автозапуск какого-нибудь софта, отображающего собственно контент (например, веб-браузера показывающего Дженкинс), и отключение скринсейвера.

Сразу оговорюсь — знатоком Линукс я ни в коей мере не являюсь, поэтому подход может быть неполноценным и «нубским» — за это сразу прошу прощения. Инструкция составлялась по принципу «с миру по нитке» на основе других инструкций — так сказать «от нубов для нубов». Вобщем ногами не бейте плз.

И еще одна ремарка — в данной статье предполагается использование Raspbian (Debian Wheezy) в качестве ОС для Raspberry Pi.

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

Часть нулевая

Раздобываем где-нибудь Raspberry Pi, создаем загрузочную SD карту с Raspbian, запускаем Raspberry, меняем пароль пользователя pi, настраиваем параметры сети и все такое прочее. Информации об этих вещах в сети предостаточно, поэтому в данной статье мы не будем их разбирать. Не забудьте только включить доступ по SSH (это можно сделать прямо в штатной утилите настройки raspi-config).

Часть первая — Установка VNC

Устанавливаем Tight VNC server и Tight VNC viewer:
sudo apt-get install tightvncserver<br/>
sudo apt-get install xtightvncviewer

Делаем автозапуск VNC сервера:
Создаем файл /etc/init.d/vncboot с помощью текстового редактора nano (думаю разобратся с ним будет не сложно даже если вы видите его впервые).
sudo nano /etc/init.d/vncboot

Заполняем файл следующим контентом:
#!/bin/sh<br/>
# /etc/init.d/tightvncserver<br/>
# Customised by Stewart Watkiss<br/>
#http://www.penguintutor.com/linux/tightvnc<br/>
# Set the VNCUSER variable to the name of the user to start tightvncserver under<br/>
VNCUSER='pi'<br/>
eval cd ~$VNCUSER<br/>
case "$1" in<br/>
start)<br/>
su $VNCUSER -c '/usr/bin/tightvncserver -localhost -geometry 1000x760 :1'<br/>
echo "Starting TightVNC server for $VNCUSER "<br/>
;;<br/>
stop)<br/>
pkill Xtightvnc<br/>
echo "Tightvncserver stopped"<br/>
;;<br/>
*)<br/>
echo "Usage: /etc/init.d/tightvncserver {start|stop}"<br/>
exit 1<br/>
;;<br/>
esac<br/>
exit 0

Ремарки:

  • здесь в VNCUSER='pi' указано имя пользователя под которым будет запущен VNC сервер. При желании можно сменить pi на другого пользователя.
  • т.к. VNC протокол сам по себе не очень безопасен, в параметрах запуска VNC сервера прописан "-localhost" — таким образом к нему можно приконнектится только с localhost, либо через SSH туннель. Если вам это не нужно, и вы хотите коннектится в VNC напрямую — можете убрать "-localhost"
  • подстройте параметр "-geometry" под размеры вашего монитора. Во избежание появления скроллеров в VNC просмотрщике советую поставить несколько меньшую ширину и высоту, например 1000x760 для мониторов, работающих в режиме 1024x768.

Сохраняем файл, выходим из nano, исполняем следующие комманды:
sudo chmod 755 /etc/init.d/vncboot<br/>
sudo update-rc.d vncboot defaults

Результат второй комманды должен выглядет так: "update-rc.d: using dependency based boot sequencing".

Теперь VNC сервер будет запускатся автоматически при старте Raspberry, но ему еще нужно указать пароли.
Для этого запустите комманду tightvncpasswd от имени того пользователя, под которым будет запускатся VNC сервер. В нашем случае это пользователь pi:
tightvncpasswd

Задайте разные пароли для контроля и для отображения (view password). Пароль для отображения может быть простым, допустим 123123.

Для проверки работоспособности перезапустите Raspberry и попробуйте приконнектится к VNC серверу.

Для создания SSH туннеля можно воспользоватся следующей коммандой: "ssh pi@айпи-малины -L 5901:localhost:5901 -N -f" — запускать ее следует не на Raspberry, а на той машине, с которой вы коннектитесь (для Windows погуглите как сделать SSH туннель через Putty (-: ), после чего смело коннектитесь VNC клиентом на localhost с display = 1, и вводите пароль, который вы задали для VNC сервера.

Часть вторая — автозапуск VNC просмотрщика

Для начала создадим пользователя, от имени которого просмотрщик будет запускатся.
sudo useradd guest<br/>
sudo mkdir /home/guest<br/>
sudo chown guest /home/guest<br/>
sudo cp /home/pi/.profile /home/guest/<br/>
sudo chown guest /home/guest/.profile<br/>
sudo chmod +x /home/guest/.profile<br/>

И зададим ему какой-нибудь пароль (хотя может это и лишнее)
sudo passwd guest

Создадим файл .bashrc в домашней директории пользователя guest
sudo nano/home/guest/.bashrc

Заполним файл таким контентом:
startx

Сохраняем файл, закрываем nano. Запускаем комманды:
sudo chown guest /home/guest/.bashrc<br/>
sudo chmod +x /home/guest/.bashrc

Теперь создадим еще файл .xsession в домашней директории пользователя guest
sudo nano/home/guest/.xsession

Заполним файл таким контентом:
echo 123123 | xvncviewer -shared -viewonly -autopass :1

Здесь 123123 это view-пароль для VNC сервера который мы задавали в предыдущей части. Если у вас он отличается — впишите свой.

Сохраняем файл, закрываем nano, исполняем комманды:
sudo chown guest /home/guest/.xsession<br/>
sudo chmod +x /home/guest/.xsession

Ремарка: возможно у пользователя guest нужно отобрать права на редактирование его .xsession, .profile и .bashrc файлов, и вообще посильнее ограничить, но я пока с этим не разобрался. Буду рад конструктивным замечаниям.

Итого при логине под юзером guest у нас автоматически запустится VNC просмотрщик, который покажет нам то, что происходит на VNC сервере. Но нам еще нужно сделать так, чтоб Raspberry автоматически логинился под юзером guest при запуске. Для этого делаем следующее:
sudo nano /etc/inittab

Находим в файле строку "1:2345:respawn:/sbin/getty 115200 tty1" и заменяем ее на такую "1:2345:respawn:/bin/login -f guest tty1 </dev/tty1 >/dev/tty1 2>&1" (без кавычек). Сохраняем файл, закрываем nano.

Теперь можно перезапустить Малинку и убедится что все работает — при старте мы видим десктоп на котором происходит все то, что мы делаем на VNC сервере (смотрите в конец первой части если вы забыли как порулить происходящим на VNC сервере).

Часть третья — автозапуск браузера и отключение скринсейвера

Для raspbian есть порты Chromium и IceWeasel (форк Firefox), можно установить любой на выбор или оба сразу:
sudo apt-get install crhomium<br/>
sudo apt-get install iceweasel

Для того, чтоб браузер запускался автоматически, редактируем файл /etc/xdg/lxsession/LXDE/autostart
sudo nano /etc/xdg/lxsession/LXDE/autostart
Добавляем в конце строку
@chromium
Либо: @iceweasel
Либо что-нибудь другое если вы хотите запускать не браузер.

Часть четвертая — отключаем скринсейверы

Оказалось что задача эта не так проста как кажется — через какое-то время неактивности клавиатуры/мыши (которые у меня лично в Малину вообще не включены, т.к. все делается по SSH, и которые для подвешенного где-нибудь под потолком информационного табло определенно не будут включены) экран все время гасне, и как-то сложно разобратся кто же за это отвечает. Поэтому если я здесь что-то упустил — опять же буду рад комментариям.

Для начала редкатируем /etc/lightdm/lightdm.conf
sudo nano /etc/lightdm/lightdm.conf
Находим строку "#xserver-command=X" идущую где-то после строки "[SeatDefaults]", и заменяем ее на такое "xserver-command=X -s 0 -dpms" (без кавычек). Сохраняем, закрываем.

Потом, ставим x11-xserver-utils:
sudo apt-get install x11-xserver-utils

И создаем .xinitrc файл в домашнем каталоге пользователя guest:
sudo nano /home/guest/.xinitrc

Наполняем его следующим содержимым:
xset s off # don't activate screensaver<br/>
xset -dpms # disable DPMS (Energy Star) features.<br/>
xset s noblank # don't blank the video device<br/>

Сохраняем, закрываем. Запускаем:
sudo chown guest /home/guest/.xinitrc<br/>
sudo chmod +x /home/guest/.xinitrc<br/>

Все, дело сделано.

Подвешиваем нашу малину с монитором где-нибудь под потолком, открываем в браузере нужную страницу (не забываем настроить браузер так, чтоб при перезапуске страницы переоткрывались), и наслаждаемся результатом.

Автор: Sauron

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js