skip to content
Архитектура в курилке

SSH config

/ чтиво на 2 минуты

Обновлено:
Содержание

Проблематика

Когда у Вас становится много машин, к которым надо удаленно подключаться, будь то домашняя лаборатория с k8s на несколько нод или несколько VPS-ок, то становится трудно следить, какой пользователь, какому айпишнику принадлежит. Проблема усложняется, если Вы решите настраивать кастомные порты для каждого из SSH серверов или будете генерировать свои ключи для каждой машины в отдельности.

И вместо этого

Terminal window
ssh bob@192.169.1.11 -p 2222 -i ~/.keys/machine1/id_ed25519

Мы можем спокойно делать

Terminal window
ssh my-server

SSH config

Пример типичного ~/.ssh/config

Host server-1
HostName 100.100.100.1
User bob
Host server-2
HostName 100.100.100.2
User alex
Host my-machine
HostName 192.168.1.10
User test
Port 7654
IdentityFile ~/.ssh/test.key

Файл создается в папке ~/.ssh для текущего пользователя, после того, как он запустит впервые ssh. Если этого файла нет, то папку можно создать командой

Terminal window
mkdir -p ~/.ssh && chmod 700 ~/.ssh

Сам файл не будет создан, его можно создать и выдать ему корректные права одной левой

Terminal window
touch ~/.ssh/config && chmod 600 ~/.ssh/config

Вообще его структура довольно гибка, но рассмотрим несколько основных примеров

Структура

Host hostname
SSH_OPTION value
SSH_OPTION value
  • hostname - это то, что Вы будете прописывать вместо всех параметров

  • SSH_OPTION - это название определенного параметра для данного подключения, а value - значение данного параметра

Примеры

В каждом из примеров наша длинная сложная строка подключения становится коротким

Terminal window
ssh bob-machine

Обычное подключение

Terminal window
ssh bob@100.100.100.100

превращается в

Host bob-machine
HostName 100.100.100.100
User bob

Кастомный порт

Terminal window
ssh bob@100.100.100.100 -p 2222

превращается в

Host bob-machine
HostName 100.100.100.100
User bob
Port 2222

Нестандартный путь для приватного ключа

Terminal window
ssh bob@100.100.100.100 -i ~/bob/id_ed25519

превращается в

Host bob-machine
HostName 100.100.100.100
User bob
IdentityFile ~/bob/id_ed25519

Кастомный порт + приватный ключ

Terminal window
ssh bob@100.100.100.100 -i ~/bob/id_ed25519 -p 2222

превращается в

Host bob-machine
HostName 100.100.100.100
User bob
IdentityFile ~/bob/id_ed25519
Port 2222

Advanced usage

SSH config файл - не просто хранилище конфигов, но и продвинутый инструмент с поддержкой регулярных выражений. Так, к примеру, можно всем подключениям, которые начинаются со слова PROD указать один и тот же приватный ключ и, к примеру, пользователя.

Таким образом конфиг из такого:

Host PROD-kafka-0
HostName 10.10.10.0
User kafka
IdentityFile ~/.ssh/PROD/id_ed25519
Port 2222
Host PROD-kafka-1
HostName 10.10.10.1
User kafka
IdentityFile ~/.ssh/PROD/id_ed25519
Port 2222

Превращается в:

Host PROD-kafka-0
HostName 10.10.10.0
Host PROD-kafka-1
HostName 10.10.10.1
Host PROD-kafka-*
User kafka
IdentityFile ~/.ssh/PROD/id_ed25519
Port 2222

Таким образом, при добавлении еще одного подключения, у которого есть лишь новый адрес, мы впишем только

Host PROD-kafka-2
HostName 10.10.10.2

Еще это может быть удобно при использовании Ghostty.

Так можно на все конфиги указать переменную, чтобы Ghostty прикинулся другим терминалом:

Host *
SetEnv TERM=xterm-256color

И в дальнейшем не будет ошибок при нажатии Ctrl+L или запуска htop.

FZF

Когда лень лазить в конфиг и смотреть, какие там подключения отвечают за что, мне нравится использовать утилиту fzf.

Terminal window
choose_ssh() {
server=$(grep '^Host \w' ~/.ssh/config | cut -d ' ' -f 2 | fzf)
if [ -n "$server" ]; then
ssh $server
else
echo Cancelled
fi
}
alias cssh="choose_ssh"

Эта функция вместе с записью алиаса лежит у меня в .zshrc.

По сути, она просто берет и находит в ~/.ssh/config все имена подключений, которые начинаются на цифру или букву, и засовывает их в fzf, чтобы красиво их показать. После выбора сразу проваливаемся в нужное нам подключение

cssh