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
Linda Hamiltonoriginal
2024-12-05 02:18:10441parcourir

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)
}

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)
}

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)

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)
}

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:
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