Как стать автором
Обновить

Удалённое парное программирование с использованием GNU Screen

Время на прочтение4 мин
Количество просмотров6K
Автор оригинала: Dalibor Nasevic
Перевод этой статьи может послужить хорошей пошаговой инструкцией для тех, кто регулярно пользуется парным программированием, или хотя бы совместным просмотром кода, и при этом знаком и готов использовать текстовые редакторы, работающие в текстовом режиме (Emacs, vi и т.п.). В статье дано много интересных ссылок, советую по ним пробежать глазами, а первый комментарий содержит ссылку на аналогичный опыт, но с более чистым аналогом GNU Screen — tmux.

У нас в Siyelo две распределённых команды, одна в Кейптауне, вторая в Скопье. Нам приходится придумывать, как заниматься удалённым парным программированием между офисами. Существует много возможностей (отличный обобщающий пост здесь).
Раньше мы постоянно пользовались Skype'ом для разделения экрана, но у нас при этом возникали следующие проблемы:

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


Мы недавно экспериментировали с Google+ Hangouts и, хотя и обнаружили у него те же самые недостатки, предпочли его для аудио- и видеоконференций. Но что нам действительно нужно от инструмента парного программирования, так это совместное редактирование кода в реальном времени.

Решение: screen. У Screen есть много полезных сценариев использования, но в этой статье мы сконцентрируемся на следующих двух:

— только для чтения: удобно в качестве разделения экрана одной стороной без возможности вмешательства другой
— дозволяющая: удобно для совместного программирования

Ниже о том, как запустить оба сценария. Замечание: недостаток таких интрументов, как screen, это то, что всем участникам нужно уметь использовать редактор, который запускается в терминале. К счастью, мы все любим vim.

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

sudo apt-get install openssh-server

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

sudo useradd -s /bin/rbash guest
sudo passwd guest
sudo mkdir /home/guest

Далее, нам нужно задать профиль гостевого аккаунта. Добавьте следующее в /home/guest/.profile:

trap "" 2 3 19 # не давать пользователю выйти в оболочку
clear
echo «Добро пожаловать в сессию парного программирования»
echo -n «Нажмите Enter, чтобы продолжить» && read
screen -x dalibor/pairprog
exit

Здесь, как вы можете заметить, «screen -x dalibor/pairprog» автоматически подключит гостя к сессии с кодом «pairprog», которая запущена пользователем «dalibor».

Далее нам нужно установить screen на принимающей стороне (на всякий случай, если его ещё там нет):

sudo apt-get install screen

По соображениям безопасности, screen по умолчанию установлен так, что пользователи системы не могут подсоединиться к сессиям других пользователей (сообщение об ошибке «Must run suid root for multiuser support.»). Чтобы разрешить другим пользователям подсоединяться нужно запустить следующее (нужно подправить путь к screen):

sudo chmod +s /usr/bin/screen
sudo chmod 755 /var/run/screen

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

Далее нужно добавить следующие строки в конфигурационный файл ~/.screenrc:

hardstatus on
hardstatus alwayslastline
startup_message off
termcapinfo xterm ti@:te@
hardstatus string "%{= kG}%-w%{.rW}%n %t%{-}%+w %=%{..G} %H %{..Y} %m/%d %C%a "
screen -t bash1 1

# multiuser setup
multiuser on
aclchg guest -wx "#,?"
aclchg guest +x «colon,wall,detach»

Самое важное здесь это «multiuser on», который позволяет нескольким пользователям одновременно подключаться к сессии и «aclchg», которая снимает все ограничения на запись и исполнения для всех окон (#) и комманд (?) гостевого пользователя. Сконфигурировав это так, принимающая сторона может делать что угодно, а гость только смотреть, или писать сообщения, используя <c-a> wall «привет!».

В конце концов, screen сессия запускается принимающей стороной:

screen -S pairprog

Гость заходит по SSH на принимающую машину:

ssh guest@host

Теперь можно вместе работать с одним терминалом. Чуть больше о командах screen здесь.

Если мы доверяем гостевому пользователю, можно добавить ему прав с помощью команды «acladd».

multiuser on
acladd guest

В этом случае гостевой пользователь может присоединиться к сессии (уже зайдя по SSH) слеюущей командой:

screen -x host/pairprog

Подробнее о командах screen можно узнать в справочнике команд. Основные команды:

Ctrl-a d # отключиться от экрана screen
Ctrl-a Ctrl-a # переключаться туда-сюда между экранами
screen -r # переподключиться к эрану screen

Если вдруг вы не соберётесь почитать ссылки, ниже интересные вещи оттуда.

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

Существует и более человечный аналог GNU Screen — tmux, пришедший из NetBSD, с более продуманной архитектурой, с более читаемым и поддерживаемым кодом. Ко всему прочему, в нём есть как горизонтальное, так и вертикальное разделение окон, доступное без всяких патчей. Здесь краткая заметка о парноем программировании с tmux и vim.
Теги:
Хабы:
Всего голосов 23: ↑22 и ↓1+21
Комментарии10

Публикации