linux ssh-network

ssh

Безопасное удалённое подключение к серверу по протоколу SSH

Описание

ssh (Secure Shell) — сетевой протокол и одноимённая утилита для безопасного удалённого управления системами. Команда устанавливает зашифрованный канал связи между локальной машиной и удалённым сервером, полностью заменив небезопасный telnet к середине 2000-х годов. Протокол SSH разработан финским программистом Тату Юлёненом в 1995 году; сегодня повсеместно используется версия SSH-2.

SSH применяется в трёх основных сценариях: интерактивная работа в удалённом терминале, выполнение одиночных команд без открытия сессии, и туннелирование трафика (проброс портов). Аутентификация возможна по паролю или по ключевой паре (предпочтительно): закрытый ключ остаётся на клиенте, открытый — добавляется в ~/.ssh/authorized_keys на сервере.

В современной инфраструктуре ssh — обязательный инструмент DevOps-инженера: управление VPS, деплой через CI/CD, настройка серверов, работа с Docker на удалённом хосте. Конфигурация клиента хранится в ~/.ssh/config, что позволяет создавать короткие псевдонимы для часто используемых серверов.

Синтаксис

ssh [опции] [пользователь@]хост [команда]
ЧастьОписание
[опции]Флаги для управления поведением соединения
пользователь@Имя пользователя на удалённом хосте (если не указано — берётся текущий локальный пользователь)
хост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-agent и добавьте ключ командой ssh-add ~/.ssh/id_rsa — тогда не нужно вводить passphrase каждый раз. На macOS ключи автоматически хранятся в Keychain при добавлении флага -K.
Совет: ControlMaster для ускорения повторных подключений
Добавьте в ~/.ssh/config параметры ControlMaster auto, ControlPath ~/.ssh/cm-%r@%h:%p и ControlPersist 10m — повторные соединения к тому же хосту переиспользуют существующее и открываются мгновенно.
Совет: отладка проблем с подключением
Флаг -v-vvv для максимальной детализации) покажет весь процесс handshake: какие ключи пробуются, на каком шаге отказ. Это первый инструмент при "Permission denied" или "Connection refused".
Осторожно: StrictHostKeyChecking=no
Отключение проверки ключа хоста (-o StrictHostKeyChecking=no) делает соединение уязвимым к атаке «человек посередине» (MITM). Используйте только в контролируемых CI/CD-пайплайнах с известными хостами, никогда в продакшн-скриптах.
Осторожно: права на файлы ключей
Приватный ключ должен иметь права 600 (только владелец может читать). Если права шире — SSH откажет в использовании ключа с ошибкой "UNPROTECTED PRIVATE KEY FILE". Исправить: chmod 600 ~/.ssh/id_rsa.