Команда SSH: использование опций -l, -p, -i и проверка ошибок подключения

Тестовая средаСемейство RHELAlmaLinux 9.8OpenSSH 9.9p1Принимающая сторона Debian 12 · OpenSSH 9.2p1 обычная учётная записьУчётная запись root
Сетевые командыsshРасположение/usr/bin/ssh

Команда SSH — это команда клиента OpenSSH, которая в виде ssh учётная-запись@адрес-сервера подключается к удалённому Linux-серверу по зашифрованному соединению и выполняет команды на сервере, к которому подключилась. Мы запускали ssh с сервера AlmaLinux 9 на сервер Debian 12 и по порядку проверили всё: от проверки ключа хоста при первом подключении до опций -l, -p и -i, выполнения удалённых команд и отладочного вывода -v. Выяснилось, что то, как опции применяются на самом деле, можно заранее проверить с помощью ssh -G, не подключаясь.

Вывод ниже — это результат на двух серверах без изменений. Адрес сервера и учётная запись, имя хоста, путь и отпечаток ключа, а также номера версий OpenSSL и ядра подключающегося сервера заменены примерными значениями. Подключающийся сервер AlmaLinux использует учётную запись root, а принимающий подключение сервер Debian — обычную учётную запись.

1️⃣ Основы использования команды SSH

Чтобы войти на удалённый сервер, после ssh пишут имя учётной записи и адрес сервера, соединённые знаком @. После входа приглашение меняется на приглашение подключённого сервера, а ввод exit закрывает соединение и возвращает на исходный сервер.

ssh user@192.0.2.10
Linux server2 6.1.0-53-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.1.187-1 (2026-09-07) x86_64
Last login: Wed Oct 28 20:27:41 2026 from 198.51.100.7
[user]:~$ whoami
user
[user]:~$ exit
exit
Connection to 192.0.2.10 closed.

Сервер Debian, к которому мы подключались, при входе показал ещё несколько строк сообщения сервера (motd) и уведомление о почте; в выводе выше убраны только эти строки.

При первом подключении к серверу ssh до входа выводит отпечаток ключа хоста сервера и спрашивает, продолжать ли подключение. После ввода yes ключ хоста сохранился в ~/.ssh/known_hosts, а затем появился результат whoami.

ssh user@192.0.2.10 whoami
The authenticity of host '192.0.2.10 (192.0.2.10)' can't be established.
ED25519 key fingerprint is SHA256:9fT2kL0qX8vN4cR1yB6sW3mZ7aH5dE0uJ2pG8oK1iVc.
This key is not known by any other names.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '192.0.2.10' (ED25519) to the list of known hosts.
user

После сохранения ключа в known_hosts этот вопрос при подключении к тому же серверу больше не появлялся. Если отпечаток отличается от значения, полученного от администратора сервера, введите no. После ввода no ssh завершился без подключения.

ssh user@192.0.2.10
The authenticity of host '192.0.2.10 (192.0.2.10)' can't be established.
ED25519 key fingerprint is SHA256:9fT2kL0qX8vN4cR1yB6sW3mZ7aH5dE0uJ2pG8oK1iVc.
This key is not known by any other names.
Are you sure you want to continue connecting (yes/no/[fingerprint])? no
Host key verification failed.

При завершении через no файл known_hosts не был создан. Поэтому при следующем подключении тот же вопрос появится снова.

2️⃣ Опции команды SSH

Опции ssh пишутся перед целью подключения. При запуске одного ssh список доступных опций вывелся в виде справки по использованию.

ssh
usage: ssh [-46AaCfGgKkMNnqsTtVvXxYy] [-B bind_interface] [-b bind_address]
           [-c cipher_spec] [-D [bind_address:]port] [-E log_file]
           [-e escape_char] [-F configfile] [-I pkcs11] [-i identity_file]
           [-J destination] [-L address] [-l login_name] [-m mac_spec]
           [-O ctl_cmd] [-o option] [-P tag] [-p port] [-R address]
           [-S ctl_path] [-W host:port] [-w local_tun[:remote_tun]]
           destination [command [argument ...]]
       ssh [-Q query_option]

Если указать опцию, которой нет в справке по использованию, появится ошибка [unknown option] вместе с той же справкой.

-V выводит установленную версию клиента OpenSSH. Ниже — результат подключающегося сервера AlmaLinux; на принимающем подключение сервере Debian 12 появилось OpenSSH_9.2p1.

ssh -V
OpenSSH_9.9p1, OpenSSL 3.5.1 1 Jul 2025

