Как подключиться по SSH: пароль, ключ, порт и частые ошибки

опубликовано
читать
≈ 10 мин
автор
среда и версия
Debian 12, OpenSSH 9.2p1, bash 5.2
содержание пройти тест Linux

Подключиться к серверу по SSH можно одной командой: ssh пользователь@адрес, например ssh dev@203.0.113.10. В первый раз ssh спросит, доверять ли ключу сервера, потом попросит пароль. Для постоянной работы пароль заменяют ключом: ssh-keygen создаёт пару ключей, а ssh-copy-id кладёт открытую часть на сервер. Ниже каждый шаг показан с настоящим выводом, а ошибки разобраны по шагу, на котором они случаются.

Linux / 01

Три проверки при входе по SSH

Три проверки при входе по SSHСлева компьютер dev@laptop с файлами known_hosts, где лежат ключи серверов, и id_ed25519 — закрытым ключом. Справа сервер 203.0.113.10 с собственным ключом ssh_host_*_key и файлом authorized_keys с открытыми ключами. Шаг 01: компьютер соединяется с портом 22; если не вышло — Connection refused или Connection timed out. Шаг 02: сервер показывает свой ключ, компьютер сверяет его с known_hosts; не совпал — Host key verification failed. Шаг 03: ты показываешь ключ или пароль, сервер сверяет ключ с authorized_keys; не подошёл — Permission denied (publickey).laptop · 203.0.113.20server · 203.0.113.10Компьютерdev@laptopknown_hostsключи серверовid_ed25519закрытый ключСерверsshd, порт 22ssh_host_*_keyключ сервераauthorized_keysоткрытые ключи01 соединение с портом 22Connection refused · timed out02 сервер показывает свой ключHost key verification failed03 ты показываешь ключ или парольPermission denied (publickey)
Текст ошибки говорит, на каком шаге остановился вход: refused и timed out — до sshd не достучались, Host key verification failed — ты не доверяешь серверу, Permission denied — сервер не доверяет тебе.

Первое подключение по паролю

Для входа нужны адрес сервера, имя пользователя на нём и пароль. Их выдаёт хостинг или администратор. Клиент ssh входит в OpenSSH; если в Debian или Ubuntu его нет, он ставится пакетом openssh-client. Подключаемся к серверу 203.0.113.10 под пользователем dev:

ssh dev@203.0.113.10
The authenticity of host '203.0.113.10 (203.0.113.10)' can't be established.
ED25519 key fingerprint is SHA256:vpk9orgwNVRno8E4ILAKp4kybOM5TYlvdhxt4zKjW40.
This key is not known by any other names.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '203.0.113.10' (ED25519) to the list of known hosts.
dev@203.0.113.10's password:
dev@server:~$

Вопрос в первых строках — проверка сервера. ssh видит его впервые и показывает отпечаток его ключа. После yes ключ записывается в ~/.ssh/known_hosts, и при следующих входах ssh сверяет его молча. Пароль при вводе не отображается: ни звёздочек, ни движения курсора. Приглашение dev@server:~$ значит, что дальше команды выполняются на сервере.

Отвечать yes вслепую не стоит. Отпечаток можно сверить с тем, что печатает сам сервер: в веб-консоли хостинга или у администратора.

ssh-keygen -lf /etc/ssh/ssh_host_ed25519_key.pub
256 SHA256:vpk9orgwNVRno8E4ILAKp4kybOM5TYlvdhxt4zKjW40 root@server (ED25519)

Отпечатки совпали, значит, отвечает тот самый сервер. Закончить сеанс можно командой exit или сочетанием Ctrl+D:

exit
logout
Connection to 203.0.113.10 closed.

Вход по ключу: ssh-keygen и ssh-copy-id

Ключ надёжнее пароля и избавляет от его ввода. Ключей два: закрытый остаётся на твоём компьютере, открытый кладут на сервер в файл ~/.ssh/authorized_keys. При входе сервер просит доказать, что закрытый ключ у тебя, и сам этот ключ не получает.

Пару создаёт ssh-keygen. Тип ed25519 даёт короткий ключ: открытая часть — строка меньше сотни символов. Параметр -C добавляет комментарий, чтобы на сервере было видно, чей это ключ:

ssh-keygen -t ed25519 -C "dev@laptop"
Generating public/private ed25519 key pair.
Enter file in which to save the key (/home/dev/.ssh/id_ed25519):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/dev/.ssh/id_ed25519
Your public key has been saved in /home/dev/.ssh/id_ed25519.pub
The key fingerprint is:
SHA256:YjxZo3fUxtq61V6h+oQfU0oa4AWz/pw40trS9irvdqw dev@laptop

