Uporaba datoteke SSH config (~/.ssh/config) s primeri

Linux Branje: 9 min

Če se povezuješ z več strežniki, se hitro naveličaš ukazov, kot je ssh -p 2222 -i ~/.ssh/id_ed25519_web janos@203.0.113.10. V konfiguracijski datoteki odjemalca SSH, datoteki ~/.ssh/config, lahko vsakemu strežniku daš kratko ime skupaj z naslovom, uporabniškim imenom, vrati in ključem, od tedaj pa zadošča ssh web1. Isto ime deluje tudi v ukazih scp, rsync, sftp in git.

Primere iz članka smo preizkusili novembra 2026: kot odjemalec z navideznega računalnika AlmaLinux 10.2 (OpenSSH 9.9) in iz macOS (OpenSSH 10.3), kot strežnik pa z računalniki Debian 13 (OpenSSH 10.0) in AlmaLinux 10.2. Nastavitve so potrebne na tvojem računalniku (prenosnik, namizni računalnik), ne na strežniku; enako jih lahko uporabiš za Linux VPS.

Kje je datoteka?

Sistem Lastne nastavitve Za vse uporabnike
Linux, macOS ~/.ssh/config /etc/ssh/ssh_config
Windows 10 in 11 (vgrajeni OpenSSH) C:\Users\<ime>\.ssh\config C:\ProgramData\ssh\ssh_config

Datoteka privzeto ne obstaja, ustvariti jo moraš sam. Poti v Windows veljajo po Microsoftovi dokumentaciji, tam datoteko shrani brez končnice (config, ne config.txt).

Ne zamenjaj je s konfiguracijsko datoteko strežnika: /etc/ssh/sshd_config (s črko d) na strežniku določa, kdo in kako se lahko prijavi. O tem govori članek Varnostne nastavitve strežnika SSH; osnove SSH predstavlja članek Linux Secure Shell (SSH).

Prvi vnos

Ustvari imenik in datoteko z ustreznimi dovoljenji:

mkdir -p ~/.ssh
chmod 700 ~/.ssh
touch ~/.ssh/config
chmod 600 ~/.ssh/config
nano ~/.ssh/config

Vnos za strežnik:

Host web1
    HostName 203.0.113.10
    Port 2222
    User janos
    IdentityFile ~/.ssh/id_ed25519_web
    IdentitiesOnly yes

Po shranjevanju povezava:

ssh web1

To naredi natanko isto kot ssh -p 2222 -i ~/.ssh/id_ed25519_web janos@203.0.113.10. Zamik vrstic za vrstico Host ni obvezen, le naredi datoteko preglednejšo; vnos traja do naslednje vrstice Host.

Datoteka ~/.ssh/config z vnosom web1 in blokom Host *, ukaz ssh web1 hostname in dejanske nastavitve, ki jih izpiše ssh -G, v sistemu AlmaLinux 10.2

Najpogostejše nastavitve

Nastavitev Za kaj je Ustreznica v ukazni vrstici
Host Kratko ime (ali vzorec), na katerega se vnos nanaša  
HostName Pravi naslov ali naslov IP strežnika  
User Uporabniško ime -l janos ali janos@
Port Vrata SSH, če niso 22 -p 2222
IdentityFile Datoteka zasebnega ključa -i ~/.ssh/kulcs
IdentitiesOnly yes Poskusi le navedeni ključ  
ServerAliveInterval Pošiljanje znaka življenja vsakih toliko sekund -o ServerAliveInterval=60
ProxyJump Povezava prek vmesnega računalnika -J bastion
LocalForward Lokalno posredovanje vrat -L 8080:127.0.0.1:80
DynamicForward Proxy SOCKS -D 1080
ControlMaster, ControlPath, ControlPersist Delitev ene povezave med več sejami  

Pri imenih nastavitev velike in male črke niso pomembne (hostname in HostName sta enaka). Celoten seznam prebereš z ukazom man ssh_config.