-G не подключается к серверу, а объединяет указанные опции с файлами конфигурации и выводит значения, которые будут применены на самом деле. Полный вывод — 87 строк, поэтому нужные строки мы отбираем через grep.

ssh -G user@example.com | grep -E "^(user|hostname|port|identityfile|connecttimeout|stricthostkeychecking|serveraliveinterval) "
user user
hostname example.com
port 22
stricthostkeychecking ask
serveraliveinterval 0
identityfile ~/.ssh/id_rsa
identityfile ~/.ssh/id_ecdsa
identityfile ~/.ssh/id_ecdsa_sk
identityfile ~/.ssh/id_ed25519
identityfile ~/.ssh/id_ed25519_sk
identityfile ~/.ssh/id_xmss
identityfile ~/.ssh/id_dsa
connecttimeout none

Семь строк identityfile — это файлы ключей по умолчанию, которые ssh по порядку ищет, если -i не указан. connecttimeout none означает, что время ожидания подключения отдельно не задано.

ОпцияКопироватьОписание
-lУчётная записьУказывает имя учётной записи для подключения
-pПортУказывает порт подключения (по умолчанию 22)
-iФайл ключаУказывает файл закрытого ключа
-vВыводит ход подключения строками debug1
-CСжимает передаваемые данные
-XПеренаправление X11 (удалённые GUI-программы)
-TНе выделяет псевдотерминал
-tПринудительно выделяет псевдотерминал
-nПеренаправляет стандартный ввод в /dev/null
-qСокращает предупреждения и информационные сообщения
-oпараметр=значениеЗадаёт параметр файла конфигурации только для этого подключения
-LЛокальный проброс портов
-FУказывает файл конфигурации
-GВыводит применяемые настройки без подключения
-VВыводит версию клиента OpenSSH
ОпцияКопироватьОписание
-NТолько держит соединение, без удалённой команды
-JПодключается через другой сервер

3️⃣ Опция ssh -l и проброс портов с -L

-l — это опция, указывающая имя учётной записи для подключения. ssh -l user 192.0.2.10 подключился под той же учётной записью, что и ssh user@192.0.2.10.

ssh -l user 192.0.2.10 whoami
user

Проверка через -G показала, что учётная запись из -l попала в пункт user.

ssh -G -l admin example.com | grep -E "^(user|hostname|port) "
user admin
hostname example.com
port 22

Через -G мы проверили и то, что применяется, если указать одновременно -l и учётная-запись@адрес. В OpenSSH 9.9p1 применился admin, указанный в -l.

ssh -G -l admin user@example.com | grep -E "^(user|hostname) "
user admin
hostname example.com

Заглавная -L похожа по названию, но это опция локального проброса портов, не связанная с учётной записью. Она пропускает соединения, приходящие на порт вашего сервера, через SSH-соединение и связывает их с адресом и портом на стороне удалённого сервера.

8080:localhost:80 означает связать порт 8080 вашего сервера с портом 80 localhost, если смотреть с удалённого сервера. Проверка через -G показала то же значение в пункте localforward.

ssh -G -L 8080:localhost:80 user@example.com | grep -E "^(hostname|localforward) "
hostname example.com
localforward 8080 [localhost]:80

Если нужно только держать туннель открытым, добавьте ещё -N, которая поддерживает соединение без удалённой команды.

4️⃣ Указание порта и файла ключа SSH

Если SSH-сервер принимает подключения на порту, отличном от 22, укажите порт через -p. -i указывает файл закрытого ключа с нестандартным именем.

ssh -G -p 2222 -i ./mykey user@example.com | grep -E "^(user|hostname|port|identityfile) "
user user
hostname example.com
port 2222
identityfile ./mykey

После указания -i семь строк файлов ключей по умолчанию исчезли, и остался только указанный файл.

Файлы ключей создаются через ssh-keygen. Если ключ уже используется, задайте в -f новое имя файла. Ниже — результат создания ключа ed25519 с новым именем mykey.

ssh-keygen -t ed25519 -f ./mykey -N "" -C "user@example.com"
Generating public/private ed25519 key pair.
Your identification has been saved in ./mykey
Your public key has been saved in ./mykey.pub
The key fingerprint is:
SHA256:XLbhLZHSNdMvUqhSIbzRNJi/zKKkNnWmy0mTeBoUfaY user@example.com
The key's randomart image is:
+--[ED25519 256]--+
|       ..=+.+o   |
|     .  =oo+.oo  |
|    . . +=B. . . |
|     . =o=o=. . .|
|    . E S++... . |
|   . .o.+ +.     |
|    o+== .       |
|    +*oo         |
|   ...+.         |
+----[SHA256]-----+