На вопрос о файле хватит Enter. Дальше ssh-keygen просит фразу-пароль для самого ключа: если файл утечёт, без фразы им не воспользоваться. В конце программа рисует картинку из символов, randomart, — её можно не читать.

Права на новые файлы ssh-keygen выставил сам. Закрытый ключ читает и меняет только владелец, открытый читают все:

stat -c "%a %n" ~/.ssh ~/.ssh/id_ed25519 ~/.ssh/id_ed25519.pub
700 /home/dev/.ssh
600 /home/dev/.ssh/id_ed25519
644 /home/dev/.ssh/id_ed25519.pub

Главная мысль: закрытый ключ id_ed25519 никуда не копируют и никому не пересылают. На сервер уходит только открытый — файл с окончанием .pub.

Положить открытый ключ на сервер проще всего через ssh-copy-id. Он в последний раз спросит пароль и допишет ключ в ~/.ssh/authorized_keys, создав каталог и файл, если их нет:

ssh-copy-id dev@203.0.113.10
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/home/dev/.ssh/id_ed25519.pub"
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
dev@203.0.113.10's password:

Number of key(s) added: 1

Now try logging into the machine, with:   "ssh 'dev@203.0.113.10'"
and check to make sure that only the key(s) you wanted were added.

Если ssh-copy-id нет, ту же работу сделает одна команда. Она создаёт ~/.ssh с правами 700, дописывает ключ в конец authorized_keys и закрывает файл от чужих:

cat ~/.ssh/id_ed25519.pub | ssh dev@203.0.113.10 'mkdir -p ~/.ssh && chmod 700 ~/.ssh && cat >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys'

Теперь ssh спрашивает не пароль от сервера, а фразу от ключа:

ssh dev@203.0.113.10
Enter passphrase for key '/home/dev/.ssh/id_ed25519':
Last login: Sun Oct 18 14:47:48 2026 from 203.0.113.20
dev@server:~$

Чтобы не вводить фразу при каждом подключении, ключ держит в памяти ssh-agent. Фразу спросят один раз, дальше до конца сеанса терминала ssh входит без вопросов:

eval "$(ssh-agent -s)"
ssh-add
Agent pid 634
Enter passphrase for /home/dev/.ssh/id_ed25519:
Identity added: /home/dev/.ssh/id_ed25519 (dev@laptop)

С ключом в агенте удобно выполнять команды на сервере, не открывая сеанс. Команду пишут после адреса, ssh возвращает её вывод и закрывает соединение:

ssh dev@203.0.113.10 hostname
server

Когда вход по ключу работает, пароль на сервере лучше выключить: подбирать его станет бесполезно. Настройки сервера лежат в /etc/ssh/sshd_config. В Debian и Ubuntu он подключает ещё файлы из /etc/ssh/sshd_config.d/, туда и положи свою строку. sshd -t проверяет настройки до перезагрузки службы:

echo "PasswordAuthentication no" | sudo tee /etc/ssh/sshd_config.d/nopass.conf
sudo sshd -t && sudo systemctl reload ssh

sshd -T печатает настройки, с которыми сервер работает на самом деле:

sudo sshd -T | grep -E '^(passwordauthentication|port) '
port 22
passwordauthentication no

Не закрывай текущий сеанс, пока не проверишь вход из второго окна терминала. Перезагрузка настроек не рвёт уже открытое соединение, а новое при ошибке в настройках не пустит. Из старого окна ошибку можно исправить.

Нестандартный порт и файл ~/.ssh/config

По умолчанию ssh подключается к порту 22. Если SSH на сервере перенесли, например на порт 2222, без параметра -p соединение упрётся в закрытый порт:

ssh dev@203.0.113.10
ssh: connect to host 203.0.113.10 port 22: Connection refused

С номером порта всё работает:

ssh -p 2222 dev@203.0.113.10
Enter passphrase for key '/home/dev/.ssh/id_ed25519':
Last login: Sun Oct 18 14:49:26 2026 from 203.0.113.20
dev@server:~$

У scp, который копирует файлы через SSH, порт задаётся большой буквой -P. Маленькая -p там уже занята: она сохраняет даты и права файла.

scp -P 2222 report.txt dev@203.0.113.10:/tmp/
report.txt                                    100%   10    49.8KB/s   00:00

