ssh config

  • $HOME/.ssh/config -- personal configuration
  • /etc/ssh/ssh_config -- global configuration

Format:

Host <alias>
    SSH_OPTION  value

Common options

Host * # match all hosts
    User matchy
    IdentityFile $HOME/.ssh/id_ed25519

Host cloud
    HostName dev.example.com
    # automatically use "matchy" as the User
    # automatically use id_ed25519 as the IdentityFile

Host dev
    HostName 147.47.233.45
    User mischa # overwrites User="matchy"
    Port 2333
    IdentityFile $HOME/.ssh/id_rsa # overwrites

Port forwarding

Host to_forward
    # ...
+   LocalForward <port-to-forward> 127.0.0.1:<port-on-local>

Jump/Bastion server make-easy

ProxyJump is available since OpenSSH version 7.5.

 Host bastion
     HostName transfer.example.com
     User matchy
     IdentityFile ~/.ssh/id_ed25519

 Host node
     HostName 192.168.50.233 # the intranet IP to the bastion
+    ForwardAgent yes
+    ProxyJump bastion

If your ssh is olderthan OpenSSH 7.5 but newer than OpenSSH 5.4 (assuming bastion config exists in the ssh config):

 Host node
     # ...
+    ProxyCommand ssh bastion -W [%h]:%p

If your ssh is even older than OpenSSH 5.4...

 Host node
     # ...
+    ProxyCommand ssh bastion nc -q0 %h %p 2> /dev/null

Change starting directory

RemoteCommand is available since OpenSSH version 7.5.

 Host node
     # ...
+    RequestTTY force
+    RemoteCommand cd /path/to/your/directory && bash -l

The command bash -l means starting a bash session as the login shell. Alternatively, if you prefer zsh or fish (or any other shells), simply use zsh -l or fish -l instead.

To Dos

  • Avoid broken pipe