Наши партнеры

UnixForum






Книги по Linux (с отзывами читателей)

Библиотека сайта rus-linux.net

На главную -> MyLDP -> Тематический каталог -> Электронный офис в Linux

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 со своим методом быстрого редактирования.