Чтобы не набирать адрес, пользователя и порт каждый раз, опиши сервер в ~/.ssh/config. Писать в этот файл должен только ты, поэтому после создания выполни chmod 600 ~/.ssh/config:

Host myserver
    HostName 203.0.113.10
    User dev
    Port 2222
    IdentityFile ~/.ssh/id_ed25519

Теперь хватает имени из строки Host, и оно работает во всех командах OpenSSH:

ssh myserver hostname
scp report.txt myserver:
server
report.txt                                    100%   10    46.5KB/s   00:00

Какие настройки применятся к серверу, показывает ssh -G. Он печатает итог разбора конфигурации и не подключается:

ssh -G myserver | grep -E '^(user|hostname|port|identityfile) '
user dev
hostname 203.0.113.10
port 2222
identityfile ~/.ssh/id_ed25519

Ошибки, на которых спотыкаются

По тексту ошибки видно, на каком шаге со схемы выше остановился вход.

Connection refused. Сервер ответил, но на этом порту никто не слушает: sshd не запущен или работает на другом порту. Узнай номер порта у хостинга. Если на сервер можно попасть через веб-консоль, посмотри, какой порт ждёт подключений:

sudo ss -ltnp | grep -E 'sshd|systemd'
LISTEN 0      128          0.0.0.0:22         0.0.0.0:*    users:(("sshd",pid=1350,fd=4))
LISTEN 0      128             [::]:22            [::]:*    users:(("sshd",pid=1350,fd=5))

Номер после двоеточия — порт. В Ubuntu 24.04 порт держит сам systemd через ssh.socket и запускает sshd при первом подключении, поэтому там в строке может стоять systemd. Пустой вывод значит, что подключений никто не ждёт: запусти службу командой sudo systemctl start ssh.

Connection timed out. Ответа нет совсем: адрес неверный, сервер выключен или файрвол молча отбрасывает пакеты. ssh ждёт до таймаута, а -o ConnectTimeout=5 сокращает ожидание до пяти секунд:

ssh -o ConnectTimeout=5 dev@192.0.2.10
ssh: connect to host 192.0.2.10 port 22: Connection timed out

Похожая ошибка No route to host значит, что до адреса нет пути: машины с ним нет в сети или маршрутизатор сообщает, что она недоступна.

ssh -o ConnectTimeout=5 dev@203.0.113.99
ssh: connect to host 203.0.113.99 port 22: No route to host

Could not resolve hostname. Имя сервера не нашлось в DNS: в нём опечатка или домен ещё не направлен на сервер. Проверь написание или подключись по IP-адресу. Как имя превращается в адрес, разобрано в материале о DNS.

ssh dev@srever
ssh: Could not resolve hostname srever: Name or service not known

Host key verification failed. Сервер показал ключ, который не совпадает с записанным в known_hosts, и ssh отказался подключаться:

ssh dev@203.0.113.10
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!     @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
It is also possible that a host key has just been changed.
The fingerprint for the ED25519 key sent by the remote host is
SHA256:bY41Hg51MI54x0KHljewFZ8W/Ll3hxz7elG/8Z9x7DU.
Please contact your system administrator.
Add correct host key in /home/dev/.ssh/known_hosts to get rid of this message.
Offending ECDSA key in /home/dev/.ssh/known_hosts:3
  remove with:
  ssh-keygen -f "/home/dev/.ssh/known_hosts" -R "203.0.113.10"
Host key for 203.0.113.10 has changed and you have requested strict checking.
Host key verification failed.

Если сервер переустанавливали или адрес перешёл к другой машине, так и должно быть. Удали старую запись и подключись заново, сверив новый отпечаток:

ssh-keygen -R 203.0.113.10
# Host 203.0.113.10 found: line 1
# Host 203.0.113.10 found: line 2
# Host 203.0.113.10 found: line 3
/home/dev/.ssh/known_hosts updated.
Original contents retained as /home/dev/.ssh/known_hosts.old

Записей три, потому что после входа сервер сообщает клиенту ключи всех своих типов, и OpenSSH их запоминает. Если же на сервере ничего не менялось, не подключайся и спроси администратора: так выглядит и подмена сервера, о которой предупреждает сообщение.

Permission denied (publickey). Сервер не принял ни одного ключа, а вход по паролю у него выключен. Частая причина — не тот пользователь. Если не написать его перед @, ssh подставит имя, под которым ты работаешь локально. Здесь команду запустили от root:

ssh 203.0.113.10
root@203.0.113.10: Permission denied (publickey).

Какие ключи предлагает клиент и что отвечает сервер, видно с параметром -v:

ssh -v root@203.0.113.10 2>&1 | grep -E 'Authentications|Offering|No more|denied|Server accepts'
debug1: Authentications that can continue: publickey
debug1: Offering public key: /home/dev/.ssh/id_ed25519 ED25519 SHA256:YjxZo3fUxtq61V6h+oQfU0oa4AWz/pw40trS9irvdqw agent
debug1: Authentications that can continue: publickey
debug1: No more authentication methods to try.
root@203.0.113.10: Permission denied (publickey).

Клиент предложил ключ, сервер отказал: в authorized_keys у root этого ключа нет. Для пользователя dev тот же ключ проходит, и в выводе появляется строка Server accepts key.

Закрытый ключ доступен другим. ssh не берёт ключ, который могут прочитать другие пользователи, и продолжает без него:

chmod 644 ~/.ssh/id_ed25519
ssh dev@203.0.113.10
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@         WARNING: UNPROTECTED PRIVATE KEY FILE!          @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
Permissions 0644 for '/home/dev/.ssh/id_ed25519' are too open.
It is required that your private key files are NOT accessible by others.
This private key will be ignored.
Load key "/home/dev/.ssh/id_ed25519": bad permissions
dev@203.0.113.10: Permission denied (publickey).

Верни права командой chmod 600 ~/.ssh/id_ed25519. Что значат 600 и 644, разобрано в материале о правах доступа.

Сервер молча не принимает ключ. Клиент видит тот же Permission denied (publickey), а причина на сервере: ~/.ssh или домашний каталог открыты на запись другим. С настройкой StrictModes yes, а она включена по умолчанию, sshd такой ключ не принимает. Ответ ищи в журнале sshd на сервере, в Debian и Ubuntu это sudo journalctl -u ssh:

Authentication refused: bad ownership or modes for directory /home/dev/.ssh
Connection closed by authenticating user dev 203.0.113.20 port 54580 [preauth]

Чинят права: chmod 700 ~/.ssh, chmod 600 ~/.ssh/authorized_keys и chmod go-w ~ на сервере.

Пароль не подходит. После трёх неверных паролей ssh сдаётся. В скобках последней строки перечислены способы входа, которые сервер принимает:

dev@203.0.113.10's password:
Permission denied, please try again.
dev@203.0.113.10's password:
Permission denied, please try again.
dev@203.0.113.10's password:
dev@203.0.113.10: Permission denied (publickey,password).

Пароль вводится вслепую, поэтому сначала проверь раскладку и Caps Lock.

Порт для scp указали маленькой -p. scp принял 2222 за имя файла и пошёл на порт 22:

scp -p 2222 report.txt dev@203.0.113.10:
ssh: connect to host 203.0.113.10 port 22: Connection refused
scp: Connection closed

Частые вопросы

Как выйти из зависшей SSH-сессии

Если сервер перестал отвечать и терминал не реагирует даже на Ctrl+C, нажми по очереди Enter, ~ и .. Эту команду выполняет сам клиент ssh: он обрывает соединение и возвращает тебя в свой терминал.

Connection to 203.0.113.10 closed.

Тильда срабатывает только в начале строки, поэтому сначала Enter.

Почему сессия обрывается, если долго ничего не делать

Соединение без трафика обычно рвёт роутер или файрвол по дороге: они забывают соединения, по которым давно ничего не шло. ssh может сам проверять связь. Добавь в ~/.ssh/config блок для всех серверов:

Host *
    ServerAliveInterval 60

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

ssh -G myserver | grep -E '^serveralive'
serveralivecountmax 3
serveraliveinterval 60

Как скопировать файл с сервера

Поменяй местами источник и цель: сначала путь на сервере, потом локальный каталог. Для целого каталога добавь -r.

scp dev@203.0.113.10:report.txt /tmp/
report.txt                                    100%   10    33.1KB/s   00:00

Можно ли оставить ключ без фразы-пароля

Можно: на вопрос о фразе ssh-keygen примет пустой ответ. Но тогда любой, кто скопирует файл id_ed25519, войдёт на все серверы, где лежит твой открытый ключ. С фразой и ssh-agent её всё равно вводишь один раз за сеанс.

Где потренироваться

SSH — одна из тем карты навыков DevOps, рядом с правами, процессами и сетью. Проверить себя по Linux можно в тесте навыков: 8 вопросов, баллы видны без регистрации. Когда вход на сервер настроен, следующий шаг — расписание задач в crontab. Как завести на сервере отдельного пользователя и выдать ему sudo, разобрано в материале о пользователях и группах.

Источники