mykey — закрытый ключ, а mykey.pub — открытый ключ. Руководство OpenSSH предписывает поместить открытый ключ в ~/.ssh/authorized_keys на сервере, к которому вы подключаетесь. Это делается через ssh-copy-id, например [ssh-copy-id -i ./mykey.pub user@192.0.2.10].

Если вы часто подключаетесь к одному серверу, запишите псевдоним в ~/.ssh/config и вводите только ssh и псевдоним. Строка Host — это псевдоним, а строки под ней — значения, применяемые при подключении по этому псевдониму.

Host myserver
    HostName 192.0.2.10
    User user
    Port 2222
    IdentityFile ~/.ssh/mykey

Когда мы записали эти настройки в файл ./config и прочитали его через -F, адрес, учётная запись, порт и файл ключа применились по одному псевдониму.

ssh -F ./config -G myserver | grep -E "^(user|hostname|port|identityfile) "
user user
hostname 192.0.2.10
port 2222
identityfile ~/.ssh/mykey

Опции, указанные в командной строке, имеют приоритет над файлом конфигурации. Когда мы добавили -p 22 к тому же псевдониму, port сменился на 22.

ssh -F ./config -G -p 22 myserver | grep -E "^(hostname|port) "
hostname 192.0.2.10
port 22

hostname остался 192.0.2.10 из файла конфигурации, и сменился только port — на значение из командной строки.

5️⃣ Выполнение удалённых команд через SSH

Если после цели подключения написать команду, ssh выполнит только её без экрана входа и закроет соединение. Если команд несколько или в них есть символы оболочки вроде точки с запятой, заключите их в одинарные кавычки.

ssh user@192.0.2.10 'whoami; hostname'
user
server2

Код возврата удалённой команды вернулся без изменений как код возврата ssh. В скриптах по этому значению судят, успешно ли выполнилась удалённая команда.

ssh user@192.0.2.10 'exit 3'; echo $?
3

При таком запуске команды псевдотерминал не выделяется. tty, запущенный с -T, вывел [not a tty].

ssh -T user@192.0.2.10 tty
not a tty

Руководство ssh описывает -t как опцию для запуска полноэкранных программ на удалённом сервере. С -t появилось /dev/pts/0, а в конце ещё и сообщение о закрытии соединения.

ssh -t user@192.0.2.10 tty
/dev/pts/0
Connection to 192.0.2.10 closed.

С добавлением -q это сообщение не появилось.

ssh -t -q user@192.0.2.10 tty
/dev/pts/0

-n перенаправляет стандартный ввод ssh в /dev/null. Без -n удалённый cat вывел как есть hello, переданный через конвейер.

echo hello | ssh user@192.0.2.10 cat
hello
echo hello | ssh -n user@192.0.2.10 cat

С -n в той же команде hello не дошёл до удалённого cat, и ничего не было выведено.

6️⃣ Ошибки подключения SSH и отладка с ssh -v

Если подключиться не удаётся, сначала по сообщению об ошибке определите, на каком этапе всё остановилось. Когда адрес сервера не нашёлся, появилось [Could not resolve hostname].

ssh user@nosuchhost.invalid
ssh: Could not resolve hostname nosuchhost.invalid: Name or service not known

Если адрес верный, но на этом порту никто не отвечает, появляется [Connection timed out]. С -o ConnectTimeout=5 попытка завершилась этой ошибкой через 5 секунд.

ssh -o ConnectTimeout=5 -p 2222 user@192.0.2.10
ssh: connect to host 192.0.2.10 port 2222: Connection timed out

При подключении с -o BatchMode=yes к серверу, которого нет в known_hosts, ssh завершился с [Host key verification failed.], не спрашивая о ключе хоста. Чтобы первое подключение в скрипте не останавливалось на вопросе, используют StrictHostKeyChecking=accept-new.

ssh -o BatchMode=yes user@192.0.2.10 true
Host key verification failed.

Согласно руководству ssh_config, accept-new без вопроса сохраняет ключ хоста только ранее не встречавшихся серверов. Если приходит ключ, отличный от сохранённого, подключение отклоняется.

ssh -o StrictHostKeyChecking=accept-new user@192.0.2.10 whoami
Warning: Permanently added '192.0.2.10' (ED25519) to the list of known hosts.
user

Если для учётной записи не зарегистрирован ключ, появляется [Permission denied (publickey)]. Повторяющиеся ошибки аутентификации могут привести к тому, что сервер заблокирует подключающийся IP.

-v выводит ход подключения строками debug1. Полный вывод превышает 70 строк, поэтому ниже только строки этапов подключения и аутентификации, отобранные через grep.

