SSH
SSH (Secure Shell) — сетевой протокол для безопасного удалённого доступа и управления Linux-серверами.
Расположение и описание файлов
| Расположение | Описание |
|---|---|
/etc/ssh/ssh_config | Общесистемная конфигурация |
~/.ssh/config | Конфигурация для пользователя |
~/.ssh/id_{type} | Закрытый ключ |
~/.ssh/id_{type}.pub | Открытый ключ |
~/.ssh/known_hosts | Открытые ключи удалённых серверов |
~/.ssh/authorized_keys | Авторизованные ключи входа |
После изменений:
sudo systemctl restart sshdОсновные команды
Подключение к серверу:
ssh пользователь@хост -p портПример:
ssh user@192.168.1.1 -p 22Генерация SSH-ключей:
ssh-keygen -t ed25519 # или -t rsaКопирование ключа на сервер:
ssh-copy-id пользователь@хостПодключение с указанием ключа:
ssh -i ~/.ssh/ключ_пользователь@хостSCP (копирование файлов):
scp файл пользователь@хост:/путь # Отправка scp пользователь@хост:/путь/файл . # Загрузка
Безопасность
- Отключите вход по паролю (
PasswordAuthentication no). - Смените стандартный порт (
Port 2222). - Запретите вход root (
PermitRootLogin no).
Пример конфигурации:
Port 2222
PermitRootLogin no
PasswordAuthentication noПосле изменений:
service ssh restartПроверьте логи SSH:
tail -f /var/log/auth.logЛень — двигатель прогресса: пишем идеальный SSH-коннектор
Признайся, друг мой, сколько раз ты печатал ssh user@192.168.1.100 -p 2222 -i ~/.ssh/super-key, а если этих серверов десяток? А если у каждого свой ключ и свой пользователь? Пальцы устают, мозг плавится, глаза закрываются…
Но выход есть! И он прекрасен, как утренний кофе после деплоя в пятницу вечером. Мы напишем маленький, но очень гордый скрипт, который превратит подключение к серверу в два нажатия клавиш. Встречайте: ssh-host и его брат-близнец shh.
Что нам понадобится
Скрипт использует два кита:
- fzf — гениальный инструмент для fuzzy-поиска. Выбирать сервер из списка с его помощью — сплошное удовольствие.
- bat (а точнее
batcatв Ubuntu/Debian) — кот, который показывает файлы с подсветкой синтаксиса. Мы будем показывать с его помощью кусочек~/.ssh/config, чтобы сразу видеть все параметры хоста.
Установить их можно в два счёта:
sudo apt install fzf batСкрипт, который спасёт ваши пальцы
Закиньте этот код в ~/.bashrc или ~/.zshrc:
ssh-host() {
local config="$HOME/.ssh/config"
if [[ ! -f "$config" ]]; then
echo "Ошибка: файл $config не найден" >&2
return 1
fi
local host=$(awk '/^Host / { for (i=2; i<=NF; i++) print $i }' "$config" | \
grep -v '[*?]' | sort -u | \
fzf --height 40% --layout=reverse --border \
--header "Выбери сервер для SSH" \
--preview "batcat --color=always --style=plain --language=ssh_config <(grep -A5 '^Host {}' $config)")
if [[ -n "$host" ]]; then
echo -e "\033[0;34mПодключение к \033[1;32m$host\033[0m..."
ssh "$host" "$@"
fi
}
alias shh='ssh-host'Что тут происходит?
- Скрипт читает твой
~/.ssh/config(ну а где же ещё хранить параметры подключений?). - Выдирает оттуда все имена хостов (те, что написаны после
Host). - Отсеивает шаблонные записи типа
Host *.example.com— с ними мы пока не работаем. - Передаёт список в
fzf, который показывает его в удобном окошке. Можно искать, стрелочками ходить, мышкой тыкать. - Для выбранного хоста
batcatпоказывает кусочек конфига (первые 5 строк послеHost) — так ты сразу видишь, под каким пользователем и с каким ключом пойдёшь в гости. - После выбора выводится приветствие и запускается
ssh. - Алиас
shh— чтобы не ломать ритм быстрого набора.
А как же парольные фразы? Не бесит каждый раз вводить?
Если твои ключи защищены парольной фразой (а они защищены, правда?), то при каждом подключении SSH будет её спрашивать. Это быстро надоедает. Решение есть, и оно элегантное: ssh-agent.
В современных дистрибутивах с GNOME агент запускается автоматически. Но ключи надо в него добавить. Самый простой способ — добавить одну строчку в ~/.ssh/config (в самое начало файла, вне секций Host):
Host *
AddKeysToAgent yesТеперь при первом подключении к любому серверу SSH спросит парольную фразу и сразу же загрузит ключ в агента. Все последующие подключения в этой сессии будут без пароля. Магия!
Если ты хочешь проверить, какие ключи уже загружены, используй:
ssh-add -lПример грамотной настройки ~/.ssh/config
Host *
AddKeysToAgent yes
# Хост для работы (личный сервер)
Host work-server
HostName 192.168.1.100
User dmitriy
Port 22
IdentityFile ~/.ssh/id_rsa_work
IdentitiesOnly yes # использовать только указанный ключ
# Группа серверов с одинаковыми параметрами (шаблон)
Host *.home.local
User admin
Port 2222
IdentityFile ~/.ssh/id_rsa_home
IdentitiesOnly yes
# Конкретные хосты из этой группы
Host db1.home.local
HostName 192.168.1.10
Host app1.home.local
HostName 192.168.1.20
# Пример настройки для хоста с паролем
Host my-server
HostName 192.168.1.50
User admin
# Отключаем аутентификацию по публичному ключу (чтобы не тратить время на перебор ключей)
PubkeyAuthentication no
# Явно разрешаем аутентификацию по паролю (обычно и так включена)
PasswordAuthentication yes
# Можно также отключить другие методы
ChallengeResponseAuthentication no
GSSAPIAuthentication noПримечание: права доступа для файлов ключей должны быть
600(chmod 600 ~/.ssh/id_rsa_work).
Скрипт простой, как грабли, но экономит часы жизни. А время, как известно, — единственный невосполнимый ресурс. Используй его с умом и с shh 😉