Polecenie SSH: użycie opcji -l, -p i -i oraz sprawdzanie błędów połączenia

Środowisko testoweRodzina RHELAlmaLinux 9.8OpenSSH 9.9p1Strona odbierająca Debian 12 · OpenSSH 9.2p1 zwykłe kontokonto root
Polecenia sieciowesshLokalizacja/usr/bin/ssh

Polecenie SSH to polecenie klienta OpenSSH, które w postaci ssh konto@adres-serwera łączy się przez szyfrowane połączenie ze zdalnym serwerem Linux i uruchamia polecenia na serwerze, z którym się połączyło. Uruchomiliśmy ssh z serwera AlmaLinux 9 do serwera Debian 12 i sprawdziliśmy po kolei wszystko, od kontroli klucza hosta przy pierwszym połączeniu, przez opcje -l, -p i -i oraz uruchamianie zdalnych poleceń, aż po wyjście debugowania -v. Okazało się, że to, jak opcje są faktycznie stosowane, można sprawdzić z góry poleceniem ssh -G, bez łączenia się.

Poniższe wyjście to dokładnie wynik z obu serwerów. Adres serwera i konto, nazwę hosta, ścieżkę i odcisk klucza oraz numery wersji OpenSSL i jądra serwera, który się łączy, zastąpiono przykładowymi wartościami. Łączący się serwer AlmaLinux używa konta root, a serwer Debian przyjmujący połączenie używa zwykłego konta.

1️⃣ Podstawowe użycie polecenia SSH

Aby zalogować się na zdalny serwer, po ssh wpisuje się nazwę konta i adres serwera połączone znakiem @. Po zalogowaniu znak zachęty zmienia się na znak zachęty serwera, z którym się połączono, a wpisanie exit kończy połączenie i wraca do pierwotnego serwera.

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.

Serwer Debian, z którym się połączyliśmy, przy logowaniu pokazał też kilka wierszy komunikatu serwera (motd) i powiadomienie o poczcie; z wyjścia powyżej usunięto tylko te wiersze.

Przy pierwszym połączeniu z serwerem ssh przed logowaniem wyświetla odcisk klucza hosta serwera i pyta, czy kontynuować połączenie. Po wpisaniu yes klucz hosta został zapisany w ~/.ssh/known_hosts, a potem pojawił się wynik 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

Po zapisaniu klucza w known_hosts pytanie nie pojawiło się już przy kolejnych połączeniach z tym samym serwerem. Jeśli odcisk różni się od wartości otrzymanej od administratora serwera, wpisz no. Po wpisaniu no ssh zakończył działanie bez połączenia.

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.

Po zakończeniu przez no plik known_hosts nie został utworzony. Dlatego przy następnym połączeniu znów pojawia się to samo pytanie.

2️⃣ Opcje polecenia SSH

Opcje ssh wpisuje się przed celem połączenia. Po uruchomieniu samego ssh pojawiła się jako sposób użycia lista dostępnych opcji.

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]

Jeśli podasz opcję, której nie ma w sposobie użycia, pojawi się błąd [unknown option] razem z tym samym sposobem użycia.

-V wyświetla zainstalowaną wersję klienta OpenSSH. Poniżej jest wynik z łączącego się serwera AlmaLinux; na serwerze Debian 12 przyjmującym połączenie pojawiło się OpenSSH_9.2p1.

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

-G nie łączy się z serwerem, tylko łączy podane opcje z plikami konfiguracji i wyświetla wartości, które zostaną faktycznie zastosowane. Pełne wyjście ma 87 wierszy, więc poleceniem grep wybieramy tylko potrzebne wiersze.

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

Siedem wierszy identityfile to domyślne pliki kluczy, których ssh szuka po kolei, gdy nie podano -i. connecttimeout none oznacza, że nie ustawiono osobnego czasu oczekiwania na połączenie.

OpcjaKopiujOpis
-lKontoWskazuje nazwę konta do połączenia
-pPortWskazuje port do połączenia (domyślnie 22)
-iPlik kluczaWskazuje plik klucza prywatnego
-vWyświetla przebieg połączenia w wierszach debug1
-CKompresuje przesyłane dane
-XPrzekierowanie X11 (zdalne programy GUI)
-TNie przydziela pseudoterminala
-tWymusza przydzielenie pseudoterminala
-nPrzekierowuje standardowe wejście na /dev/null
-qOgranicza ostrzeżenia i komunikaty informacyjne
-oopcja=wartośćUstawia opcję pliku konfiguracji tylko dla tego połączenia
-LLokalne przekierowanie portów
-FWskazuje plik konfiguracji
-GWyświetla ustawienia, które zostaną użyte, bez łączenia
-VWyświetla wersję klienta OpenSSH
OpcjaKopiujOpis
-NUtrzymuje samo połączenie, bez zdalnego polecenia
-JŁączy się przez inny serwer

