Любой веб-разработчик пользуется ssh чуть ли не ежедневно - чтобы размещать код на удаленном сервере, конфигурировать этот сервер, производить какие-то операции с файлами итд. Но не все знают о возможностях тонкой настройки клиента OpenSSH - о них и пойдет речь в этой статье.
Общее соединение
Часто есть необходимость подключиться к одному и тому же серверу одновременно в нескольких окнах/вкладках консоли. ssh можно настроить так, чтобы вместо создания нового соединения к серверу использовалось уже созданное. Для этого нужно добавить следующие строчки в ~/.ssh/config (возможно, этот файл придется создать):
1 2 | |
После этого можно попробовать подключиться к какому-нибудь серверу, и в другой вкладке терминала открыть еще одно соединение - даже если в первый раз был запрошен пароль, во второй раз соединение откроется мгновенно без запроса пароля.
Этот метод также работает со всеми утилитами, использующими ssh-соединения: scp, rsync, git итд - достаточно открыть соединение, и утилита будет его использовать. При вводе пути к файлу на удаленном сервере в scp даже будет работать tab-completion.
Постоянное соединение
Во время работы часто приходится устанавливать много следующих друг за другом соединений - подключаемся, отключаемся, опять подключаемся - и так по много раз в день. OpenSSH позволяет устанавливать постоянное соединение - после окончания сессии такое соединение будет висеть в “спящем режиме” в течение указанного в конфиге времени, и будет использовано, как только будет запрошено соединение с тем же сервером. Постоянные соединения включаются одной строчкой в конфиге (в дополнение к 2 строчкам для общего соединения):
1
| |
Авторизация через публичный ключ
Это, пожалуй, самая известная возможность ssh - чтобы не было нужно вводить пароль при каждом соединении, достаточно создать на локальной машине пару ключей - публичный и приватный - и скопировать публичный на удаленную машину, к которой нужно подключаться по ssh. При этом будет запрашиваться pass phrase для ключа - но это будет происходить только при первом соединении после каждой перезагрузки локальной машины, а не при каждом соединении.
Для начала нужно сгенерировать пару ключей. Это делается командой
1
| |
которая выдаст инструкции для дальнейших действий по генерации ключа. Нужно ввести pass phrase, чтобы приватный ключ хранился в зашифрованном виде. Потом нужно скопировать публичный ключ на удаленную машину. Во многих системах для этого есть команда ssh-copy-id, с ее помощью ключ копируется следующим образом:
1
| |
Если же команда ssh-copy-id отсутствует, можно проделать эти же действия вручную:
1) найти файл с публичным ключом - ssh-keygen должен сообщить путь к файлу, обычно это что-то вроде ~/.ssh/id_rsa.pub
2) на каждой из удаленных машин нужно поместить содержимое этого файла в ~/.ssh/authorized_keys
3) убедиться, что ~/.ssh и ~/.ssh/authorized_keys доступны для записи только для вашего пользователя
Например, такая команда должна выполнить эти действия:
1
| |
Алиасы для хостов
Чтобы не набирать каждый раз полное название домена и имя юзера для подключения, можно задать алиас для любого хоста. Делается это следующим образом:
1 2 | |
Похожие доменные имена можно группировать, используя подстановку с помощью %h.
1 2 | |
Данный пример создаст алиасы dev, intranet и backup для dev.internal.example.com, intranet.internal.example.com и backup.internal.example.com соответственно.
Также можно использовать обычную маску - * для любого кол-ва символов и ? для одного любого символа:
1 2 | |
Если имя пользователя на локальной и удаленной машинах различаются, можно также указать его в описании хоста:
1 2 3 | |
Теперь, даже если локально нашего юзера зовут smylers, подключение через команду
1
| |
будет использовать пользователя simon.
Соединение по цепочке
Часто доступ к определенному серверу открыт только для другой доверенной удаленной машины, в этом случае нужно сначала заходить на доверенную машину, а уже оттуда соединяться с итоговым сервером. Это также можно автоматизировать. Сначала нужно убедиться в наличии публичного ключа на всех серверах, чтобы можно было подключиться к промежуточной машине одной командой, а оттуда второй командой - к нужному серверу; так, чтобы ни одна из команд не запрашивала пароль:
1 2 | |
Теперь в локальном shh-конфиге указываем, что для подключения к конечному хосту нужно проксирование через ssh на промежуточном сервере:
1 2 3 | |
После этого для подключения к конечному серверу будет достаточно следующей команды:
1
| |
Проброс портов
Иногда на удаленном сервере работает какая-то служба - такая, как веб-сервер, или сервер БД - и есть необходимость настроить соединение с этой машиной так, чтобы можно было вести работу с сервисом на ней через локальный порт - как если бы сервис был запущен локально. Это бывает полезно, например, когда на удаленном сервере запущен сервер PostgreSQL, настроенный на работу только с локальными соединениями.
Это можно осуществить с помощью проброса портов. Например, для работы с PostgreSQL-сервером на удаленной машине через локальный порт 5433 нужно вписать в ~/.ssh/config следующее:
1 2 | |
Теперь когда мы подключаемся к хосту db, весь трафик на локальном порту 5433 перенаправляется на порт 5432 на удаленной машине - и последняя думает, что соединение приходит с localhost.
1 2 3 | |
Или же, допустим, у нас есть бэк-энд веб-сервер, недоступный напрямую из сети - можно направить к нему весь трафик с локального порта:
1 2 | |
Потом подключаемся к нему:
1
| |
И сервер отвечает на локальном порту 8080:
1
| |
Авторство
Эта статья является переводом, оригинал находится здесь. Я перевел не всю статью, а только части, показавшиеся мне наиболее интересными.