ssh — Verschlüsselte Verbindungen und Tunneling auf der Kommandozeile
Praxis-Guide zu SSH — Verbindungen aufbauen, Schlüssel verwalten, Port-Forwarding einrichten und Dateien sicher übertragen.
SSH (Secure Shell) ist das Standardwerkzeug, mit dem du dich verschlüsselt auf entfernte Systeme einloggst, Befehle fernausführst und Dateien sicher überträgst – alles über eine einzige, kryptografisch gesicherte Verbindung. Ob Einzelserver oder komplexes Netz mit Jump-Hosts und SOCKS-Proxys: SSH deckt es ab. Dieser Guide zeigt dir die wichtigsten Befehle und Optionen, von der ersten Verbindung über Schlüsselverwaltung bis hin zu Port-Forwarding und Multiplexing.
Verbinden
ssh <user>@<host> — Verbindet dich mit einem Remote-Host als bestimmter Benutzer.
ssh deploy@server.example.comssh <host> — Verbindet dich mit dem aktuellen lokalen Benutzernamen.
ssh server.example.comssh -p <port> <user>@<host> — Verbindet dich über einen nicht standardmäßigen SSH-Port.
ssh -p 2222 deploy@server.example.comssh -i <keyfile> <user>@<host> — Verbindet dich mit einer bestimmten privaten Schlüsseldatei.
ssh -i ~/.ssh/deploy_key deploy@server.example.comssh -v <user>@<host> — Ausführlicher Modus: Zeigt Debug-Informationen während der Verbindung zur Fehlerbehebung.
ssh -v deploy@server.example.comssh -vvv <user>@<host> — Maximale Ausführlichkeit: Zeigt alle Debug-Ebenen für tiefgehende Fehlerbehebung.
ssh -vvv deploy@server.example.comssh -o StrictHostKeyChecking=no <user>@<host> — Überspringt die Überprüfung des Host-Schlüssels (unsicher, nützlich für Skripte und kurzlebige Hosts).
ssh -o StrictHostKeyChecking=no deploy@staging.example.comssh -o ConnectTimeout=<seconds> <user>@<host> — Setzt einen Verbindungs-Timeout in Sekunden.
ssh -o ConnectTimeout=5 deploy@server.example.comFernbefehle ausführen
ssh <user>@<host> <command> — Führt einen einzelnen Befehl auf dem Remote-Host aus und kehrt zurück.
ssh deploy@server.example.com uptimessh <user>@<host> '<command1> && <command2>' — Führt mehrere verkettete Befehle remote aus.
ssh deploy@server.example.com 'cd /var/www && git pull'ssh <user>@<host> 'bash -s' < <script> — Führt ein lokales Skript über stdin auf dem Remote-Host aus.
ssh deploy@server.example.com 'bash -s' < deploy.shssh -t <user>@<host> <command> — Erzwingt die Pseudo-Terminal-Zuweisung. Erforderlich für interaktive Befehle wie sudo oder top.
ssh -t deploy@server.example.com sudo apt updatessh <user>@<host> 'cat > <remote_file>' < <local_file> — Überträgt eine Datei über stdin-Umleitung auf einen Remote-Host.
ssh deploy@server.example.com 'cat > /tmp/config.json' < config.jsonSchlüsselverwaltung
ssh-keygen -t ed25519 -C "<comment>" — Erstellt ein neues Ed25519-Schlüsselpaar (empfohlen, sicherste und schnellste Methode).
ssh-keygen -t ed25519 -C "deploy@server.example.com"ssh-keygen -t rsa -b 4096 -C "<comment>" — Erstellt ein neues RSA-Schlüsselpaar mit 4096 Bit.
ssh-keygen -t rsa -b 4096 -C "user@example.com"ssh-keygen -t ed25519 -f <path> — Erstellt ein Schlüsselpaar und speichert es unter einem bestimmten Dateipfad.
ssh-keygen -t ed25519 -f ~/.ssh/deploy_keyssh-keygen -p -f <keyfile> — Ändert die Passphrase eines vorhandenen privaten Schlüssels.
ssh-keygen -p -f ~/.ssh/id_ed25519ssh-keygen -l -f <keyfile> — Zeigt den Fingerabdruck einer Schlüsseldatei an.
ssh-keygen -l -f ~/.ssh/id_ed25519.pubssh-keygen -R <host> — Entfernt einen Host-Eintrag aus known_hosts (behebt Warnungen bei geändertem Host-Schlüssel).
ssh-keygen -R server.example.comssh-keygen -y -f <private_key> — Extrahiert den öffentlichen Schlüssel aus einer privaten Schlüsseldatei.
ssh-keygen -y -f ~/.ssh/id_ed25519 > ~/.ssh/id_ed25519.pubSchlüsselverteilung
ssh-copy-id <user>@<host> — Kopiert deinen öffentlichen Schlüssel in die authorized_keys-Datei eines Remote-Hosts.
ssh-copy-id deploy@server.example.comssh-copy-id -i <keyfile> <user>@<host> — Kopiert einen bestimmten öffentlichen Schlüssel auf den Remote-Host.
ssh-copy-id -i ~/.ssh/deploy_key.pub deploy@server.example.comssh-copy-id -p <port> <user>@<host> — Kopiert den öffentlichen Schlüssel über einen nicht standardmäßigen Port auf den Remote-Host.
ssh-copy-id -p 2222 deploy@server.example.comcat <keyfile> | ssh <user>@<host> 'mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys' — Manuelle Alternative zu ssh-copy-id, wenn es nicht verfügbar ist.
cat ~/.ssh/id_ed25519.pub | ssh deploy@server.example.com 'mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys'SSH-Agent
eval "$(ssh-agent -s)" — Startet den SSH-Agent und setzt Umgebungsvariablen in der aktuellen Shell.
eval "$(ssh-agent -s)"ssh-add <keyfile> — Fügt einen privaten Schlüssel zum SSH-Agent hinzu.
ssh-add ~/.ssh/id_ed25519ssh-add — Fügt den Standard-Schlüssel (~/.ssh/id_rsa, id_ed25519 usw.) zum Agent hinzu.
ssh-addssh-add -l — Listet die Fingerabdrücke aller aktuell im Agent geladenen Schlüssel auf.
ssh-add -lssh-add -L — Listet die vollständigen öffentlichen Schlüssel auf, die derzeit im Agent geladen sind.
ssh-add -Lssh-add -d <keyfile> — Entfernt einen bestimmten Schlüssel aus dem Agent.
ssh-add -d ~/.ssh/deploy_keyssh-add -D — Entfernt alle Schlüssel aus dem Agent.
ssh-add -Dssh -A <user>@<host> — Aktiviert die Agent-Weiterleitung. Ermöglicht dem Remote-Host die Nutzung deiner lokalen SSH-Schlüssel.
ssh -A deploy@bastion.example.comPort-Forwarding (Tunneling)
ssh -L <local_port>:<target_host>:<target_port> <user>@<host> — Lokales Port-Forwarding: Greife auf einen Remote-Dienst über einen lokalen Port zu.
ssh -L 3306:localhost:3306 deploy@server.example.comssh -L <local_port>:<remote_host>:<remote_port> <user>@<host> — Leitet an einen Host weiter, der vom SSH-Server aus erreichbar ist (nicht nur localhost).
ssh -L 5432:db.internal:5432 deploy@bastion.example.comssh -R <remote_port>:<local_host>:<local_port> <user>@<host> — Remote-(Reverse-)Port-Forwarding: Macht einen lokalen Dienst auf dem Remote-Host verfügbar.
ssh -R 8080:localhost:3000 deploy@server.example.comssh -D <port> <user>@<host> — Dynamisches Port-Forwarding: Erstellt einen SOCKS5-Proxy auf dem lokalen Port.
ssh -D 1080 deploy@server.example.comssh -L <local_port>:<target>:<target_port> -N <user>@<host> — Leitet einen Port weiter, ohne eine Remote-Shell zu öffnen (-N = kein Befehl).
ssh -L 3306:localhost:3306 -N deploy@server.example.comssh -L <local_port>:<target>:<target_port> -N -f <user>@<host> — Leitet einen Port im Hintergrund weiter (-f = in den Hintergrund wechseln).
ssh -L 3306:localhost:3306 -N -f deploy@server.example.comJump-Hosts (Bastion/ProxyJump)
ssh -J <jump_host> <user>@<target_host> — Verbindet dich über einen Jump-Host (Bastion) mit einem Ziel-Host.
ssh -J bastion.example.com deploy@internal-serverssh -J <user1>@<jump1>,<user2>@<jump2> <user>@<target> — Verkettet mehrere Jump-Hosts, um das Ziel zu erreichen.
ssh -J admin@bastion1,admin@bastion2 deploy@internal-serverssh -J <jump_host>:<port> <user>@<target_host> — Verwendet einen Jump-Host, der SSH auf einem nicht standardmäßigen Port betreibt.
ssh -J bastion.example.com:2222 deploy@internal-serverssh -o ProxyJump=<jump_host> <user>@<target_host> — Alternative Syntax mit der ProxyJump-Option.
ssh -o ProxyJump=bastion.example.com deploy@internal-serverSCP (Secure Copy)
scp <local_file> <user>@<host>:<remote_path> — Kopiert eine lokale Datei auf einen Remote-Host.
scp ./config.json deploy@server.example.com:/etc/app/scp <user>@<host>:<remote_file> <local_path> — Kopiert eine Datei von einem Remote-Host auf den lokalen Rechner.
scp deploy@server.example.com:/var/log/app.log ./logs/scp -r <local_dir> <user>@<host>:<remote_path> — Kopiert ein Verzeichnis rekursiv auf einen Remote-Host.
scp -r ./dist/ deploy@server.example.com:/var/www/html/scp -P <port> <local_file> <user>@<host>:<remote_path> — Kopiert über einen nicht standardmäßigen SSH-Port (Hinweis: Großbuchstabe -P für scp).
scp -P 2222 ./config.json deploy@server.example.com:/etc/app/scp -i <keyfile> <local_file> <user>@<host>:<remote_path> — Kopiert mit einer bestimmten privaten Schlüsseldatei.
scp -i ~/.ssh/deploy_key ./app.tar.gz deploy@server.example.com:/tmp/scp <user>@<host1>:<file> <user>@<host2>:<path> — Kopiert eine Datei zwischen zwei Remote-Hosts (Daten fließen durch den lokalen Rechner).
scp deploy@server1.example.com:/backup.sql deploy@server2.example.com:/import/SFTP (Secure File Transfer)
sftp <user>@<host> — Startet eine interaktive SFTP-Sitzung mit einem Remote-Host.
sftp deploy@server.example.comsftp -P <port> <user>@<host> — Verbindet sich über SFTP auf einem nicht standardmäßigen SSH-Port.
sftp -P 2222 deploy@server.example.comsftp> get <remote_file> <local_path> — Lädt eine Datei vom Remote-Host herunter (innerhalb der SFTP-Sitzung).
sftp> get /var/log/app.log ./logs/sftp> put <local_file> <remote_path> — Lädt eine Datei auf den Remote-Host hoch (innerhalb der SFTP-Sitzung).
sftp> put ./config.json /etc/app/sftp> ls — Listet Dateien im aktuellen Remote-Verzeichnis auf.
sftp> ls -lasftp> lcd <path> — Wechselt das lokale Arbeitsverzeichnis.
sftp> lcd ~/DownloadsKonfigurationsdatei (~/.ssh/config)
Host <alias> mit HostName, User — Definiert einen Host-Alias mit Standard-Benutzer. Verbinden mit: ssh
Host production
HostName server.example.com
User deployHost <alias> mit HostName, Port, IdentityFile — Definiert einen Host mit benutzerdefiniertem Port und Schlüsseldatei.
Host staging
HostName staging.example.com
Port 2222
IdentityFile ~/.ssh/staging_keyHost <alias> mit HostName, ProxyJump — Definiert einen Host, der über einen Jump-Host (Bastion) verbindet.
Host internal-db
HostName db.internal
ProxyJump bastion.example.comHost * mit ServerAliveInterval, ServerAliveCountMax — Globale Einstellungen für alle Hosts: Verbindungen mit regelmäßigen Pings aufrechterhalten.
Host *
ServerAliveInterval 60
ServerAliveCountMax 3
AddKeysToAgent yesHost <pattern>* mit User, IdentityFile — Verwendet Wildcards, um Einstellungen auf mehrere Hosts anzuwenden.
Host aws-*
User ec2-user
IdentityFile ~/.ssh/aws_keyMultiplexing & Keep-Alive
ssh -o ControlMaster=auto -o ControlPath=/tmp/ssh-%r@%h:%p -o ControlPersist=10m <user>@<host> — Aktiviert Connection-Multiplexing: Nachfolgende SSH-Sitzungen verwenden die Verbindung wieder.
ssh -o ControlMaster=auto -o ControlPath=/tmp/ssh-%r@%h:%p -o ControlPersist=10m deploy@server.example.comssh -O check <user>@<host> — Prüft, ob eine gemultiplexte Master-Verbindung läuft.
ssh -O check deploy@server.example.comssh -O exit <user>@<host> — Beendet eine gemultiplexte Master-Verbindung.
ssh -O exit deploy@server.example.comssh -o ServerAliveInterval=<seconds> <user>@<host> — Sendet Keep-Alive-Pakete, um Verbindungs-Timeouts zu verhindern.
ssh -o ServerAliveInterval=60 deploy@server.example.comEscape-Sequenzen
~. — Beendet eine feststeckende SSH-Sitzung. Zuerst Enter drücken, dann ~. (Tilde Punkt) eingeben.
~.~^Z — Hält die SSH-Sitzung an und kehrt zur lokalen Shell zurück. Mit fg fortsetzen.
~^Z~# — Listet alle weitergeleiteten Verbindungen in der aktuellen Sitzung auf.
~#~? — Zeigt eine Liste aller verfügbaren Escape-Sequenzen an.
~?~C — Öffnet die SSH-Befehlszeile, um Port-Weiterleitungen während einer laufenden Sitzung hinzuzufügen.
~C then: -L 3306:localhost:3306Sicherheit & Fehlerbehebung
ssh-keyscan <host> — Ruft die öffentlichen Host-Schlüssel von einem Remote-Server ab.
ssh-keyscan server.example.com >> ~/.ssh/known_hostsssh-keyscan -t ed25519 <host> — Ruft nur einen bestimmten Schlüsseltyp vom Remote-Server ab.
ssh-keyscan -t ed25519 server.example.comssh -Q key — Listet alle vom lokalen SSH-Client unterstützten Schlüsseltypen auf.
ssh -Q keyssh -Q cipher — Listet alle vom lokalen SSH-Client unterstützten Verschlüsselungsalgorithmen auf.
ssh -Q cipherssh -Q mac — Listet alle unterstützten MAC-Algorithmen auf.
ssh -Q macchmod 700 ~/.ssh — Setzt die korrekten Berechtigungen für das .ssh-Verzeichnis (erforderlich, damit SSH funktioniert).
chmod 700 ~/.sshchmod 600 ~/.ssh/id_ed25519 — Setzt die korrekten Berechtigungen für eine private Schlüsseldatei (darf für andere nicht zugänglich sein).
chmod 600 ~/.ssh/id_ed25519chmod 644 ~/.ssh/authorized_keys — Setzt die korrekten Berechtigungen für authorized_keys.
chmod 644 ~/.ssh/authorized_keys Fazit
SSH ist weit mehr als ein Terminal-Ersatz: Schlüssel statt Passwörter, Agent-Forwarding für Bastion-Hosts, Port-Tunnel für gesperrte Dienste und Multiplexing für schnelle Wiederverbindungen machen es zum zentralen Werkzeug jeder Infrastruktur. Wer die Config-Datei pflegt und Schlüssel konsequent mit Passphrasen schützt, arbeitet schneller und sicherer zugleich.
Weiterführende Links
- OpenSSH – offizielle Website – Dokumentation und Changelog (englisch)
- ssh(1) – Manpage – alle Optionen im Überblick (englisch)
- Secure Shell – Wikipedia – Hintergrund und Geschichte
Verwandte Kommandos
- scp – Dateien sicher auf Remote-Hosts kopieren
- ssh-keygen – SSH-Schlüsselpaare erstellen und verwalten
- mosh – SSH-Alternative für instabile oder hochlatente Verbindungen