golang ssh連接服務器(模擬交互terminal)


 


用到的庫:golang.org/x/crypto/ssh(隔牆有代理https://goproxy.cn)

1. 發送指令執行 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. 發送指令執行 session.Output()

 session.run(command)是直接在host執行命令,不關心執行結果。session.Output是將執行命令之后的Stdout返回

復制代碼
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. 模擬交互terminal

復制代碼
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()) } }
復制代碼

禁用回顯:

復制代碼
//如果不禁用回顯
[root@65a9c031a770 ~]# ls
ls
anaconda-ks.cfg //禁用回顯 [root@65a9c031a770 ~]# ls anaconda-ks.cfg
復制代碼

 注意:

這里的ssh.InsecureIgnoreHostKey是不檢查host key,需要檢查的話得參考client源碼重寫函數

使用GO語言靈活批量ssh登錄服務器執行操作: https://www.cnblogs.com/findumars/p/5930584.html

github一個非常好的web ssh項目: https://github.com/libragen/felix

golang ssh連接服務器(模擬交互terminal)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM