最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

前言

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

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

一般命令

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

連接

連接包含了認證,可以使用 password 或者 sshkey 2種方式來認證。下面的示例為了簡單,使用了密碼認證的方式來完成連接。

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
}

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

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

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

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

上面代碼運行之后,雖然命令正常執(zhí)行了,但是沒有正常輸出的結(jié)果,也沒有異常輸出的結(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")
}

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

交互式命令

上面的方式無法遠程執(zhí)行交互式命令,比如 top , 遠程編輯一個文件,比如 vi /etc/nginx/nginx.conf 如果要支持交互式的命令,需要當前的terminal來接管遠程的 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 也可以通過 vi /etc/nginx/nignx.conf 之類的命令來遠程編輯文件。以上就是如何使用Go語言實現(xiàn)遠程執(zhí)行命令的全部內(nèi)容了,希望本文對大家學(xué)習(xí)python有所幫助。

相關(guān)文章

  • golang?字符串拼接方法對比分析

    golang?字符串拼接方法對比分析

    這篇文章主要為大家介紹了golang?字符串拼接方法對比分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-09-09
  • 詳解golang 定時任務(wù)time.Sleep和time.Tick實現(xiàn)結(jié)果比較

    詳解golang 定時任務(wù)time.Sleep和time.Tick實現(xiàn)結(jié)果比較

    本文主要介紹了golang 定時任務(wù)time.Sleep和time.Tick實現(xiàn)結(jié)果比較,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • Go類型斷言提取測試接口值動態(tài)類型及靜態(tài)轉(zhuǎn)換確保類型接口編譯安全

    Go類型斷言提取測試接口值動態(tài)類型及靜態(tài)轉(zhuǎn)換確保類型接口編譯安全

    這篇文章主要為大家介紹了Go類型斷言提取測試接口值動態(tài)類型及靜態(tài)轉(zhuǎn)換確保類型實現(xiàn)特定接口的編譯時安全性詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-10-10
  • 詳解如何使用go-acme/lego實現(xiàn)自動簽發(fā)證書

    詳解如何使用go-acme/lego實現(xiàn)自動簽發(fā)證書

    這篇文章主要為大家詳細介紹了如何使用?go-acme/lego?的客戶端或庫完成證書的自動簽發(fā),文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-03-03
  • GoLand 中設(shè)置默認項目文件夾的實現(xiàn)

    GoLand 中設(shè)置默認項目文件夾的實現(xiàn)

    本文主要介紹了GoLand 中設(shè)置默認項目文件夾的實現(xiàn),默認項目文件夾會在你打開或新建項目時自動預(yù)選,避免每次都需要手動導(dǎo)航到目標目錄,感興趣的可以了解一下
    2025-03-03
  • golang協(xié)程池設(shè)計詳解

    golang協(xié)程池設(shè)計詳解

    這篇文章主要介紹了golang協(xié)程池設(shè)計詳解,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-09-09
  • Golang巧用defer進行錯誤處理的方法

    Golang巧用defer進行錯誤處理的方法

    錯誤處理是程序的重要組成部分,有效且優(yōu)雅的處理錯誤是大多數(shù)程序員的追求,下面這篇文章主要給大家介紹了關(guān)于Golang中巧用defer進行錯誤處理的方法,文中通過示例介紹的非常詳細,對大家具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起看看吧。
    2017-05-05
  • golang json.Marshal 特殊html字符被轉(zhuǎn)義的解決方法

    golang json.Marshal 特殊html字符被轉(zhuǎn)義的解決方法

    今天小編就為大家分享一篇golang json.Marshal 特殊html字符被轉(zhuǎn)義的解決方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-08-08
  • Go數(shù)據(jù)庫遷移的實現(xiàn)步驟

    Go數(shù)據(jù)庫遷移的實現(xiàn)步驟

    本文主要介紹了Go數(shù)據(jù)庫遷移的實現(xiàn)步驟,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-07-07
  • Go 自動升級依賴版本的幾種方法實現(xiàn)

    Go 自動升級依賴版本的幾種方法實現(xiàn)

    Go語言使用GoModules進行依賴管理,可以通過多種方式自動升級依賴,本文就來介紹Go 自動升級依賴版本的7種方法,感興趣的可以了解一下
    2025-03-03

最新評論

安徽省| 景宁| 潮安县| 蓬溪县| 镇康县| 蕉岭县| 清水县| 巴塘县| 杭州市| 东宁县| 清镇市| 富裕县| 焦作市| 辛集市| 福贡县| 塘沽区| 西乌珠穆沁旗| 嘉定区| 惠州市| 安国市| 磐安县| 上杭县| 嘉祥县| 高青县| 北宁市| 勃利县| 奇台县| 金平| 府谷县| 阿勒泰市| 永济市| 九龙县| 博罗县| 元江| 定州市| 平南县| 泰顺县| 江川县| 嘉定区| 古浪县| 张北县|