Содержание
Проблематика
Когда у Вас становится много машин, к которым надо удаленно подключаться, будь то домашняя лаборатория с k8s на несколько нод или несколько VPS-ок, то становится трудно следить, какой пользователь, какому айпишнику принадлежит. Проблема усложняется, если Вы решите настраивать кастомные порты для каждого из SSH серверов или будете генерировать свои ключи для каждой машины в отдельности.
И вместо этого
ssh bob@192.169.1.11 -p 2222 -i ~/.keys/machine1/id_ed25519
Мы можем спокойно делать
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. Если этого файла нет, то папку можно создать командой
mkdir -p ~/.ssh && chmod 700 ~/.ssh
Сам файл не будет создан, его можно создать и выдать ему корректные права одной левой
touch ~/.ssh/config && chmod 600 ~/.ssh/config
Вообще его структура довольно гибка, но рассмотрим несколько основных примеров
Структура
Host hostname SSH_OPTION value SSH_OPTION value
-
hostname
- это то, что Вы будете прописывать вместо всех параметров -
SSH_OPTION
- это название определенного параметра для данного подключения, аvalue
- значение данного параметра
Примеры
В каждом из примеров наша длинная сложная строка подключения становится коротким
ssh bob-machine
Обычное подключение
ssh bob@100.100.100.100
превращается в
Host bob-machine HostName 100.100.100.100 User bob
Кастомный порт
ssh bob@100.100.100.100 -p 2222
превращается в
Host bob-machine HostName 100.100.100.100 User bob Port 2222
Нестандартный путь для приватного ключа
ssh bob@100.100.100.100 -i ~/bob/id_ed25519
превращается в
Host bob-machine HostName 100.100.100.100 User bob IdentityFile ~/bob/id_ed25519
Кастомный порт + приватный ключ
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.
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, чтобы красиво их показать. После выбора сразу проваливаемся в нужное нам подключение
