欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

如何使用Go語(yǔ)言實(shí)現(xiàn)遠(yuǎn)程執(zhí)行命令

 更新時(shí)間:2016年08月09日 15:57:06   投稿:daisy  
遠(yuǎn)程執(zhí)行命令最常用的方法就是利用SSH協(xié)議,將命令發(fā)送到遠(yuǎn)程機(jī)器上執(zhí)行,并獲取返回結(jié)果。本文將介紹如何使用Go語(yǔ)言實(shí)現(xiàn)遠(yuǎn)程執(zhí)行命令。下面一起來(lái)看看。

前言

遠(yuǎn)程執(zhí)行命令有什么用?為什么要遠(yuǎn)程執(zhí)行命令? 如果你只有2,3臺(tái)服務(wù)器需要管理的時(shí)候,遠(yuǎn)程執(zhí)行命令確實(shí)沒(méi)有沒(méi)多大作用,你可以登錄到每臺(tái)服務(wù)器上去完成各種操作。 當(dāng)你的服務(wù)器大于3臺(tái)的時(shí)候,遠(yuǎn)程執(zhí)行的命令的方式就可以大大提高你的生產(chǎn)力了。

如果你有一個(gè)可以遠(yuǎn)程執(zhí)行命令的工具,那么就可以像操作單臺(tái)機(jī)器那樣操作多臺(tái)機(jī)器,機(jī)器越多,效率提高的越多。 遠(yuǎn)程執(zhí)行命令最常用的方法就是利用 SSH 協(xié)議,將命令發(fā)送到遠(yuǎn)程機(jī)器上執(zhí)行,并獲取返回結(jié)果。

一般命令

所謂一般命令,就是在一定時(shí)間內(nèi)會(huì)執(zhí)行完的命令。比如 grep, cat 等等。 執(zhí)行命令的步驟是:連接,執(zhí)行,獲取結(jié)果

連接

連接包含了認(rèn)證,可以使用 password 或者 sshkey 2種方式來(lái)認(rèn)證。下面的示例為了簡(jiǎn)單,使用了密碼認(rèn)證的方式來(lái)完成連接。

import ( 
 "fmt"
 "time"

 "golang.org/x/crypto/ssh"
)

func connect(user, password, host string, port int) (*ssh.Session, error) { 
 var (
 auth  []ssh.AuthMethod
 addr  string
 clientConfig *ssh.ClientConfig
 client *ssh.Client
 session *ssh.Session
 err  error
 )
 // get auth method
 auth = make([]ssh.AuthMethod, 0)
 auth = append(auth, ssh.Password(password))

 clientConfig = &ssh.ClientConfig{
 User: user,
 Auth: auth,
 Timeout: 30 * time.Second,
 }

 // connet to ssh
 addr = fmt.Sprintf("%s:%d", host, port)

 if client, err = ssh.Dial("tcp", addr, clientConfig); err != nil {
 return nil, err
 }

 // create session
 if session, err = client.NewSession(); err != nil {
 return nil, err
 }

 return session, nil
}

連接的方法很簡(jiǎn)單,只要提供登錄主機(jī)的 用戶*, *密碼*, *主機(jī)名或者IP*, *SSH端口

執(zhí)行,命令獲取結(jié)果

連接成功后,執(zhí)行命令很簡(jiǎn)單

import ( 
 "fmt"
 "log"
 "os"
 "time"

 "golang.org/x/crypto/ssh"
)

func main() { 
 session, err := connect("root", "xxxxx", "127.0.0.1", 22)
 if err != nil {
 log.Fatal(err)
 }
 defer session.Close()

 session.Run("ls /; ls /abc")
}

上面代碼運(yùn)行之后,雖然命令正常執(zhí)行了,但是沒(méi)有正常輸出的結(jié)果,也沒(méi)有異常輸出的結(jié)果。 要想顯示結(jié)果,需要將 session 的 Stdout 和 Stderr 重定向 修改 func main 為如下:

func main() { 
 session, err := connect("root", "xxxxx", "127.0.0.1", 22)
 if err != nil {
 log.Fatal(err)
 }
 defer session.Close()

 session.Stdout = os.Stdout
 session.Stderr = os.Stderr
 session.Run("ls /; ls /abc")
}

這樣就能在屏幕上顯示正常,異常的信息了。

交互式命令

上面的方式無(wú)法遠(yuǎn)程執(zhí)行交互式命令,比如 top , 遠(yuǎn)程編輯一個(gè)文件,比如 vi /etc/nginx/nginx.conf 如果要支持交互式的命令,需要當(dāng)前的terminal來(lái)接管遠(yuǎn)程的 PTY。

func main() { 
 session, err := connect("root", "olordjesus", "dockers.iotalabs.io", 2210)
 if err != nil {
 log.Fatal(err)
 }
 defer session.Close()

 fd := int(os.Stdin.Fd())
 oldState, err := terminal.MakeRaw(fd)
 if err != nil {
 panic(err)
 }
 defer terminal.Restore(fd, oldState)

 // excute command
 session.Stdout = os.Stdout
 session.Stderr = os.Stderr
 session.Stdin = os.Stdin

 termWidth, termHeight, err := terminal.GetSize(fd)
 if err != nil {
 panic(err)
 }

 // Set up terminal modes
 modes := ssh.TerminalModes{
 ssh.ECHO:  1, // enable echoing
 ssh.TTY_OP_ISPEED: 14400, // input speed = 14.4kbaud
 ssh.TTY_OP_OSPEED: 14400, // output speed = 14.4kbaud
 }

 // Request pseudo terminal
 if err := session.RequestPty("xterm-256color", termHeight, termWidth, modes); err != nil {
 log.Fatal(err)
 }

 session.Run("top")
}

總結(jié)

好了,這樣就可以執(zhí)行交互式命令了,比如上面的 top 也可以通過(guò) vi /etc/nginx/nignx.conf 之類的命令來(lái)遠(yuǎn)程編輯文件。以上就是如何使用Go語(yǔ)言實(shí)現(xiàn)遠(yuǎn)程執(zhí)行命令的全部?jī)?nèi)容了,希望本文對(duì)大家學(xué)習(xí)python有所幫助。

相關(guān)文章

  • 淺析Go語(yǔ)言中的逃逸分析

    淺析Go語(yǔ)言中的逃逸分析

    在Go語(yǔ)言中,內(nèi)存分配和逃逸分析是至關(guān)重要的概念,對(duì)于理解代碼的性能和內(nèi)存使用情況至關(guān)重要,本文將深入探討Go語(yǔ)言中的內(nèi)存分配原理以及逃逸分析的作用,希望對(duì)大家有所幫助
    2024-04-04
  • Go語(yǔ)言dolphinscheduler任務(wù)調(diào)度處理

    Go語(yǔ)言dolphinscheduler任務(wù)調(diào)度處理

    這篇文章主要為大家介紹了Go語(yǔ)言dolphinscheduler任務(wù)調(diào)度處理,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-06-06
  • Go語(yǔ)言實(shí)現(xiàn)切片增刪改查的示例代碼

    Go語(yǔ)言實(shí)現(xiàn)切片增刪改查的示例代碼

    這篇文章主要為大家詳細(xì)介紹了Go語(yǔ)言中切片的使用(增刪改查),文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)Go語(yǔ)言有一定的幫助,需要的可以參考一下
    2022-04-04
  • go?tool?pprof?參數(shù)?'-base'?和?'-diff_base'之間的區(qū)別解析

    go?tool?pprof?參數(shù)?'-base'?和?'-diff_base&

    這篇文章主要介紹了go?tool?pprof?參數(shù)?'-base'?和?'-diff_base'之間的區(qū)別,兩個(gè)參數(shù)都是用于計(jì)算當(dāng)前?profile文件減去基準(zhǔn)profile文件所獲得的差值,用這個(gè)差值生成一個(gè)新的profile文件,本文給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2023-05-05
  • Go開(kāi)源項(xiàng)目分布式唯一ID生成系統(tǒng)

    Go開(kāi)源項(xiàng)目分布式唯一ID生成系統(tǒng)

    這篇文章主要為大家介紹了Go開(kāi)源項(xiàng)目分布式唯一ID生成系統(tǒng)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-06-06
  • GO web 數(shù)據(jù)庫(kù)預(yù)處理的實(shí)現(xiàn)

    GO web 數(shù)據(jù)庫(kù)預(yù)處理的實(shí)現(xiàn)

    本文主要介紹了GO web 數(shù)據(jù)庫(kù)預(yù)處理的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-10-10
  • Go排序算法通用qsort函數(shù)使用示例

    Go排序算法通用qsort函數(shù)使用示例

    這篇文章主要為大家介紹了Go排序算法通用qsort函數(shù)使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-11-11
  • go mock模擬接口的實(shí)現(xiàn)

    go mock模擬接口的實(shí)現(xiàn)

    本文主要介紹了go mock模擬接口的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-06-06
  • Go之接口型函數(shù)用法

    Go之接口型函數(shù)用法

    這篇文章主要介紹了Go之接口型函數(shù)用法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • 詳解go中panic源碼解讀

    詳解go中panic源碼解讀

    這篇文章主要介紹了go中panic源碼解讀,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-04-04

最新評(píng)論