ssh
Безопасное удалённое подключение к серверу по протоколу SSH
Описание
ssh (Secure Shell) — сетевой протокол и одноимённая утилита для безопасного удалённого управления системами. Команда устанавливает зашифрованный канал связи между локальной машиной и удалённым сервером, полностью заменив небезопасный telnet к середине 2000-х годов. Протокол SSH разработан финским программистом Тату Юлёненом в 1995 году; сегодня повсеместно используется версия SSH-2.
SSH применяется в трёх основных сценариях: интерактивная работа в удалённом терминале, выполнение одиночных команд без открытия сессии, и туннелирование трафика (проброс портов). Аутентификация возможна по паролю или по ключевой паре (предпочтительно): закрытый ключ остаётся на клиенте, открытый — добавляется в ~/.ssh/authorized_keys на сервере.
В современной инфраструктуре ssh — обязательный инструмент DevOps-инженера: управление VPS, деплой через CI/CD, настройка серверов, работа с Docker на удалённом хосте. Конфигурация клиента хранится в ~/.ssh/config, что позволяет создавать короткие псевдонимы для часто используемых серверов.
Синтаксис
| Часть | Описание |
|---|---|
| [опции] | Флаги для управления поведением соединения |
| пользователь@ | Имя пользователя на удалённом хосте (если не указано — берётся текущий локальный пользователь) |
| хост | IP-адрес, доменное имя или псевдоним из ~/.ssh/config |
| [команда] | Если указана — выполняется без открытия интерактивной сессии и ssh завершается |
Флаги и опции
| Флаг | Описание |
|---|---|
| -p PORT | Подключиться на нестандартный порт (по умолчанию 22) |
| -i KEYFILE | Указать путь к приватному ключу вместо стандартного ~/.ssh/id_rsa |
| -l USER | Указать имя пользователя (альтернатива синтаксису user@host) |
| -L [bind:]port:host:hostport | Локальный проброс порта (Local Port Forwarding): трафик с локального порта идёт через SSH на указанный адрес |
| -R [bind:]port:host:hostport | Удалённый проброс порта (Remote Port Forwarding): порт на сервере перенаправляется на локальную сторону |
| -D [bind:]port | Динамический проброс — создаёт SOCKS5-прокси на локальном порту |
| -N | Не выполнять удалённую команду; используется только для туннелей (-L, -R, -D) |
| -f | Уйти в фоновый режим перед выполнением команды (обычно используется вместе с -N) |
| -A | Включить agent forwarding: позволяет использовать локальные ключи на промежуточном сервере |
| -X | Включить X11 forwarding для запуска графических приложений через SSH |
| -v / -vv / -vvv | Увеличить уровень отладочного вывода (полезно при проблемах с подключением) |
| -o Option=Value | Передать параметр конфигурации напрямую, напр. -o StrictHostKeyChecking=no |
| -t | Принудительно выделить псевдотерминал (TTY), нужно для sudo и интерактивных программ |
| -q | Тихий режим: подавить предупреждения и диагностические сообщения |
Паттерны использования
Базовое подключение
Простое подключение к серверу по имени пользователя и адресу.
# По IP-адресу ssh ubuntu@192.168.1.10 # По доменному имени ssh deploy@example.com # На нестандартный порт ssh -p 2222 admin@myserver.io
Подключение с ключом
Аутентификация по ключевой паре без ввода пароля.
# Явно указать ключ ssh -i ~/.ssh/myproject_rsa deploy@10.0.0.5 # Ключ для AWS EC2 ssh -i ~/keys/aws-prod.pem ec2-user@54.12.34.56
Выполнение команды без сессии
Запустить команду на сервере и сразу получить вывод.
# Проверить использование диска ssh user@server "df -h" # Посмотреть последние логи ssh user@server "sudo tail -50 /var/log/nginx/error.log" # Перезапустить сервис ssh user@server "sudo systemctl restart nginx"
Псевдоним в ~/.ssh/config
Создать короткое имя для часто используемого сервера.
# Содержимое ~/.ssh/config:
Host prod
HostName 203.0.113.42
User deploy
Port 2222
IdentityFile ~/.ssh/prod_rsa
# Теперь подключаться просто:
ssh prod
Локальный проброс порта
Подключиться к базе данных на сервере через локальный порт.
# Доступ к PostgreSQL (5432) на сервере # через localhost:15432 ssh -L 15432:localhost:5432 user@server -N -f # Теперь подключаться локально: psql -h localhost -p 15432 -U mydb
Jump Host (ProxyJump)
Подключиться к внутреннему серверу через бастион-хост.
# Через один прыжок
ssh -J bastion@jump.example.com user@internal-server
# В ~/.ssh/config:
Host internal
HostName 10.0.1.50
User admin
ProxyJump bastion@jump.example.com
Советы и предупреждения
Запустите
ssh-agent и добавьте ключ командой ssh-add ~/.ssh/id_rsa — тогда не нужно вводить passphrase каждый раз. На macOS ключи автоматически хранятся в Keychain при добавлении флага -K.
Добавьте в
~/.ssh/config параметры ControlMaster auto, ControlPath ~/.ssh/cm-%r@%h:%p и ControlPersist 10m — повторные соединения к тому же хосту переиспользуют существующее и открываются мгновенно.
Флаг
-v (и -vvv для максимальной детализации) покажет весь процесс handshake: какие ключи пробуются, на каком шаге отказ. Это первый инструмент при "Permission denied" или "Connection refused".
Отключение проверки ключа хоста (
-o StrictHostKeyChecking=no) делает соединение уязвимым к атаке «человек посередине» (MITM). Используйте только в контролируемых CI/CD-пайплайнах с известными хостами, никогда в продакшн-скриптах.
Приватный ключ должен иметь права
600 (только владелец может читать). Если права шире — SSH откажет в использовании ключа с ошибкой "UNPROTECTED PRIVATE KEY FILE". Исправить: chmod 600 ~/.ssh/id_rsa.