[Перевод] Кунг-фу стиля Linux: расшаривание терминала в браузере
В заголовке этого материала уже сказано о самой главной возможности программы, о которой я хочу рассказать. Речь идёт о GoTTY. Эта программа позволяет организовывать общий доступ к приложениям командной строки через браузер. Это — простой веб-сервер, написанный на Go. Он запускает программы, не обладающие графическим пользовательским интерфейсом, и умеет так представить их данные, пользуясь сокетами, что оказывается возможным показать результаты их работы в браузере. GoTTY, кроме того, может даже позволить пользователю взаимодействовать с такими программами.
В наши дни все помешаны на безопасности. Поэтому идея о «расшаривании терминала» вполне может вас насторожить. Да и, в конце концов, кому понадобится пользоваться командной оболочкой Linux через браузер? Но сразу хочу сказать, что беспокоиться вам особо не о чем. Хотя это и возможно, а иногда и полезно, реальная ценность GoTTY заключается в возможности запуска некоторых программ, работающих в командной строке, и в выводе генерируемых ими данных в окно браузера. Вот пример использования подобной системы. Вам нужно, чтобы пользователи могли бы удалённо мониторить систему, используя утилиту top
(или, если хотите, htop
). Но при этом вам не нужно, чтобы пользователям приходилось бы логиниться в системе. Вам, кроме того, хотелось бы, чтобы они могли бы работать без необходимости установки ssh-клиентов. При этом устанавливать дополнительные средства мониторинга вам тоже ни к чему. Вас вполне устроят стандартные инструменты.
Если можно взять данные, выводимые командой top
, и показать их в окне браузера — даже если у пользователей не будет возможности взаимодействовать с программой — это уже будет решением задачи. И решением очень простым. Представьте, что вы можете просто запустить top
в пакетном режиме, собрать выходные данные и записать их куда-то, где их может найти веб-сервер. Это возможно, но, конечно, если только на компьютере установлен веб-сервер. А теперь давайте представим, что, вдобавок к вышеописанному, вам ещё хотелось бы иметь возможность передачи командам опций, или что вам ещё нужно организовать особый режим работы, позволяющий аутентифицированных пользователям (хочется надеяться, что только им) взаимодействовать с программой. Решение подобной задачи уже окажется далеко не таким простым, как простой сбор данных, выдаваемых некоей утилитой. Но с помощью GoTTY и эту задачу решить довольно-таки просто.
Установка
Инструкции по установке GoTTY можно найти в GitHub-репозитории проекта. Правда, если Go у вас уже установлен, легче всего установить GoTTY так:
go get github.com/yudai/gotty
Эта команда помещает программу в директорию Go с бинарными файлами, которая, возможно, не упомянута в вашей переменной PATH
. В моём случае это — директория ~/go/bin
. Путь к этой директории можно добавить в PATH
самостоятельно. Ещё можно каждый раз при запуске программы указывать полный путь к ней, можно создать псевдоним или сделать символическую ссылку в каком-нибудь месте, описанном в PATH
.
Проверка
Начнём с простой проверки. Выполним такую команду:
gotty top
Проверка GoTTY
Вот и всё. Теперь GoTTY даёт доступ к выходным данным top
на порте 8080
локального компьютера. При этом управлять работой top
через браузер нельзя. То есть — нельзя, скажем, останавливать процессы или делать что-то подобное. Если вам нужно использовать какие-то опции при запуске top
, или если вы, например, хотите запустить htop
, вам нужно будет изменить команду запуска gotty
. На обычной картинке этого не видно, но данные в окне браузера обновляются, всё выглядит так же, как в обычном терминале.
Сервер gotty
будет работать до тех пор, пока вы не остановите соответствующий процесс. Если вы не запустили сервер в виде фонового процесса, то для его остановки достаточно воспользоваться комбинацией клавиш CTRL + C
. А если кто-то в этот момент ещё подключён к серверу, то придётся воспользоваться двумя нажатиями этой комбинации клавиш. Конечно, gotty
поддерживает различные опции. Например, изменить порт можно с помощью опции -p
, а адрес — с помощью опции -a
. Ещё можно создавать собственные index-файлы и заголовки. Можно даже пользоваться URL, в которых имеются аргументы командной строки, хотя, если вы прибегните к этой возможности, не забывайте о безопасности. Документация по программе имеется в её репозитории. Кроме того, в gotty
есть и встроенная справка.
Шифрование и аутентификация
В вышеописанном случае, вероятно, можно не особенно волноваться о том, что некий неизвестный пользователь интернета увидит то, что выдаёт команда gotty
. А если компьютер, на котором работает gotty
, находится в закрытой сети, за файрволом, то неизвестно кто попросту не сможет к нему подключиться. Для некоторых вариантов применения gotty
подобного уровня безопасности может быть вполне достаточно. Но, например, если мы позволим тем, кто просматривает страницу, выдаваемую gotty
, взаимодействовать с системой, если воспользуемся при запуске программы опцией -w
, то, например, посетитель страницы сможет удалённо останавливать процессы. Не могу сказать, что в восторге от перспективы публикации в интернете страницы, дающей тем, кто её смотрит, такие возможности.
Для того чтобы сделать работу с gotty
немного безопаснее, программу можно запустить с опцией -r
. Это приводит к использованию в URL случайных символов, а значит, кто угодно уже не сможет найти соответствующую страницу. Но нам этот вариант не особенно интересен. Мы прибегнем к чему-нибудь более продвинутому. Например — к использованию опции -c
, которая включает базовые механизмы аутентификации.
Минус использования опции -c
заключается лишь в том, что все данные (и те, что передаются при аутентификации пользователя, и те, что передаются в браузер и из браузера) не скрыты от любопытных глаз. Это нас не устроит. Но у gotty
имеется ещё опция -t
, которая позволяет включить TLS/SSL. Для её использования, конечно, понадобится настроить соответствующие сертификаты. Подробности о подобном варианте использования программы ищите в её репозитории.
На самом деле, прежде чем расширять возможности посетителей страницы, выдаваемой gotty
, нужно очень хорошо подумать о безопасности. Например, давайте посмотрим на следующую команду, выглядящую, вроде бы, совершенно безобидной:
gotty -w emacs -nw /tmp/notes.txt
Файл, открытый в emacs с помощью gotty
Мы вполне можем позволить пользователям редактировать файл через браузер, всё при таком подходе работает совершенно нормально. Но что если они знают о том, что могут ещё и открывать и редактировать другие файлы? Они даже могут запустить командную оболочку! Это уже опасно. Если говорить о программе, такой же гибкой, как emacs
, то, вероятно, можно додуматься до того, как ограничить подобные действия. Но прежде чем пользоваться чем-то подобным, нужно быть совершенно уверенным в том, что «закрыты» все «дыры». Если всё устроено безопасно, если пользователи аутентифицируются, а данные шифруются, это будет не хуже, чем позволить кому-то запустить emacs
через ssh
. Но, как обычно, в подобных вещах надо проявлять осторожность.
Работа в условиях, когда страница открыта у нескольких пользователей
Ещё одна проблема при работе с gotty
может проявиться в том случае, если к серверу подключено несколько клиентов. У gotty
имеется опция --once
, использование которой приводит к тому, что программа работает с единственным пользователем, а затем, после разрыва соединения, завершается. Но на GitHub есть примеры использования tmux
и Docker для организации работы каждого пользователя в единственной сессии или для создания новой сессии для каждого пользователя.
С помощью tmux
можно даже «выпустить» в браузер свою текущую настольную сессию, что иногда может оказаться очень кстати. В документации советуют привязать эту возможность к сочетанию клавиш CTRL + T
:
# Запуск GoTTY в новом окне с использованием сочетания клавиш C-t
bind-key C-t new-window "gotty tmux attach -t `tmux display -p '#S'`"
О работе с командной оболочкой
Если вам нужна командная оболочка, а не возможность работы с некой программой, то вы можете взглянуть в сторону ssh-приложения для Chrome, или какого-то другого способа открытия ssh-терминала в окне браузера. В конце концов, ssh
— это золотой стандарт в сфере аутентификации пользователей и шифрования трафика. При таком подходе можно даже получить возможности, схожие с теми, что даёт GoTTY, если, например, создать особого пользователя, при входе которого в систему выполняется некий скрипт. Но будьте осторожны. Каждый раз, когда вы даёте пользователям возможность удалённого запуска программ, вы тем самым увеличиваете вероятность того, что запущено будет что-то такое, запуска чего вы не ожидали.
Ещё один вариант — использование Xpra. Этот проект позволяет расшаривать в браузере приложения с графическим интерфейсом. В состав этих приложений входит и Xterm, и другие программы для работы с терминалом. При работе с Xpra, правда, могут возникнуть те же проблемы, касающиеся безопасности, что и при работе с GoTTY.
GoTTY — это один из тех проектов, которые предназначены для решения довольно узкого круга задач. Но если вам нужно то, что умеет GoTTY, то вы, с помощью этой программы, сможете легко решить те задачи, которые, без неё, решить очень непросто. Полагаю, GoTTY — это полезное дополнение к набору инструментов того, кто работает в Linux.
Планируете ли вы пользоваться GoTTY?