Ključi: IdentityFile in IdentitiesOnly

Če imaš več ključev, IdentityFile določi, katerega odjemalec uporabi za določen strežnik. Brez IdentitiesOnly yes odjemalec najprej preizkusi tudi ključe, shranjene v agentu SSH (ssh-agent), in ključe s privzetimi imeni (~/.ssh/id_ed25519, ~/.ssh/id_rsa itd.). Pri veliko ključih lahko strežnik prekine povezavo še pred pravim ključem, z napako Too many authentication failures, ker omejuje število neuspešnih poskusov.

Host github.com
    User git
    IdentityFile ~/.ssh/id_ed25519_github
    IdentitiesOnly yes

Par ključev ustvariš z ukazom ssh-keygen -t ed25519 -f ~/.ssh/id_ed25519_web, javni ključ pa naložiš z ukazom ssh-copy-id -i ~/.ssh/id_ed25519_web.pub web1. Koraki za nastavitev prijave s ključem so v članku Kako se s SSH povežem s svojim VPS?

Vzorci in vrstni red: velja prvi zadetek

Za Host lahko navedeš več imen in vzorcev: * pomeni poljubno zaporedje znakov, ? en znak, ! pa izključi.

Host web1
    HostName 203.0.113.10

Host web2
    HostName 203.0.113.11

# Za vse računalnike, katerih ime se začne z web
Host web*
    User deploy
    Port 2222

# Za vse računalnike razen starega strežnika
Host * !regi-szerver
    ServerAliveInterval 60

Odjemalec datoteko bere od zgoraj navzdol in pri vsaki nastavitvi uporabi prvo najdeno vrednost; poznejši bloki, ki se prav tako ujemajo, iste nastavitve ne prepišejo več, le izpolnijo tiste, ki še niso navedene. V zgornjem primeru web1 naslov dobi iz svojega bloka, uporabnika in vrata iz bloka web*, znak življenja pa iz bloka Host *.

Iz tega izhaja najpomembnejše pravilo: splošni blok Host * naj bo na koncu datoteke. V preizkusu je po premiku bloka Host * z vrstico User root na začetek datoteke tudi web1 dobil uporabnika root, čeprav je bil v njegovem bloku User admin.

Stikala v ukazni vrstici prepišejo vse: ssh -l janos web1 se ne glede na datoteko poveže z uporabnikom janos.

Keepalive: da se nedejavna povezava ne prekine

Če se povezava po nekaj minutah nedejavnosti prekine z napako Broken pipe ali Connection reset, običajno usmerjevalnik ali požarni zid prekinja povezave brez prometa. ServerAliveInterval vsakih toliko sekund pošlje znak življenja po šifriranem kanalu, zato povezava ni videti nedejavna:

Host *
    ServerAliveInterval 60
    ServerAliveCountMax 3

ServerAliveCountMax 3 pomeni, da odjemalec po treh neodgovorjenih znakih življenja (tu približno tri minute) prekine povezavo, zato terminal tudi pri strežniku, ki je res postal nedosegljiv, ne ostane neskončno zamrznjen.

ProxyJump: povezava prek vmesnega računalnika

Če strežnik ni dosegljiv neposredno iz interneta, le z vmesnega računalnika (bastion, jump host), te ProxyJump v enem koraku prepelje čezenj:

Host bastion
    HostName bastion.pelda.hu
    User janos
    IdentityFile ~/.ssh/id_ed25519_web

Host belso
    HostName 10.0.0.5
    User janos
    IdentityFile ~/.ssh/id_ed25519_web
    ProxyJump bastion

ssh belso se najprej poveže z računalnikom bastion, nato prek njega odpre šifriran kanal do vrat 22 notranjega računalnika. Na oba računalnika se prijaviš s svojega računalnika, s svojim ključem: zasebni ključ ne pride na vmesni računalnik in tudi posredovanje agenta (ForwardAgent) ni potrebno.

