Maison > Article > développement back-end > Explication détaillée du serveur de connexion Golang SSH (simulation de terminal interactif)
La colonne tutorielle suivante de golang vous donnera une explication détaillée de la connexion ssh de golang au serveur (simulant un terminal interactif, j'espère qu'elle sera utile aux amis dans le besoin). !
Bibliothèque utilisée : golang.org/x/crypto/ssh (le mur a un proxy https://goproxy.cn)
1. Envoyez la commande pour exécuter session.Run().
package main import ( "bytes" "fmt" "golang.org/x/crypto/ssh" "log") func main() { // 建立SSH客户端连接 client, err := ssh.Dial("tcp", "127.0.0.1:2222", &ssh.ClientConfig{ User: "root", Auth: []ssh.AuthMethod{ssh.Password("123456")}, HostKeyCallback: ssh.InsecureIgnoreHostKey(), }) if err != nil { log.Fatalf("SSH dial error: %s", err.Error()) } // 建立新会话 session, err := client.NewSession() if err != nil { log.Fatalf("new session error: %s", err.Error()) } defer session.Close() var b bytes.Buffer session.Stdout = &b if err := session.Run("ls"); err != nil { panic("Failed to run: " + err.Error()) } fmt.Println(b.String()) }
2. Envoyez la commande pour exécuter session.Output()
session.run(command) exécute la commande directement sur l'hôte et ne se soucie pas du résultat de l'exécution. session.Output renvoie la sortie Stdout après avoir exécuté la commande
package main import ( "fmt" "golang.org/x/crypto/ssh" "log" "os") func test() { // 建立SSH客户端连接 client, err := ssh.Dial("tcp", "127.0.0.1:2222", &ssh.ClientConfig{ User: "root", Auth: []ssh.AuthMethod{ssh.Password("123456")}, HostKeyCallback: ssh.InsecureIgnoreHostKey(), }) if err != nil { log.Fatalf("SSH dial error: %s", err.Error()) } // 建立新会话 session, err := client.NewSession() defer session.Close() if err != nil { log.Fatalf("new session error: %s", err.Error()) } result, err := session.Output("ls -al") if err != nil { fmt.Fprintf(os.Stdout, "Failed to run command, Err:%s", err.Error()) os.Exit(0) } fmt.Println(string(result)) }
3. Simuler le terminal interactif
package main import ( "golang.org/x/crypto/ssh" "log" "os") func main() { // 建立SSH客户端连接 client, err := ssh.Dial("tcp", "127.0.0.1:2222", &ssh.ClientConfig{ User: "root", Auth: []ssh.AuthMethod{ssh.Password("123456")}, HostKeyCallback: ssh.InsecureIgnoreHostKey(), }) if err != nil { log.Fatalf("SSH dial error: %s", err.Error()) } // 建立新会话 session, err := client.NewSession() defer session.Close() if err != nil { log.Fatalf("new session error: %s", err.Error()) } session.Stdout = os.Stdout // 会话输出关联到系统标准输出设备 session.Stderr = os.Stderr // 会话错误输出关联到系统标准错误输出设备 session.Stdin = os.Stdin // 会话输入关联到系统标准输入设备 modes := ssh.TerminalModes{ ssh.ECHO: 0, // 禁用回显(0禁用,1启动) ssh.TTY_OP_ISPEED: 14400, // input speed = 14.4kbaud ssh.TTY_OP_OSPEED: 14400, //output speed = 14.4kbaud } if err = session.RequestPty("linux", 32, 160, modes); err != nil { log.Fatalf("request pty error: %s", err.Error()) } if err = session.Shell(); err != nil { log.Fatalf("start shell error: %s", err.Error()) } if err = session.Wait(); err != nil { log.Fatalf("return error: %s", err.Error()) } }
Désactiver l'écho :
//如果不禁用回显 [root@65a9c031a770 ~]# ls ls anaconda-ks.cfg //禁用回显 [root@65a9c031a770 ~]# ls anaconda-ks.cfg
Remarque :
Le ssh.InsecureIgnoreHostKey ici ne vérifie pas la clé de l'hôte. Si vous devez vérifier, vous devez vous référer au code source du client pour réécrire la fonction
Utilisez le langage GO pour regrouper de manière flexible la connexion SSH au serveur pour effectuer des opérations. : https://www.cnblogs.com/ findumars/p/5930584.html
github est un très bon projet web ssh : https://github.com/libragen/felix
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!