Every time you type ssh -i ~/.ssh/mykey.pem -p 2222 admin@192.168.1.50, you’re wasting keystrokes. The SSH config file exists to eliminate this friction.

Basic Host Aliases

Create or edit ~/.ssh/config:

HHoossttHUIHUIposdsosdrseetseeotrnatrndNtgNtadiiadimetnmetepygepylFlF2oi2oi0yl0yl3e3e..0~0~././1.1.1s1s3s3s.h.h5/5/0p1srtoadg_iknegy_key

Now just:

1
2
ssh prod
ssh staging

Common Options

HostHUPIFSSmosodoeeysererrrstrtnwvveNtaeeraa2irrrvmd2tdAAeem2yAllri2FgiisnievvelneeretICvnoe~ytur/een..srtesvMxsaaahlxm/pm63ly0ek.ecyom
OptionWhat it does
PortNon-standard SSH port
IdentityFileWhich key to use
ForwardAgentForward your SSH agent (for jumping through servers)
ServerAliveIntervalSend keepalive every N seconds (prevents timeout)
ServerAliveCountMaxDisconnect after N missed keepalives

Wildcard Patterns

Apply settings to multiple hosts:

HHoossttUIUSUsd1sts.ee9ereprn2rirrt.cKodi1atndet6dHo.py8mowelF.isnxoi1ntHayl.Kome*espytl~Cse/hF..eicscloskemhi/n/pgdreonvdo/_nkuelyl

The second block is useful for ephemeral VMs where host keys change often.

Jump Hosts (ProxyJump)

Access internal servers through a bastion:

HHHHoooossssttttHUPUHHbosirsioioasenoensnsstrtxrtttttNeyeNeNiaarJdraraomdnuenmnmnemampaeaeilplllbn-o-1-1a*byd0a0sab.p.ts0p0it..oi11no...n55e01xample.com

Now ssh internal-db automatically routes through the bastion. No manual tunneling.

For older SSH versions, use ProxyCommand:

HostPirnotxeyrCnoamlm-a*ndssh-W%h:%pbastion

Port Forwarding Shortcuts

Set up tunnels without remembering the syntax:

HHoossttHULHULLdosowosoobsecesecc-trabtraatNl-NlluaaFtaaFFnmdoumdoonemrnemrreiwniwwldnaeanaabrlprr-dpdds-e5s88r4e04v3r84e2v03re.lrlleo.ooxceccaaxaamlallphmhhlopooeslss.tettc:.::o5c84m4o043m32
1
2
ssh -N db-tunnel  # -N means no shell, just tunnel
# Now localhost:5432 reaches the remote postgres

Dynamic SOCKS Proxy

Route all traffic through an SSH server:

HostHUDposyrsenotraxNmyaaimdcemFiotnrrwuasrtded1-0s8e0rver.example.com
1
2
ssh -N proxy
# Configure browser to use SOCKS5 proxy at localhost:1080

Multiplexing (Connection Sharing)

Reuse connections for faster subsequent logins:

HostCCCooonnntttrrrooolllMPPaaestrthseir~s/ta.us6ts0oh0/sockets/%r@%h-%p

Create the socket directory:

1
mkdir -p ~/.ssh/sockets

First ssh prod takes normal time. Subsequent connections are instant because they reuse the existing socket.

Per-Host Compression

Enable compression for slow connections:

HostHCsoolsmotpwNr-aesmseesrivroeenrmoytees.example.com

Or disable for fast local networks where compression adds overhead:

HostCloomcparle-s*sionno

Agent Forwarding (Careful!)

Forward your SSH keys to the remote server:

HostFtorruwsatreddA-gbeansttiyoens

⚠️ Security warning: Only enable this for trusted servers. A compromised server with agent forwarding can use your keys.

Safer alternative — use ProxyJump instead of agent forwarding when possible.

Default Settings

Apply to all hosts with Host *:

HHoossttAISS##ddeederrPTKnvvuheteeteyirrsstAAteTillhoeiiiaAsvvsrgOeeeenICanlnotftytuaentlyyrthleevMebssaaalxEcNk63D0doeffatuhletsfile

IdentitiesOnly yes prevents SSH from trying every key in your agent — only uses explicitly specified keys.

Includes

Split config into multiple files:

Include~/.ssh/config.d/*

Then organize:

~/.sswphheorrmckseoolnnafabilg.d/

Real Example

Here’s a practical config:

#H#HHHH#HH#HHoooooooooDsWssssHssCssetottttottlttfAISCCCrHUIPUIHHmHUHUoUIUIaddeoookbosdwrsdwowoenosposuasddsdudernnnaseeooeeososlaseisedweeoeelKnvtttstrnrxrnrtrtastrtrsrn-rnteterrrtNtkytkNkNbNNV-t*tsyiroooiasi-Jdi-a-aaaapM*eiristAlllomyt*uetpmsmmdmisctotTilMPPnesympyreteeme2yoyoeiaaeaFplFoai-FtFAsvstrbdioid1g11n1uiigOethsamlbyl0i099sllenIeisieae.n.22eeenlnr~stns0g0..rtyt/ti~t~..11~~ea.o/i/1266//yyrus6n.o...88..eevts0.sns11..ssssaoh0wss0011ssl/ohh..hhsr//12//6okww00ad0c.oowikcrrsgeokk_itm__ktseeea/ddyl%22or55c@55e%11ah99n-%p

With this config:

  • ssh work-prod jumps through bastion automatically
  • ssh nas connects to local NAS
  • ssh aws-whatever uses the right user and key
  • All connections stay alive and multiplex

Debugging

See what SSH is actually doing:

1
2
3
ssh -v prod           # Verbose
ssh -vv prod          # More verbose
ssh -vvv prod         # Maximum verbosity

Check which config options apply:

1
ssh -G prod | grep -i identity

File Permissions

SSH is picky about permissions:

1
2
3
4
chmod 700 ~/.ssh
chmod 600 ~/.ssh/config
chmod 600 ~/.ssh/id_*
chmod 644 ~/.ssh/*.pub

If permissions are wrong, SSH will ignore your config or refuse to use keys.


Five minutes setting up ~/.ssh/config saves hours over a year. Every ssh -i key -p port user@host you don’t type is cognitive load you don’t spend.