V preizkusu je odjemalec macOS prek računalnika AlmaLinux 10.2 dosegel računalnik Debian 13, katerega naslov z odjemalca ni bil neposredno dosegljiv (ssh -o ProxyJump=none belso je vrnil napako zaradi izteka časa). Izpis ssh -v belso pokaže tudi vmesni korak (naslove smo prilagodili zgornjemu primeru):

debug1: Setting implicit ProxyCommand from ProxyJump: ssh -v -W '[%h]:%p' bastion
Authenticated to bastion.pelda.hu ([203.0.113.20]:22) using "publickey".
Authenticated to 10.0.0.5 (via proxy) using "publickey".

Več vmesnih računalnikov navedeš z vejico (ProxyJump bastion1,bastion2), za občasno uporabo pa zadošča tudi stikalo -J: ssh -J bastion janos@10.0.0.5.

Posredovanje vrat: LocalForward in DynamicForward

Storitev, ki posluša le na strežniku, lokalno (127.0.0.1), na primer podatkovno bazo ali spletni upraviteljski vmesnik, lahko dosežeš tudi s svojega računalnika, prek tunela SSH:

Host web1-alagut
    HostName 203.0.113.10
    User janos
    IdentityFile ~/.ssh/id_ed25519_web
    # Vrata 8080 lastnega računalnika -> 127.0.0.1:8000 strežnika
    LocalForward 8080 127.0.0.1:8000
    # Proxy SOCKS na vratih 1080 lastnega računalnika
    DynamicForward 1080
# Vzpostavitev tunela v ozadju, brez lupine
ssh -f -N web1-alagut

# Vrata 8000 strežnika so zdaj dosegljiva na lastnem računalniku
curl http://127.0.0.1:8080/

V preizkusu je odjemalec vrata 8080 in 1080 odprl le na naslovih 127.0.0.1 in ::1, zato jih drugi računalniki v omrežju niso dosegli. curl http://127.0.0.1:8080/ in curl --socks5-hostname 127.0.0.1:1080 http://localhost:8000/ sta vrnila stran spletnega strežnika, ki je na strežniku tekel le lokalno. Uporabo proxyja SOCKS z brskalnikom opisuje članek Ustvarjanje proxyja SSH SOCKS prek strežnika Linux.

Tunel, ki teče v ozadju, zapreš z ustavitvijo procesa ali, če uporabljaš tudi spodaj opisano deljeno povezavo, z ukazom ssh -O exit web1-alagut.

Deljena povezava: ControlMaster

Če se pogosto povezuješ z istim strežnikom (veliko operacij scp, rsync ali git, več terminalskih oken), lahko prvo povezavo pustiš odprto, nadaljnje pa se zaženejo prek nje, brez nove prijave:

mkdir -p ~/.ssh/cm
chmod 700 ~/.ssh/cm
Host *
    ControlMaster auto
    ControlPath ~/.ssh/cm/%r@%h:%p
    ControlPersist 10m

ControlPath je datoteka vtičnice deljene povezave (%r uporabnik, %h naslov, %p vrata), ControlPersist 10m pa pomeni, da povezava ostane odprta še deset minut po zaprtju zadnje seje. V preizkusu je prvi ssh web1 true trajal 0,13 sekunde, drugi prek deljene povezave pa 0,006 sekunde; pri oddaljenem strežniku, s ključem z geslom ali z dvostopenjskim preverjanjem je razlika veliko večja.

# Fut-e megosztott kapcsolat?
ssh -O check web1

# Zaprtje deljene povezave
ssh -O exit web1

Seje, zagnane prek deljene povezave, se prekinejo skupaj z glavno povezavo. Vgrajeni odjemalec OpenSSH v Windows po opisu projekta Win32-OpenSSH te funkcije ne podpira (tega nismo preizkusili), tam te vrstice izpusti.