ssh -v -i ~/.ssh/id_ed25519 user@192.0.2.10 true 2>&1 | grep -E 'Connecting to|Connection established|remote software version|Server host key|is known and matches|can continue|Offering public key|Authenticated to|Exit status'
debug1: Connecting to 192.0.2.10 [192.0.2.10] port 22.
debug1: Connection established.
debug1: Remote protocol version 2.0, remote software version OpenSSH_9.2p1 Debian-2+deb12u10
debug1: Server host key: ssh-ed25519 SHA256:9fT2kL0qX8vN4cR1yB6sW3mZ7aH5dE0uJ2pG8oK1iVc
debug1: Host '192.0.2.10' is known and matches the ED25519 host key.
debug1: Authentications that can continue: publickey,password
debug1: Offering public key: /root/.ssh/id_ed25519 ED25519 SHA256:4bN7qT1xW9cK3mR6yH0sD2fL8vZ5aJ1eP7uG3oX4iQs explicit
Authenticated to 192.0.2.10 ([192.0.2.10]:22) using "publickey".
debug1: Exit status 0

Строка Connecting to — это попытка подключения, а строки Server host key и is known and matches — проверка ключа хоста. В строке Offering public key ключ был предложен, а в строке Authenticated to аутентификация по ключу завершилась. Если всё останавливается на аутентификации, сначала проверьте, появляется ли нужный файл ключа в строке Offering public key.

С добавлением -C значение compression в строке kex сменилось с none на zlib@openssh.com.

ssh -v -C user@192.0.2.10 true 2>&1 | grep -E 'compression'
debug1: kex: server->client cipher: aes256-gcm@openssh.com MAC: <implicit> compression: zlib@openssh.com
debug1: kex: client->server cipher: aes256-gcm@openssh.com MAC: <implicit> compression: zlib@openssh.com
debug1: Enabling compression at level 6.

-X — это опция, которая выводит окна GUI-программ удалённого сервера на ваш компьютер. При запуске на сервере AlmaLinux без экрана появилась строка debug1 о том, что DISPLAY нет.

ssh -v -X user@192.0.2.10 true 2>&1 | grep DISPLAY
debug1: X11 forwarding requested but DISPLAY not set

DISPLAY — это переменная окружения, задающая, где показывать окна GUI. Поэтому -X используют при подключении с компьютера с рабочим столом.

🔲 Симулятор команды SSH

В симуляторе ниже можно подключиться по ssh к виртуальному серверу и самостоятельно ввести и проверить опции, удалённые команды и ssh -G.

Симулятор команды SSHAlmaLinux 9.8 → Debian 12
[root@server work]#
Работает только в браузере и не подключается ни к какому реальному серверу. Клавишами ↑↓ можно вызвать ранее введённые команды.

🔢 FAQ & рекомендуемые материалы

С -o ServerAliveInterval=60 каждые 60 секунд на сервер отправляется сигнал, поддерживающий соединение. Проверка через -G показала, что serveraliveinterval сменился со значения по умолчанию 0 на 60. Чтобы не писать это каждый раз, добавьте тот же пункт под Host в ~/.ssh/config.

В справке по использованию ssh нет опции, принимающей пароль. При аутентификации по паролю его вводят по запросу во время подключения, а для задач, которые должны подключаться автоматически, используют аутентификацию по ключу, созданному через ssh-keygen.

Укажите в -J промежуточный сервер. При проверке [ssh -J admin@bastion.example.com user@192.0.2.10] через -G промежуточный сервер попал в пункт proxyjump.

🔗 Рекомендуемые материалы
Ключ SSH ssh-keygen: создание SSH-ключей, регистрация открытого ключа и использование ssh-copy-id Статья о том, как создать через ssh-keygen пару ключей для SSH-подключений, проверить отпечаток и зарегистрировать открытый ключ в authorized_keys на сервере через ssh-copy-id. Читать → Симулятор команды ssh-keygen создаёт deploy_key с пустой парольной фразой в -N и показывает место сохранения, отпечаток и randomart

ℹ️ О партнёрских ссылках
Материалы этого сайта содержат партнёрские ссылки. Если посетитель покупает товар или услугу по такой ссылке, сайт получает комиссию от продавца. При этом сумма, которую платит покупатель (при акционных скидках сумма снижается ↓), не увеличивается. Указанные цены, скидки и наличие актуальны на момент написания и могут отличаться, поэтому перед покупкой уточняйте их у продавца. Товары выбираются и оцениваются по нашим собственным критериям, а комиссия не влияет ни на порядок, ни на содержание обзоров.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Докажите, что вы человек: 4   +   1   =