用到的庫: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