Maison > développement back-end > Golang > Comment se connecter en SSH à une instance privée via un hôte Bastion à l'aide de x/crypto/ssh de Go ?

Comment se connecter en SSH à une instance privée via un hôte Bastion à l'aide de x/crypto/ssh de Go ?

Linda Hamilton
Libérer: 2024-12-05 02:18:10
original
482 Les gens l'ont consulté

How to SSH into a Private Instance via a Bastion Host Using Go's x/crypto/ssh?

Établir une connexion SSH à une instance privée via Bastion Node à l'aide de Go x/crypto/ssh

Présentation :

Ce guide montre comment établir une connexion SSH à une instance privée sur un nœud bastion à l'aide de Go. x/crypto/ssh.

Scénario :

Considérons un VPC AWS avec un sous-réseau public et privé. Une instance « bastion » est déployée dans le sous-réseau public, tandis que « l'instance de service » s'exécute dans le sous-réseau privé.

Objectif :

Se connecter à l'« instance de service » " depuis un ordinateur portable local via le " bastion ", exécutez des commandes et téléchargez fichiers.

Solution :

1. Établissement de la connexion au bastion :

Utilisez la fonction ssh.Dial pour vous connecter à l'hôte du bastion :

bClient, err := ssh.Dial("tcp", bastionAddr, config)
if err != nil {
    log.Fatal(err)
}
Copier après la connexion

2. Composer la connexion au service :

Utilisez la méthode Dial du client bastion pour établir une connexion avec l'hôte du service :

conn, err := bClient.Dial("tcp", serviceAddr)
if err != nil {
    log.Fatal(err)
}
Copier après la connexion

3. Création du client de service :

Créez un nouveau ssh.ClientConn et un nouveau ssh.Client en utilisant la connexion établie :

ncc, chans, reqs, err := ssh.NewClientConn(conn, serviceAddr, config)
if err != nil {
    log.Fatal(err)
}

sClient := ssh.NewClient(ncc, chans, reqs)
Copier après la connexion

4. Utilisation du client de service :

Le sClient créé peut désormais être utilisé pour exécuter des commandes et transférer des fichiers :

// Run a command on the service instance
cmd := sClient.Run("ls -l")
output, err := cmd.Output()
if err != nil {
    log.Fatal(err)
}
fmt.Printf("Output: %s", output)

// Upload a file to the service instance
f, err := os.Open("./local_file.txt")
if err != nil {
    log.Fatal(err)
}
defer f.Close()

w, err := sClient.NewWriter("service_file.txt")
if err != nil {
    log.Fatal(err)
}
defer w.Close()

if _, err := io.Copy(w, f); err != nil {
    log.Fatal(err)
}
Copier après la connexion

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal