Как работать с SSH?
SSH (Secure Shell) — протокол для безопасного удалённого подключения к серверам, выполнения команд и передачи данных через зашифрованный канал. Для Java-разработчика SSH — основной способ взаимодействия с серверами, CI/CD-инфраструктурой и Git-репозиториями.
Подключение
Пример
ssh user@hostname # Подключение к серверу
ssh user@192.168.1.100 # По IP-адресу
ssh -p 2222 user@hostname # Указание нестандартного порта
ssh user@hostname 'ls -la /opt' # Выполнить команду удалённо и выйти
Генерация SSH-ключей
SSH-аутентификация по ключам безопаснее парольной и не требует ввода пароля при каждом подключении.
Пример
# Генерация пары ключей (рекомендуется Ed25519)
ssh-keygen -t ed25519 -C "developer@example.com"
# Или RSA (4096 бит) — для совместимости со старыми системами
ssh-keygen -t rsa -b 4096 -C "developer@example.com"
# Результат:
# ~/.ssh/id_ed25519 — приватный ключ (НИКОГДА не передавать!)
# ~/.ssh/id_ed25519.pub — публичный ключ (можно передавать)
Копирование ключа на сервер
Пример
# Автоматическое копирование (рекомендуется)
ssh-copy-id user@hostname
ssh-copy-id -i ~/.ssh/id_ed25519.pub user@hostname
# Ручное копирование (если ssh-copy-id недоступен)
cat ~/.ssh/id_ed25519.pub | ssh user@hostname \
'mkdir -p ~/.ssh && chmod 700 ~/.ssh && cat >> ~/.ssh/authorized_keys'
ssh-agent — менеджер ключей
ssh-agent хранит расшифрованные приватные ключи в памяти, чтобы не вводить passphrase при каждом использовании:
Пример
eval $(ssh-agent) # Запуск агента
ssh-add ~/.ssh/id_ed25519 # Добавить ключ
ssh-add -l # Список ключей в агенте
Конфигурация ~/.ssh/config
Файл конфигурации позволяет задать алиасы для серверов, избавляя от запоминания IP-адресов и параметров:
Пример
Host production
HostName 10.0.1.50
User deploy
Port 2222
IdentityFile ~/.ssh/prod_key
Host staging
HostName 10.0.2.30
User deploy
IdentityFile ~/.ssh/staging_key
Host github.com
IdentityFile ~/.ssh/github_key
Host *
ServerAliveInterval 60
ServerAliveCountMax 3
AddKeysToAgent yes
# Теперь можно подключаться:
# ssh production вместо ssh -p 2222 deploy@10.0.1.50
# ssh staging вместо ssh deploy@10.0.2.30
SSH-туннелирование (проброс портов)
Туннели позволяют безопасно получать доступ к сервисам, недоступным напрямую:
Пример
# Локальный проброс: доступ к удалённому сервису через локальный порт
ssh -L 5432:localhost:5432 user@server
# Теперь localhost:5432 → PostgreSQL на сервере
# Удалённый проброс: дать серверу доступ к локальному сервису
ssh -R 8080:localhost:8080 user@server
# Динамический проброс (SOCKS-прокси)
ssh -D 1080 user@server
# Весь трафик через прокси localhost:1080 идёт через сервер
Права доступа к SSH-файлам
SSH откажется работать, если права на файлы ключей слишком открыты:
Пример
chmod 700 ~/.ssh
chmod 600 ~/.ssh/id_ed25519 # Приватный ключ — только владелец
chmod 644 ~/.ssh/id_ed25519.pub # Публичный ключ — можно читать всем
chmod 600 ~/.ssh/authorized_keys
chmod 644 ~/.ssh/config
На собеседовании: покажите, что понимаете принцип асимметричной криптографии (приватный ключ остаётся у вас, публичный копируется на сервер). Знание
~/.ssh/configи SSH-туннелей отличает уверенного Middle от Junior. Частый вопрос: «как пробросить базу данных с production через bastion-хост?» —ssh -J bastion -L 5432:db-host:5432 user@bastion.