В прошлом посте мы разобрали базовое использование команды `ssh` и полезные опции. Но каждый раз вручную вводить сложный IP-адрес, имя пользователя, номер порта и прочие детали — занятие ещё то: неудобно и быстро начинает раздражать. В таких случаях выручает **SSH config-файл**. Он позволяет сохранить настройки подключения к часто используемым серверам — почти как «избранное» — и подключаться к ним по короткому **псевдониму (alias)**. Кстати, я сам, когда был «совсем новичком» и даже не подозревал о существовании config-файла, думал: «Да как вообще каждый раз набирать эту длиннющую и сложную команду для SSH-подключения?» В итоге я просто брал строку команды, как есть, и регистрировал её как alias в файле `.bashrc`. А когда позже узнал, как правильно оформлять `config`, понял, **насколько по-деревенски и безграмотно** я тогда выкручивался. ![Я, восхищённый тем, что наконец узнал про SSH config](/media/whitedec/blog_img/ssh_config_favorite_style.webp) --- ## Что такое SSH config-файл? {#sec-481141e7802b} **SSH config-файл** — это конфигурационный файл, с помощью которого можно настраивать поведение SSH-клиента. Если заранее сохранить в нём параметры подключения к конкретному хосту (пользователь, порт, ключ и т. д.), то позже можно подключаться, вводя всего лишь короткий псевдоним. * **Расположение:** обычно он находится в папке `.ssh` в домашнем каталоге пользователя и называется `config`. Если вы только что установили SSH, его, скорее всего, ещё нет — тогда файл нужно создать. * **Создание файла:** если `~/.ssh/config` отсутствует, создайте его вручную. **Права доступа обязательно должны быть 600.** ```bash touch ~/.ssh/config chmod 600 ~/.ssh/config # Настройка прав обязательна для безопасности! ``` --- ## Правила написания config-файла {#sec-a6ba2fff88f5} Config-файл — это простой текстовый файл. Настройки для каждого хоста оформляются блоком, который начинается с ключевого слова `Host`. #### Базовая структура ```bash Host [псевдоним] [опция1] [значение1] [опция2] [значение2] ... ``` * **`Host [псевдоним]`**: обозначает начало блока и задаёт **псевдоним (alias)**, который вы будете использовать в команде `ssh`. Вместо псевдонима можно указать реальный адрес хоста (IP или домен). Также поддерживаются маски (`*`, `?`). * **Отступы**: опции внутри блока должны быть **с отступом**. Можно использовать пробелы или табы — главное, придерживаться одного стиля. * **Опции**: ниже `Host` перечисляются параметры SSH, которые применяются при подключении по этому псевдониму. По сути это то же самое, что вы раньше передавали через `ssh -опция`. ### Часто используемые опции {#sec-488803d47bdf} | | | | | ----------------------- | --------------------------------------------------------- | --------------------------------- | | **Опция** | **Описание** | **Пример значения** | | `HostName` | Реальный IP-адрес или доменное имя сервера | `192.168.1.100` или `example.com` | | `User` | Имя пользователя для подключения | `ubuntu`, `ec2-user`, `root` | | `Port` | SSH-порт сервера (по умолчанию 22) | `2222` | | `IdentityFile` | Путь к приватному ключу | `~/.ssh/id_ed25519_myserver` | | `ForwardAgent` | Включить проброс SSH-агента (при `ssh-agent`) | `yes` | | `StrictHostKeyChecking` | Насколько строго проверять host key (`yes` рекомендуется) | `no` (временно для первых тестов) | | `PortForwarding` | Разрешить порт-форвардинг | `yes` | | `LocalForward` | Локальный порт-форвардинг (аналог `-L`) | `8080 localhost:80` | | `ServerAliveInterval` | Интервал (сек.) для проверки, что соединение живо | `60` (чтобы не отваливалось) | | `ServerAliveCountMax` | Сколько раз повторять проверку перед разрывом | `3` | --- ## Пример SSH config-файла {#sec-92c9daf3ee29} Добавим настройки для нескольких серверов, к которым вы подключаетесь чаще всего, в `~/.ssh/config`. ```ini # Первый сервер: веб-сервер (псевдоним: webserver) Host webserver HostName 192.168.1.100 User ubuntu Port 2222 IdentityFile ~/.ssh/id_ed25519_webserver # Отдельный ключ для веб-сервера # Второй сервер: dev-сервер (псевдоним: devbox) Host devbox HostName dev.example.com User developer IdentityFile ~/.ssh/id_rsa_dev # Используем RSA-ключ # При подключении к этому серверу пробрасываем локальный 8000 порт на удалённый 80 порт LocalForward 8000 localhost:80 # Третий пример: все AWS EC2 серверы (шаблон псевдонимов: aws-*) Host aws-* User ec2-user IdentityFile ~/.ssh/aws_ec2_key.pem # Периодически шлём keep-alive, чтобы соединение не разрывалось ServerAliveInterval 60 ServerAliveCountMax 3 # Общие настройки для определённого диапазона IP (шаблон: 10.0.0.*) Host 10.0.0.* User admin Port 22 ``` **Пояснения:** * `webserver`: подключение к `192.168.1.100` как `ubuntu` через порт `2222` с ключом `id_ed25519_webserver`. * `devbox`: подключение к `dev.example.com` как `developer` с ключом `id_rsa_dev` и пробросом локального порта 8000 на удалённый порт 80. * `aws-*`: настройки, которые применяются ко всем псевдонимам, начинающимся с `aws-`. Например, при `aws-prod` или `aws-dev` автоматически применятся `User` и `IdentityFile`. `HostName` в таком случае интерпретируется как `prod` при подключении через `aws-prod` (и затем используется в `ssh aws-prod`). * `10.0.0.*`: при подключении к IP-адресам вида `10.0.0.x` автоматически применяется пользователь `admin` и стандартный порт 22. > Честно говоря, я показал вариант с wildcard `*` просто для знакомства, но в реальной жизни почти так не делаю. Обычно проще и понятнее поддерживать конфиг, когда **один сервер = один блок настроек (1:1)**.
> И ещё: **иногда к одному и тому же серверу нужно подключаться с разными настройками**. Тогда я добавляю несколько вариантов и выбираю псевдоним как блюдо в меню ресторана — набрал `ssh my-alias` и «заказал» нужный способ подключения. --- ![Магическая картинка: нажимаешь кнопку SSH-подключения — и сеть разливается во все стороны](/media/whitedec/blog_img/ssh_config_network_magic.webp) ## Как пользоваться config-файлом {#sec-e176d1ccdfce} После того как настройки сохранены в config-файле, подключаться становится гораздо проще. Давайте попробуем на основе примеров выше. ### 1. Подключение по псевдониму {#sec-b0810f8f4908} Выполняем SSH-команду, используя только псевдоним. * **Псевдоним `webserver`:** ```bash ssh webserver Enter passphrase for key '/home/youruser/.ssh/id_ed25519_webserver': ubuntu@webserver-ip:~ $ ``` > Эта команда внутри эквивалентна: > `ssh -p 2222 -i ~/.ssh/id_ed25519_webserver ubuntu@192.168.1.100` * **Псевдоним `devbox`:** ```bash ssh devbox Enter passphrase for key '/home/youruser/.ssh/id_rsa_dev': developer@devbox-domain:~ $ ``` > (При этом локальный порт 8000 будет проброшен на порт 80 на `dev.example.com`.) --- ## Преимущества использования config-файла {#sec-2c234f7e8725} * **Удобство:** длинные и сложные SSH-команды заменяются короткими псевдонимами — меньше ошибок и меньше печати. * **Продуктивность:** можно быстро переключаться между серверами и работать эффективнее. * **Простота управления:** все настройки подключения лежат в одном месте, поэтому сопровождать их легче. Например, если у сервера поменялся IP — достаточно поправить только config. * **Безопасность:** важные детали (например путь к ключу) не остаются в истории команд. --- ## В заключение {#sec-9c659c3d712e} SSH config-файл — обязательный инструмент для всех, кто регулярно пользуется SSH: и для разработчиков, и для системных администраторов. С ним подключение становится заметно удобнее и быстрее. Откройте `~/.ssh/config` и создайте свои собственные псевдонимы! Почитайте и другие посты про SSH: в правом поле поиска просто введите `ssh`, и вы найдёте больше материалов по теме. Если остались вопросы — смело задавайте их в комментариях! ---