15 советов по использованию SSH, которые сделают вашу жизнь проще [2011]
SSH имеет множество различных функций, которые могут быть полезны при работе с удаленной машиной. Вместе они могут дать большое увеличение вашей впроизводительности. Если вы часто используете SSH, не поленитесь потратить немного времени на изучение этих возможностей и конфигурирование своего окружения чтобы сделать жизнь проще.
Англоязычный оригинал этого документа был представлен на конференции Perl-программистов Yapc Europe 2011 в Риге.
Некоторые из советов, приведенных в этой статье, сработают только в том случае, если вы пользуетесь SSH-клиентом OpenSSH, так что они окажутся бесполезны для пользователей других клиентов, таких как Putty. Однако, для Windows существует сборка OpenSSH под названием Copssh, поэтому, если некоторые из советов окажутся полезными для вас, вы сможете ими воспользоваться.
Множественные подключения
Часто бывает необходимо иметь несколько одновременных подключений к одному серверу, например, для редактирования файла, запуска команд и просмотра журнальных файлов в отдельных окнах. За редким исключением это оказывается слишком сложно сделать, поэтому в конечном итоге мы возвращаемся к стандартной схеме работы, запуская команды по мере необходимости в одном окне.
К счастью, в OpenSSH есть механизм, который позволяет моментально получить доступ к дополнительному терминалу в рамках одного соединения. Он называется "общий доступ к подключению" (connection sharing). Для его включения отредактируете (или создайте) ваш личный конфигурационный файл SSH ($HOME/.ssh/config), добавив в него следующие строки:
ControlMaster auto
ControlPath /tmp/ssh_mux_%h_%p_%r
Теперь закройте все имеющиеся SSH-соединения и создайте новые. Откройте новый терминал и создайте новое соединение с одним из уже подключенных серверов. Приглашение командной строки должно появится мгновенно.
От переводчика: странно, что автор не упомянул об этом, но для подобных задач гораздо удобнее использовать терминальные мультиплексоры screen и tmux.
Копирование файлов
Общий доступ к подключению не только делает возможным одновременное подключение к серверу с нескольких терминалов, но и позволяет легко и непринужденно копировать файлы. Если у вас уже есть одно подключение к серверу, запуск команды scp в соседнем терминале не приведет к созданию нового соединения с проверкой ключей или необходимостью ввода пароля, данные будут переданы в рамках уже существующего соединения. Более того, bash позволит вам использовать автодополнение имен файлов на удаленной стороне. Все остальные приложения, использующие SSH (rsync, git) также будут использовать уже существующее соединение.
Повторные соединения
Если вы часто, но ненадолго, соединяетесь с одним и тем же сервером, то стоит подумать о включении механизма непрерывных соединений (persistent connections). Для этого достаточно добавить всего одну строку в ваш конфигурационный файл:
ControlPersist 4h
Эта опция заставит сервер держать соединение открытым на протяжении четырех часов после завершения клиента, так что если в течении этого времени вы повторно инициируете соединение с этим сервером, он сможет быстро и без лишних вопросов восстановить сессию. Как побочный эффект, эта опция позволит значительно ускорить процесс копирования множества файлов между клиентом и сервером.
Откажитесь от паролей
Если вы используете пароли для аутентификации, то самое время упростить себе жизнь воспользовавшись ключами. Для этого сгенерируйте новый ключ:
$ ssh-keygen
Следуйте инструкциям на экране. Введите пароль для защиты вашего ключа. Скопируйте ключ на сервер:
$ ssh-copy-id zobnin@execbit.ru
Попробуйте подключиться к серверу вновь и вы заметите, что пароль вводить больше не нужно.
Putty тоже может работать с ключами. Скачайте PuttyGen и Pageant со странички Putty, запустите PuttyGen и сгенерируйте новый ключ, скопируйте содержимое ключа в файл $HOME/.ssh/authorized_keys удаленной машины. Запустите Pageant и укажите ему свой ключ.
Проброс соединений
Иногда бывает необходимо создать соединение с одного удаленного сервера к другому, избежав при этом выполнения лишних команд и ввода паролей. Если мы просто попробуем создать соединение к серверу A, который аутентифицирует нас с использованием ключей, а затем с этого сервера - соединение с сервером B, то придется ввести пароль даже в том случае, если мы произвели обмен ключами между своей машиной и сервером B. Чтобы избежать этого можно использовать forward agent. Добавьте в конфигурационный файл следующую строку:
ForwardAgent yes
Или поставьте галочку напротив "Allow agent forwarding" в настройках Putty.
Не набирайте полные имена хостов
Набирать полное имя сервера утомительно. Вы можете указать короткие псевдонимы для тех серверов, к которым вы часто подключаетесь. Это можно сделать добавив в кнфигурационный файл строки следующего вида:
Host dev
HostName dev.internal.example.com
Теперь вместо dev.internal.example.com можно набирать просто dev. Также можно использовать маски для группировки хостов, принадлежащих одному домену:
Host dev intranet backup
HostName %h.internal.example.com
Host www* mail
HostName %h.example.com
От переводчика: на самом деле для этого гораздо удобнее использовать автодополнения в bash (при условии, что пакет bash-completion установлен), просто наберите несколько первых букв имени домена и нажмите <Tab>.
Не указывайте имя пользователя
Если имя пользователя на сервере отличается от имени пользователя текущей системы, вы можете либо постоянно указывать его при подключении, либо добавить в псевдонимы, описанные выше:
Host www* mail
HostName %h.example.com
User simo
Проксирование соединений
Не всегда есть возможность подключиться к определенному серверу напрямую. Приходится создавать соединение с другим сервером и уже через него подключаться к нужному. К счастью, это можно автоматизировать. Для начала убедитесь, что вы можете создавать оба соединения без необходимости ввода пароля, в противном случае воспользуйтесь forward agent. Далее внесите в конфиг SSH строки примерно такого вида:
Host db
HostName db.internal.example.com
ProxyCommand ssh gateway netcat -q 600 %h %p
Теперь, если вы наберете:
$ ssh db
Соединение с сервером db.internal.example.com будет произведено через сервер gateway.
Побег из закрытых сетей
Иногда вы можете оказаться в такой ситуации, когда подключение к удаленным SSH-серверам оказывается невозможным из-за настроек брэндмауэра, который пропускает во внешний мир только соединения с web-сайтами, то есть фильтрует все порты, кроме 80 и 443. В этом случае вы можете изменить порт, прослушиваемый OpenSSH-сервером. Для этого измените конфигурационный файл /etc/ssh/sshd_config сервера так, чтобы он содержал следующую строку:
Port 443
И перезапустите SSH-сервер:
$ sudo reload ssh
Конечно, это стоит делать только в том случае, если на сервере нет настоящего web-сервера. Подключившись к этому открытому SSH-серверу вы сможете легко подключиться к любому другому с помощью проброса соединений, описанного выше.
Борьба с web-прокси
Иногда админы сети бывают столь суровы, что не просто запрещают подключение к любым не-www портам, но и принуждают пользователей использовать web-прокси для выхода в интернет. В этом случае можно воспользоваться приложением Corkscrew. Просто скачайте его, установите, найдите в интернете открытый Corkscrew-сервер и добавьте в SSH-конфиг следующую строку:
Иногда бывает удобно запустить графическое приложение на удаленном сервере, например чтобы отредактировать изображение, просмотреть PDF-файл или просто запустить графический редактор текстов. Такое можно проделать и с использованием SSH, точнее механизма под названием X forwarding. Чтобы включить его добавьте в конфигурационный файл следующую строку:
ForwardX11 yes
Ту же опцию необходимо добавить и в конфигурационный файл SSH-сервера (/etc/ssh/sshd_config):
X11Forwarding yes
Также на сервер необходимо установить пакет xauth и весь графический софт, который вы собираетесь запускать. Это работает в Linux и любой операционной системе, использующей систему X Windows.
От переводчика: тут автор забыл сказать, что для запуска удаленного приложения следует использовать следующую команду:
$ ssh -X user@host команда
Локальное управление удаленными файлами
Вместо того, чтобы запускать графические приложения удаленно, можно сделать так, чтобы удаленные файлы стали видны локальным приложениям. Это можно сделать с помощью виртуальной файловой системы sshfs. Просто установите пакет sshfs, создайте каталог, к которому хотите подключить удаленное дерево файлов, и примонтируйте файловую систему:
$ sudo apt-get install sshfs
$ sshfs dev:projects/gallery/src gallery_src
$ cd gallery_src
$ ls
Теперь файлы каталога projects/gallery/src, расположенные на удаленной машине dev будут видны как локальные файлы каталога gallery_src. Вы можете работать с ними используя любое удобное вам приложение. Чтобы отключить удаленный каталог используйте команду fusermount:
$ cd ..
$ fusermount -u gallery_src
ФС sshfs работает в Linux, MacOS X и FreeBSD.
От переводчика: в Windows можно использовать платное приложение ExpanDrive.
Редктируем удаленные файлы с помощью Vim
У редактора vim есть встроенная функция для редактирования удаленных файлов используя протокол scp. Использовать ее очень просто:
Это более ограниченный, в сравнении с предыдущим, способ, однако он удобен в тех случаях, когда необходимо отредактировать один-два файла. К тому же он работает в Windows.
От переводчика: также можно использовать rsync:// вместо scp://, тогда файл будет полностью закачен на локальную машину.
Подключение к удаленным сервисам с помощью локальных приложений
Бывает, что на удаленном сервере есть сетевой сервис вроде базы данных или web-сервера, доступ к которому открыт только локальным приложениям, но мы хотим подключиться к нему удаленно. Это можно сделать с помощью механизма, называемого проброс портов (port forwarding). Например, на удаленном сервере db запущен Postgres, который не принимает подключения с удаленной стороны. Чтобы подключиться к нему мы можем добавить в конфигурационный файл SSH-клиента следующие строки:
Host db
LocalForward 5433 localhost:5432
Когда вы подключитесь к серверу, SSH автоматически откроет порт 5433, который будет перенаправлять все данные на порт 5432 сервера (его слушает Postgres), так что Postgres будет думать что данные поступают с локальный машины. Чтобы это проверить подключитесь к серверу db:
$ ssh db
Откройте другое окно терминала и попробуйте подключиться к Postgres:
$ psql -h localhost -p 5443 orders
Этот метод будет особенно удобен, если вы хотите запустить графическое приложение для управления базой данных:
$ pgadmin3 &
Или, если на сервере работает web-сервер в режиме back-end, который недоступен из сети:
Host api
LocalForward 8080 localhost:80
$ ssh api
$ firefox http://localhost:8080/
Избегаем задержек
Если вы наблюдаете значительные задержки при подключении к удаленному серверу, добавьте в конфигурационный файл следующую строку:
Если SSH-сервер находится внутри заведомо безопасной сети (например сети вашего офиса или дома), вы можете сделать передачу данных быстрее используя алгоритм шифрования arcfour:
Host dev
Ciphers arcfour
Обратите внимание, что ускорение в этом случае происходит за счет использования менее стойкого шифрования, так что я бы не рекомендовал делать это для соединений к серверам через интернет.
От переводчика: настройка для еще более быстрого и безопасного соединения: