Библиотека сайта rus-linux.net
bcvi - удаленное редактирование без задержек
Оригинал: Avoid latency while editing remote files using bcvi
Автор: Ben Martin
Дата: 11 июля 2007
Перевод: Александр Тарасов aka oioki
Дата перевода: 22 июля 2008
Возможность безопасного запуска консольных и графических программ на удаленных системах с помощью SSH дает широкий простор действий. Однако когда связь с удаленным компьютером происходит с большими задержками, работа с интерактивными программами (наподобие текстовых редакторов) может стать жесткой проверкой вашего терпения. Проект bcvi позволяет редактировать файлы с удаленной системы с помощью gvim (или любого другого редактора) на локальной машине, и таким образом избежать задержек. Даже несмотря на задержку, bcvi - удобное средство для запуска gvim в том случае, когда на сервере не содержится самого gvim или библиотек X.
Работа bcvi основана на создании пробрасывающего порт обратного канала при удаленном SSH-доступе. При запуске bcvi на удаленной системе этот обратный канал используется для оповещения вашей локальной машины о том, что нужно запустить gvim, и для передачи редактируемого файла с удаленной машины. Это работает благодаря тому, что gvim поддерживает SSH-адреса, т.е. может работать с удаленными файлами по протоколу SSH как с локальными.
Я не нашел пакетов bcvi для дистрибутивов openSUSE, Fedora и Ubuntu. Скрипт bcvi можно найти или на самом сайте, или скачать, его нужно установить как на клиентскую, так и на серверную машины. Это можно сделать, отдав следующие команды:
# cp /.../bcvi /usr/local/bin/ # chmod 755 /usr/local/bin/bcvi # dos2unix /usr/local/bin/bcvi # ls -lh /usr/local/bin/bcvi -rwxr-xr-x 1 root root 8.2K 2008-06-23 14:59 /usr/local/bin/bcvi*
Один и тот же скрипт bcvi используется в трех местах: демон, запускающий gvim на вашей локальной машине в ответ на запросы редактирования, идущие от удаленной машины; обертка для вызова SSH, устанавливающая дополнительный проброс порта до bcvi, чтобы удаленная система могла общаться с локальным демоном bcvi; и программа на удаленной системе для создания запросов редактирования.
При входе через SSH с использованием bcvi на удаленную машину переменная окружения TERM получает дополнительные параметры, и bcvi становится известно, как общаться с вашей локальной машиной. Скорее всего на удаленной машине вы захотите добавить следующие строки в файл ~/.profile
. Первая строка выносит переданные в TERM параметры во вне этой переменной, так что TERM остается такой как и была. Вторая строка приводит к тому, что вызов команды vi
будет вызывать bcvi
, и на вашей локальной машине будет запущен gvim. На большинстве систем Linux оболочкой является bash, поэтому следует отредактировать файл ~/.bash_profile
.
test -n "$(which bcvi)" && eval "$(bcvi --unpack-term)" alias vi=bcvi
Еще нужно гарантировать, чтобы bcvi был запущен в качестве демона на локальной машине, чтобы bcvi, запущенный на удаленной машине, мог с ним общаться. Демон может быть запущен автоматически путем добавления следующей строки в ваш файл ~/.bash_profile
:
bcvi -l &
Вместо того, чтобы оборачивать каждый раз SSH-соединения программой bcvi, можно использовать алиас командной оболочки на локальной машине. Тогда оборачиваться в bcvi будут все SSH-соединения. Я обнаружил, что при добавлении алиаса в файл ~/.bash_profile
, а не в ~/.bashrc
запуск консоли в X не дает необходимого эффекта - поэтому добавление алиаса в файл .bashrc
хотя и приводит к тому, что он будет запускаться каждый раз при запуске оболочки, однако это дает гарантию работы алиаса.
alias ssh="bcvi --wrap-ssh --"
После добавления упомянутых строк в .bash_profile
на локальной машине и серверах вы получаете возможность редактировать файлы так, как показано на рисунке. Вы создали алиас vi для вызова bcvi, поэтому процесс вызова редактора останется таким же, как и прежде. На снимке экрана показано, как именно это будет выглядеть. Я сохранил файл в gvim и запустил cat на удаленной машине. Видно, что изменения сохранились.
[ben@virtual_client ~]$ ssh ben@virtual_server [ben@virtual_server ~]$ date > bcvi-test-file.txt [ben@virtual_server ~]$ vi bcvi-test-file.txt
Так происходит работа с bcvi
Можно использовать редактор, отличный от gvim, лишь бы он мог загружать и сохранять файлы по SSH. К примеру, текстовый редактор gedit может это делать, т.е. может работать с адресами вида SSH://. Чтобы bcvi мог вызывать gedit, необходимо добавить следующую процедуру в Perl-скрипт bcvi, наиболее логично сделать это после процедуры execute_vi.
sub execute_gedit { my($self, $alias, @files) = @_; s{^}{ssh://$alias/} foreach @files; system('gedit', '--', @files); }
Теперь с появлением этой новой функции в bcvi возможно запускать gedit для редактирования файлов удаленной машины на локальной. Если этот редактор вам лучше подходит, тогда стоит создать алиас в ~/.bashrc
на удаленной машине, примерно вот так:
bcvi --command gedit bcvi-test-file.txt alias gedit="bcvi --command gedit"
Если вы подключаетесь с использованием bcvi, но не включаете команду bcvi --unpack-term
в стартовые скрипты удаленной машины (см. выше ~/.bash_profile
), тогда при каждом выходе из SSH-сессии вы будете получать следующую ошибку:
$ ssh root@virtual_server Last login: Mon Jun 23 15:16:13 2008 from virtual_client [root@virtual_server ~]# [root@virtual_server ~]# exit logout 'xterm BCVI_CONF=virtual_server:localhost:5009': unknown terminal type. Connection to virtual_server closed.
bcvi - удобное средство для редактирования файлов на удаленных системах с большим временем реакции. Порой бывает, что файл составляет всего несколько килобайт, но задержка реакции сети чудовищно велика, тогда даже смещение курсора будет мучительным. Тут как раз вам и поможет bcvi со своим методом быстрого редактирования.