Содержание
Проблематика
Когда у Вас становится много машин, к которым надо удаленно подключаться, будь то домашняя лаборатория с k8s на несколько нод или несколько VPS-ок, то становится трудно следить, какой пользователь, какому айпишнику принадлежит. Проблема усложняется, если Вы решите настраивать кастомные порты для каждого из SSH серверов или будете генерировать свои ключи для каждой машины в отдельности.
И вместо этого
ssh bob@192.169.1.11 -p 2222 -i ~/.keys/machine1/id_ed25519Мы можем спокойно делать
ssh my-serverSSH 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 2222Advanced 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, чтобы красиво их показать. После выбора сразу проваливаемся в нужное нам подключение