3️⃣ Opcja ssh -l i przekierowanie portów z -L

-l to opcja wskazująca nazwę konta do połączenia. ssh -l user 192.0.2.10 połączyło się tym samym kontem co ssh user@192.0.2.10.

ssh -l user 192.0.2.10 whoami
user

Sprawdzenie przez -G pokazało, że konto podane w -l trafiło do pozycji user.

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

Przez -G sprawdziliśmy też, co obowiązuje, gdy wpisze się razem -l i konto@adres. W OpenSSH 9.9p1 zastosowano admin, czyli konto podane w -l.

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

Wielkie -L ma podobną nazwę, ale jest opcją lokalnego przekierowania portów, która nie ma związku z kontem. Przepuszcza połączenia przychodzące na port Twojego serwera przez połączenie SSH i łączy je z adresem i portem po stronie zdalnego serwera.

8080:localhost:80 oznacza połączenie portu 8080 Twojego serwera z portem 80 hosta localhost widzianego od strony zdalnego serwera. Sprawdzenie przez -G pokazało tę samą wartość w pozycji localforward.

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

Gdy chcesz tylko utrzymać otwarty tunel, dodaj też -N, które utrzymuje połączenie bez zdalnego polecenia.

4️⃣ Wskazanie portu i pliku klucza SSH

Jeśli serwer SSH przyjmuje połączenia na porcie innym niż 22, wskaż port opcją -p. -i wskazuje plik klucza prywatnego, który nie ma domyślnej nazwy.

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

Po podaniu -i zniknęło siedem wierszy domyślnych plików kluczy i został tylko wskazany plik.

Pliki kluczy tworzy się poleceniem ssh-keygen. Jeśli używasz już jakiegoś klucza, podaj nową nazwę pliku w -f. Poniżej jest wynik utworzenia klucza ed25519 o nowej nazwie 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 to klucz prywatny, a mykey.pub to klucz publiczny. Podręcznik OpenSSH zaleca umieszczenie klucza publicznego w ~/.ssh/authorized_keys na serwerze, z którym będziesz się łączyć. Można to zrobić poleceniem ssh-copy-id, np. [ssh-copy-id -i ./mykey.pub user@192.0.2.10].

Jeśli często łączysz się z tym samym serwerem, wpisz alias w ~/.ssh/config i wpisuj tylko ssh oraz alias. Wiersz Host to alias, a wiersze pod nim to wartości stosowane przy połączeniu przez ten alias.

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

Po wpisaniu tych ustawień do pliku ./config i wczytaniu go przez -F adres, konto, port i plik klucza zostały zastosowane jednym aliasem.

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

Opcje wpisane w wierszu poleceń mają pierwszeństwo przed plikiem konfiguracji. Po dodaniu -p 22 do tego samego aliasu port zmienił się na 22.

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

hostname pozostał 192.0.2.10 z pliku konfiguracji, a zmienił się tylko port na wartość z wiersza poleceń.

5️⃣ Uruchamianie zdalnych poleceń przez SSH

Jeśli po celu połączenia wpiszesz polecenie, ssh uruchomi tylko to polecenie bez ekranu logowania i zakończy połączenie. Gdy poleceń jest kilka albo są w nich symbole powłoki, takie jak średnik, ujmij całość w apostrofy.

ssh user@192.0.2.10 'whoami; hostname'
user
server2

Kod wyjścia zdalnego polecenia wrócił bez zmian jako kod wyjścia ssh. W skryptach ta wartość mówi, czy zdalne polecenie się powiodło.

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

Przy takim uruchomieniu polecenia pseudoterminal nie jest przydzielany. tty uruchomione z -T wyświetliło [not a tty].

ssh -T user@192.0.2.10 tty
not a tty

Podręcznik ssh opisuje -t jako opcję do uruchamiania na zdalnym serwerze programów pełnoekranowych. Z -t pojawiło się /dev/pts/0, a na końcu także komunikat o zamknięciu połączenia.

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

Po dodaniu -q ten komunikat się nie pojawił.

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

-n przekierowuje standardowe wejście ssh na /dev/null. Bez -n zdalny cat wyświetlił bez zmian hello przekazane przez potok.

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

Po dodaniu -n do tego samego polecenia hello nie dotarło do zdalnego cat i nic nie zostało wyświetlone.

