Golang: Lokale SSH-Konfiguration lesen, um sich mit Remote-Servern zu verbinden
James Reed
Infrastructure Engineer · Leapcell

Bei der Entwicklung von Go-Anwendungen, die eine Verbindung zu Remote-Servern über SSH erfordern, kann die Nutzung Ihrer lokalen SSH-Konfiguration den Prozess rationalisieren. Dieser Ansatz ermöglicht es Ihrer Go-Anwendung, vordefinierte Verbindungseinstellungen zu verwenden, was Konsistenz und Effizienz fördert.
Key Takeaways
- Go-Anwendungen können
~/.ssh/config
verwenden, um SSH-Verbindungen zu optimieren. - Das Paket
github.com/kevinburke/ssh_config
hilft beim Parsen von SSH-Konfigurationsdateien in Go. - Das Paket
golang.org/x/crypto/ssh
ermöglicht die Implementierung von SSH-Clients in Go.
Verständnis der lokalen SSH-Konfigurationsdatei
Die SSH-Client-Konfigurationsdatei, die sich typischerweise unter ~/.ssh/config
befindet, ermöglicht es Benutzern, Verbindungsparameter für verschiedene Hosts zu definieren. Ein Standardeintrag in dieser Datei könnte wie folgt aussehen:
Host example HostName example.com User your-username Port 22 IdentityFile ~/.ssh/id_rsa
In dieser Konfiguration:
- Host: Ein Alias für den Host; wird als Abkürzung in SSH-Befehlen verwendet.
- HostName: Die tatsächliche Domäne oder IP-Adresse des Remote-Servers.
- User: Der Benutzername für die SSH-Verbindung.
- Port: Der Port, auf dem der SSH-Dienst ausgeführt wird (Standard ist 22).
- IdentityFile: Der Pfad zum privaten Schlüssel für die Authentifizierung.
Durch die Konfiguration dieser Einstellungen können Sie sich mit einem vereinfachten Befehl mit dem Remote-Server verbinden:
ssh example
Integrieren von SSH-Konfigurationen in Go
Um Ihre Go-Anwendung diese SSH-Konfigurationen lesen und nutzen zu lassen, führen Sie die folgenden Schritte aus:
-
Lesen der SSH-Konfigurationsdatei: Öffnen und parsen Sie die Datei
~/.ssh/config
, um die notwendigen Host-Konfigurationen abzurufen. -
Extrahieren von Host-Informationen: Identifizieren Sie den spezifischen Host-Eintrag, zu dem Ihre Anwendung eine Verbindung herstellen muss, und extrahieren Sie Parameter wie
HostName
,User
,Port
undIdentityFile
. -
Konfigurieren des SSH-Clients in Go: Verwenden Sie die extrahierten Parameter, um Ihren SSH-Client innerhalb der Go-Anwendung einzurichten.
Implementieren der Lösung in Go
Go's Paket golang.org/x/crypto/ssh
erleichtert die Implementierung von SSH-Clients. Es parst jedoch nicht nativ SSH-Konfigurationsdateien. Um diese Lücke zu schließen, können Sie das Paket github.com/kevinburke/ssh_config
verwenden, das Funktionen zum Parsen von SSH-Konfigurationsdateien bietet.
Installieren Sie zuerst das Paket:
go get github.com/kevinburke/ssh_config
Implementieren Sie dann den folgenden Code, um die SSH-Verbindung einzurichten:
package main import ( "fmt" "io/ioutil" "log" "os" "path/filepath" "github.com/kevinburke/ssh_config" "golang.org/x/crypto/ssh" ) func main() { host := "example" // Der in Ihrer SSH-Konfiguration definierte Alias // Lokalisieren der SSH-Konfigurationsdatei sshConfigPath := filepath.Join(os.Getenv("HOME"), ".ssh", "config") // Öffnen und Parsen der SSH-Konfigurationsdatei configFile, err := os.Open(sshConfigPath) if err != nil { log.Fatalf("Fehler beim Öffnen der SSH-Konfigurationsdatei: %v", err) } defer configFile.Close() sshConfig, err := ssh_config.Decode(configFile) if err != nil { log.Fatalf("Fehler beim Parsen der SSH-Konfigurationsdatei: %v", err) } // Extrahieren der relevanten Konfigurationen für den Host hostname := sshConfig.Get(host, "HostName") if hostname == "" { log.Fatalf("HostName nicht gefunden für Host: %s", host) } user := sshConfig.Get(host, "User") if user == "" { user = os.Getenv("USER") // Standardmäßig der aktuelle Benutzer, falls nicht angegeben } port := sshConfig.Get(host, "Port") if port == "" { port = "22" // Standard-SSH-Port } identityFile := sshConfig.Get(host, "IdentityFile") if identityFile == "" { identityFile = filepath.Join(os.Getenv("HOME"), ".ssh", "id_rsa") // Standardschlüssel } // Lesen des privaten Schlüssels key, err := ioutil.ReadFile(identityFile) if err != nil { log.Fatalf("Privater Schlüssel konnte nicht gelesen werden: %v", err) } // Erstellen des Signers für den privaten Schlüssel signer, err := ssh.ParsePrivateKey(key) if err != nil { log.Fatalf("Privater Schlüssel konnte nicht geparst werden: %v", err) } // Einrichten der SSH-Client-Konfiguration clientConfig := &ssh.ClientConfig{ User: user, Auth: []ssh.AuthMethod{ ssh.PublicKeys(signer), }, HostKeyCallback: ssh.InsecureIgnoreHostKey(), // Für die Einfachheit; Erwägen Sie die Implementierung einer Host-Key-Verifizierung } // Verbinden mit dem SSH-Server connection, err := ssh.Dial("tcp", fmt.Sprintf("%s:%s", hostname, port), clientConfig) if err != nil { log.Fatalf("Fehler beim Wählen: %v", err) } defer connection.Close() // Jetzt können Sie 'connection' verwenden, um mit dem Remote-Server zu interagieren // Zum Beispiel, eine Sitzung öffnen: session, err := connection.NewSession() if err != nil { log.Fatalf("Fehler beim Erstellen der Sitzung: %v", err) } defer session.Close() // Ausführen eines Befehls auf dem Remote-Server output, err := session.CombinedOutput("uname -a") if err != nil { log.Fatalf("Fehler beim Ausführen des Befehls: %v", err) } fmt.Println(string(output)) }
FAQs
Die Verwendung der SSH-Konfiguration verbessert die Sicherheit, vermeidet fest codierte Anmeldeinformationen und gewährleistet Konsistenz in allen Umgebungen.
Das Paket github.com/kevinburke/ssh_config
kann SSH-Konfigurationen programmgesteuert lesen und extrahieren.
Der Parser verwendet die spezifischste Übereinstimmung und folgt den Standard-Vorrangregeln von SSH.
Wichtige Überlegungen
-
HostKeyCallback: Im obigen Beispiel wird
ssh.InsecureIgnoreHostKey()
aus Gründen der Einfachheit verwendet, wodurch die Host-Key-Verifizierung umgangen wird. Implementieren Sie für Produktionsanwendungen eine ordnungsgemäße Host-Key-Verifizierung, um die Sicherheit zu gewährleisten. -
Fehlerbehandlung: Stellen Sie eine robuste Fehlerbehandlung sicher, um Szenarien zu verwalten, in denen die SSH-Konfigurationsdatei fehlt oder falsche Informationen enthält.
-
Sicherheit: Schützen Sie immer Ihre privaten Schlüssel und vermeiden Sie das Festcodieren sensibler Informationen in Ihrer Anwendung.
Durch die Integration Ihrer Go-Anwendung in die lokale SSH-Konfiguration können Sie SSH-Verbindungen effizienter verwalten, vorhandene Konfigurationen nutzen und die Konsistenz in Ihrer Entwicklungsumgebung aufrechterhalten.
Wir sind Leapcell, Ihre erste Wahl für das Hosten von Go-Projekten.
Leapcell ist die Serverless-Plattform der nächsten Generation für Webhosting, asynchrone Aufgaben und Redis:
Multi-Sprachen Unterstützung
- Entwickeln Sie mit Node.js, Python, Go oder Rust.
Setzen Sie unbegrenzt Projekte kostenlos ein
- zahlen Sie nur für die Nutzung - keine Anfragen, keine Gebühren.
Unschlagbare Kosteneffizienz
- Pay-as-you-go ohne Leerlaufgebühren.
- Beispiel: 25 US-Dollar unterstützen 6,94 Millionen Anfragen bei einer durchschnittlichen Antwortzeit von 60 ms.
Optimierte Entwicklererfahrung
- Intuitive Benutzeroberfläche für mühelose Einrichtung.
- Vollautomatische CI/CD-Pipelines und GitOps-Integration.
- Echtzeitmetriken und -protokollierung für umsetzbare Erkenntnisse.
Mühelose Skalierbarkeit und hohe Leistung
- Automatische Skalierung zur einfachen Bewältigung hoher Parallelität.
- Null Betriebsaufwand - konzentrieren Sie sich einfach auf den Aufbau.
Erfahren Sie mehr in der Dokumentation!
Folgen Sie uns auf X: @LeapcellHQ