Include: nastavitve v več datotekah

Pri veliko strežnikih lahko vnose razporediš tudi v ločene datoteke:

Include config.d/*.conf

Host *
    ServerAliveInterval 60

Relativna pot velja glede na imenik ~/.ssh, zato zgornja vrstica prebere datoteke s končnico .conf v imeniku ~/.ssh/config.d/. Vrstico Include postavi na začetek datoteke, pred vse bloke Host: Include znotraj bloka Host velja le, če se ta blok ujema. V preizkusu je vnos Host b v datoteki Include, ki je stala za blokom Host a, ostal brez učinka, na začetku datoteke pa je deloval.

Kakšna bo dejanska nastavitev? ssh -G

Če nisi prepričan, katera vrednost katerega bloka velja, ssh -G izpiše vse nastavitve, ki se za določeno ime dejansko uporabijo, brez povezave:

ssh -G web1 | grep -E '^(hostname|port|user|identityfile|proxyjump) '

To je najboljši način za iskanje napak zaradi vrstnega reda ali zatipkanega vzorca. Korake dejanske povezave pokaže ssh -v web1.

Dovoljenja: “Bad owner or permissions”

Odjemalec SSH noče uporabiti konfiguracijske datoteke, ki jo lahko spreminja tudi drug uporabnik. Takrat se ustavi s to napako:

Bad owner or permissions on /home/janos/.ssh/config

V preizkusu jo je sprožilo dovoljenje 666, ker pa je imela primarna skupina uporabnika še drugega člana, tudi 664. Popravek:

chmod 600 ~/.ssh/config
chmod 700 ~/.ssh

Tudi lastnik datoteke moraš biti ti (chown $USER ~/.ssh/config), če si jo na primer urejal s sudo in je prišla v last uporabnika root. Več o dovoljenjih: Dovoljenja datotek (chmod, chown) v Linuxu.

Kratko ime v drugih programih

Konfiguracijsko datoteko berejo vsi programi, ki temeljijo na OpenSSH, zato kratko ime deluje povsod, kjer je treba navesti naslov strežnika:

# Kopiranje datotek
scp mentes.tar.gz web1:/home/janos/
rsync -av ./public/ web1:/var/www/html/
sftp web1

# Repozitorij Git na strežniku
git clone web1:repo.git

V preizkusu so delovali vsi; rsync šele potem, ko smo paket rsync namestili tudi na strežnik Debian (na cloud image Debian 13 privzeto ni nameščen, rsync pa je potreben na obeh straneh). Podrobnosti kopiranja datotek prikazuje članek Kopiranje datotek med strežniki (scp, rsync, sftp).

Po njihovi dokumentaciji iz te datoteke računalnike bere tudi razširitev Remote - SSH za Visual Studio Code (na seznamu Remote-SSH: Connect to Host... se prikažejo imena Host), prav tako mnogi grafični odjemalci SFTP in terminalski programi.

Celoten primer

Include config.d/*.conf

Host web1
    HostName 203.0.113.10
    User janos
    Port 2222
    IdentityFile ~/.ssh/id_ed25519_web
    IdentitiesOnly yes

Host bastion
    HostName bastion.pelda.hu
    User janos
    IdentityFile ~/.ssh/id_ed25519_web

Host belso
    HostName 10.0.0.5
    User janos
    IdentityFile ~/.ssh/id_ed25519_web
    ProxyJump bastion

Host db-alagut
    HostName 203.0.113.10
    User janos
    Port 2222
    IdentityFile ~/.ssh/id_ed25519_web
    LocalForward 3307 127.0.0.1:3306

# Splošne nastavitve vedno na konec
Host *
    ServerAliveInterval 60
    ServerAliveCountMax 3
    ControlMaster auto
    ControlPath ~/.ssh/cm/%r@%h:%p
    ControlPersist 10m
Nazaj: Linux – članki (76)