6️⃣ Błędy połączenia SSH i debugowanie z ssh -v

Gdy nie da się połączyć, najpierw sprawdź w komunikacie błędu, na którym etapie się zatrzymało. Gdy nie znaleziono adresu serwera, pojawiło się [Could not resolve hostname].

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

Jeśli adres jest poprawny, ale na tym porcie nic nie odpowiada, pojawia się [Connection timed out]. Z -o ConnectTimeout=5 próba zakończyła się tym błędem po 5 sekundach.

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

Po połączeniu z -o BatchMode=yes z serwerem, którego nie było w known_hosts, ssh zakończył działanie komunikatem [Host key verification failed.] bez pytania o klucz hosta. Aby pierwsze połączenie w skrypcie nie zatrzymywało się na pytaniu, używa się StrictHostKeyChecking=accept-new.

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

Według podręcznika ssh_config accept-new bez pytania zapisuje tylko klucz hosta serwerów wcześniej niewidzianych. Gdy przyjdzie klucz inny niż już zapisany, połączenie zostaje odrzucone.

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

Jeśli dla konta nie zarejestrowano klucza, pojawia się [Permission denied (publickey)]. Powtarzające się nieudane uwierzytelnienia mogą sprawić, że serwer zablokuje łączący się adres IP.

-v wyświetla przebieg połączenia w wierszach debug1. Pełne wyjście ma ponad 70 wierszy, więc poniżej są tylko wiersze etapów połączenia i uwierzytelniania wybrane poleceniem 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

Wiersz Connecting to to próba połączenia, a wiersze Server host key i is known and matches to kontrola klucza hosta. W wierszu Offering public key klucz został zaoferowany, a w wierszu Authenticated to uwierzytelnianie kluczem się zakończyło. Jeśli zatrzymuje się na uwierzytelnianiu, najpierw sprawdź, czy w wierszu Offering public key pojawia się właściwy plik klucza.

Po dodaniu -C wartość compression w wierszu kex zmieniła się z none na 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 to opcja, która przenosi na Twój komputer okna programów GUI ze zdalnego serwera. Uruchomiona na serwerze AlmaLinux bez ekranu dała wiersz debug1 o braku DISPLAY.

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

DISPLAY to zmienna środowiskowa, która określa, gdzie wyświetlać okna GUI. Dlatego -X stosuje się przy łączeniu z komputera z pulpitem graficznym.

🔲 Symulator polecenia SSH

W symulatorze poniżej możesz połączyć się przez ssh z wirtualnym serwerem i samodzielnie wpisać oraz sprawdzić opcje, zdalne polecenia i ssh -G.

Symulator polecenia SSHAlmaLinux 9.8 → Debian 12
[root@server work]#
Działa tylko w przeglądarce i nie łączy się z żadnym prawdziwym serwerem. Klawiszami ↑↓ przywołasz wcześniej wpisane polecenia.

🔢 FAQ & polecane treści

Z -o ServerAliveInterval=60 co 60 sekund do serwera wysyłany jest sygnał podtrzymujący połączenie. Sprawdzenie przez -G pokazało, że serveraliveinterval zmienił się z domyślnego 0 na 60. Aby nie wpisywać tego za każdym razem, dodaj tę samą pozycję pod Host w ~/.ssh/config.

W sposobie użycia ssh nie ma opcji przyjmującej hasło. Przy uwierzytelnianiu hasłem wpisuje się je, gdy padnie pytanie podczas łączenia; w zadaniach, które muszą łączyć się automatycznie, uwierzytelnia się kluczem utworzonym przez ssh-keygen.

W -J wpisz serwer pośredni. Po sprawdzeniu [ssh -J admin@bastion.example.com user@192.0.2.10] przez -G ten serwer pojawił się w pozycji proxyjump.

ℹ️ Informacja o linkach partnerskich
Treści tej witryny zawierają linki partnerskie. Jeśli odwiedzający kupi produkt lub usługę przez taki link, witryna otrzymuje od sprzedawcy prowizję. Kwota płacona przy tym przez kupującego (podczas promocji spada↓) nie wzrasta. Podane ceny, rabaty i dostępność odnoszą się do chwili pisania i mogą różnić się od stanu faktycznego, dlatego przed zakupem sprawdź je u sprzedawcy. Produkty wybieramy i oceniamy według własnych kryteriów, a prowizja nie wpływa ani na kolejność prezentacji, ani na treść ocen.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Wymagane pola są oznaczone *

Prove your humanity: 5   +   3   =