精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

在Go編程中調用外部命令的幾種場景

開發 后端
在Go的標準庫中, 專門提供了os/exec包來對調用外部程序提供支持, 本文將對調用外部命令常用的幾種場景進行總結。

在很多場合, 使用Go語言需要調用外部命令來完成一些特定的任務, 例如: 使用Go語言調用Linux命令來獲取執行的結果,又或者調用第三方程序執行來完成額外的任務。在go的標準庫中, 專門提供了os/exec包來對調用外部程序提供支持, 本文將對調用外部命令常用的幾種場景進行總結。

直接調用函數

先用Linux上的一個簡單命令執行看一下效果, 執行cal命令, 會打印當前月的日期信息,如圖:

如果要使用Go代碼調用該命令, 可以使用以下代碼:

func main(){
  cmd := exec.Command("cal")
  err := cmd.Run()
  if err != nil {
     fmt.Println(err.Error())
  }
}

首先, 調用"os/exec"包中的Command函數,并傳入命令名稱作為參數, Command函數會返回一個exec.Cmd的命令對象。接著調用該命令對象的Run()方法運行命令。

如果此時運行程序, 會發現什么都沒有出現, 這是因為我們沒有處理標準輸出, 調用os/exec執行命令, 標準輸出和標準錯誤默認會被丟棄。

這里將cmd結構中的Stdout和Stderr分別設置為os.stdout和os.Stderr, 代碼如下:

func main(){
    cmd := exec.Command("cal")
    cmd.Stdout = os.Stdout
    cmd.Stderr = os.Stderr
    err := cmd.Run()
    if err != nil {
      fmt.Println(err.Error())
    }
}

運行程序后顯示:

輸出到文件

輸出到文件的關鍵, 是將exec.Cmd對象的Stdout和Stderr賦值文件句柄, 代碼如下:

func main(){
    f, err := os.OpenFile("sample.txt", os.O_WRONLY|os.O_CREATE, os.ModePerm)
    if err != nil {
      fmt.Println(err.Error())
    }
    cmd := exec.Command("cal")
    cmd.Stdout = f
    cmd.Stderr = f
    err := cmd.Run()
    if err != nil {
      fmt.Println(err.Error())
    }
}

os.OpenFile打開一個文件, 指定os.0_CREATE標志讓操作系統在文件不存在時自動創建, 返回文件對象*os.File, *os.File實現了io.Writer接口。

運行程序結果如下:

發送到網絡

這里開啟一個HTTP服務, 服務端接收兩個參數:年和月, 在服務端通過執行系統命令返回結果,代碼如下:

import (
  "fmt"
  "net/http"
  "os/exec"
)

func queryDate(w http.ResponseWriter, r *http.Request) {
  var err error
  if r.Method == "GET" {
    year := r.URL.Query().Get("year")
    month := r.URL.Query().Get("month")

    cmd := exec.Command("cal", month, year)
    cmd.Stdout = w
    cmd.Stderr = w

    err = cmd.Run()
    if err != nil {
      fmt.Println(err.Error())
    }
  }
}

func main() {
  http.HandleFunc("/querydate", queryDate)
  http.ListenAndServe(":8001", nil)
}

打開瀏覽器,在地址欄中輸入URL查詢2023年10月份的日歷:http://localhost:8001/querydate?year=2023&mnotallow=10 , 結果如下:

輸出到多個目標

如果要將執行命令的結果同時輸出到文件、網絡和內存對象, 可以使用io.MultiWriter滿足需求, io.MultiWriter可以很方便的將多個io.Writer轉換成一個io.Writer, 修改之前的Web服務端程序如下:

func queryDate(w http.ResponseWriter, r *http.Request) {
  var err error
  if r.Method == "GET" {
    buffer := bytes.NewBuffer(nil)

    year := r.URL.Query().Get("year")
    month := r.URL.Query().Get("month")

    f, _ := os.OpenFile("sample.txt", os.O_WRONLY|os.O_CREATE, os.ModePerm)
    mw := io.MultiWriter(w, f, buffer)

    cmd := exec.Command("cal", month, year)
    cmd.Stdout = mw
    cmd.Stderr = mw

    err = cmd.Run()
    if err != nil {
      fmt.Println(err.Error())
    }

    fmt.Println(buffer.String())
  }
}

func main() {
  http.HandleFunc("/querydate", queryDate)
  http.ListenAndServe(":8001", nil)
}

分別獲取輸出內容和錯誤

這里我們封裝一個常用函數, 輸入接收命令和多個參數, 返回錯誤和命令返回信息, 函數代碼如下:

func ExecCommandOneTimeOutput(name string, args ...string) (error, string) {
  var out bytes.Buffer
  var stderr bytes.Buffer
  cmd := exec.Command(name, args...)
  cmd.Stdout = &out
  cmd.Stderr = &stderr
  err := cmd.Run()
  if err != nil {
    fmt.Println(fmt.Sprint(err) + ": " + stderr.String())
    return err, ""
  }
  return nil, out.String()
}

該函數可以作為通用的命令執行返回結果的函數, 分別返回了錯誤和命令返回信息。

循環獲取命令內容

在Linux系統中,有些命令運行后結果是動態持續更新的,例如: top命令,對于該場景,我們封裝函數如下:

func ExecCommandLoopTimeOutput(name string, args ...string) <-chan struct{} {
  cmd := exec.Command(name, args...)
  closed := make(chan struct{})
  defer close(closed)

  stdoutPipe, err := cmd.StdoutPipe()
  if err != nil {
    fmt.Println(err.Error())
  }
  defer stdoutPipe.Close()
  go func() {
    scanner := bufio.NewScanner(stdoutPipe)
    for scanner.Scan() {
      fmt.Println(string(scanner.Bytes()))
      _, err := simplifiedchinese.GB18030.NewDecoder().Bytes(scanner.Bytes())
      if err != nil {
        continue
      }
    }
  }()

  if err := cmd.Run(); err != nil {
    fmt.Println(err.Error())
  }
  return closed
}

通過調用cmd對象的StdoutPipe()輸出管理函數, 我們可以實現持續獲取后臺命令返回的結果,并保持程序不退出。

在調用該函數的時候, 調用方式如下:

<-ExecCommandLoopTimeOutput("top")

打印出的信息將是一個持續顯示信息,如圖:

總結

本章節介紹了使用os/exec這個標準庫調用外部命令的各種場景。在實際應用中, 基本用的最多的還是封裝好的:ExecCommandOneTimeOutput()和ExecCommandLoopTimeOutput()兩個函數, 畢竟外部命令一般只會包含兩種:一種是執行后馬上獲取結果,第二種就是常駐內存持續獲取結果。

責任編輯:趙寧寧 來源: 二進制空間安全
相關推薦

2017-03-27 14:16:52

Vimshell命令

2017-11-27 09:11:42

SSDceph應用

2021-12-27 03:40:41

Go場景語言

2025-07-28 06:32:12

Gogo func()

2024-08-27 08:35:43

JavaScriptPromise模式

2019-08-28 09:04:02

Go語言Python操作系統

2024-04-16 12:13:07

usingC#開發

2020-01-14 11:17:33

Go并發Linux

2021-05-21 07:59:40

應用程序設計動態庫函數

2021-05-07 16:19:36

異步編程Java線程

2017-07-17 16:27:10

Docker Comp鏈接容器

2014-09-23 14:17:31

Android圓形圖片

2011-06-19 08:59:59

錨文本

2024-02-26 00:00:00

GoSocket編程

2024-03-19 14:15:48

Go程序os.Exit()

2021-08-02 11:13:28

人工智能機器學習技術

2024-02-21 08:33:27

GoReadDir性能

2020-07-24 08:04:18

Lambda

2018-01-16 15:42:38

Windows 10SSD磁盤

2023-12-13 07:19:01

微服務架構Golang
點贊
收藏

51CTO技術棧公眾號

99热一区二区| 欧美激情视频一区二区三区| 国产精品视频一二三四区| 国产强被迫伦姧在线观看无码| 天天色天天射综合网| 欧美成人在线直播| 欧美性久久久久| www.亚洲免费| 国产一区二区免费看| 97视频com| 黄色av片三级三级三级免费看| 亚洲精品一区av| 亚洲国产中文字幕在线视频综合| 欧美日韩一区二区三区免费| 精品人妻无码一区二区 | 日韩黄色影视| 精品美女www爽爽爽视频| 久久高清免费观看| 久久国产精品网站| a毛片毛片av永久免费| 国产精品日本一区二区三区在线| 欧美日韩国产综合新一区| 亚洲一区二区三区在线观看视频| 欧美视频久久久| 久久成人18免费观看| 午夜精品一区二区三区在线 | 国产区二区三区| a'aaa级片在线观看| 中文字幕日韩欧美一区二区三区| 久久国产手机看片| 精品区在线观看| 久久国产视频网| 国产999在线| 日韩av免费网址| 亚洲最大黄网| 在线观看精品国产视频| 一出一进一爽一粗一大视频| 亚洲欧洲国产精品一区| 欧美日韩成人高清| 看欧美ab黄色大片视频免费| 欧美男人天堂| 精品magnet| 亚洲国产精品无码av| 国产原创视频在线观看| 亚洲国产高清在线| 手机成人在线| 成人影院免费观看| www激情久久| 久久国产精品一区二区三区四区| 欧美自拍第一页| 国产a区久久久| 97netav| 国产一区二区在线不卡| 日本成人在线视频网站| 国产精品极品尤物在线观看| 久久影视中文字幕| 日韩成人dvd| 国产精品黄色av| 最新中文字幕在线观看视频| 日韩精品电影在线观看| 国产精品久久久久99| 中文字幕在线日本| 欧美aaaaaa午夜精品| 国产精品久久久久久久av大片| 成人公开免费视频| 日韩电影在线观看网站| 国产精品欧美亚洲777777| 中文字幕男人天堂| 狠狠v欧美v日韩v亚洲ⅴ| 亚洲精品欧美日韩| 成人av手机在线| 成人aa视频在线观看| 精品欧美一区二区久久久伦| 嫩草研究院在线| 国产精品久久久久久久裸模| 国产高清精品软男同| mm1313亚洲国产精品美女| 亚洲精品一卡二卡| www.av片| 欧美暴力调教| 欧美日韩精品一区二区三区 | 在线天堂中文字幕| 日韩精品免费专区| 国产日韩视频在线观看| 国产视频在线一区| 成人小视频免费观看| 欧美激情专区| 欧美激情免费| 亚洲福利一二三区| 欧美伦理视频在线观看| 国产美女视频一区二区| 日韩高清a**址| 青青青视频在线播放| 欧美激情aⅴ一区二区三区| 久久免费少妇高潮久久精品99| 欧美国产成人精品一区二区三区| 秋霞电影网一区二区| 98国产高清一区| 日本人妖在线| 亚洲欧美日韩精品久久久久| 精品久久一二三| 欧美视频第一| 精品999在线播放| 国产三级在线观看完整版| 黄色亚洲大片免费在线观看| 国产成人福利视频| 亚洲第一成人av| 久久久99久久精品欧美| 国产精品日韩三级| 97精品国产99久久久久久免费| 欧美一级黄色大片| 色婷婷av777| 欧美日韩国产精品一区二区亚洲| 国产91在线高潮白浆在线观看| 精品人妻无码一区二区三区蜜桃一 | 日本精品久久久久久久| 午夜精品一区二区三| 欧美激情中文不卡| 给我免费播放片在线观看| 九七电影院97理论片久久tvb| 亚洲成人网av| 国产日韩欧美在线观看视频| 日韩av一区二区三区四区| 国模精品娜娜一二三区| 黄色视屏免费在线观看| 欧洲中文字幕精品| 亚洲狠狠婷婷综合久久久久图片| 中文字幕一区二区三区在线视频| 国产精品久久久久久久久久尿 | jizz欧美| 亚洲欧洲第一视频| 日韩欧美成人一区二区三区| 国产成人精品亚洲777人妖| 亚洲国产日韩美| 欧美舌奴丨vk视频| 日韩精品亚洲元码| 日韩三级小视频| 国产a久久麻豆| av动漫在线播放| 亚洲狼人综合| xxxxxxxxx欧美| 性色av一区二区三区四区| 久久日一线二线三线suv| 亚洲人成无码网站久久99热国产 | 91av手机在线| 青青草97国产精品免费观看 | 亚洲a一区二区三区| 国产精品免费视频xxxx| 国产三级视频在线| 日本电影亚洲天堂一区| 国产特级黄色录像| 久久国产高清| 精品不卡在线| 伊人网在线播放| 亚洲精品综合精品自拍| 日本视频在线观看免费| 久久亚洲春色中文字幕久久久| 男人添女人下面高潮视频| 日韩av系列| 热99在线视频| 成人精品一区二区三区免费| 精品视频1区2区3区| 91香蕉视频污在线观看| 韩国毛片一区二区三区| 国产香蕉一区二区三区| 中文字幕视频精品一区二区三区| 欧美成人中文字幕| 欧日韩在线视频| 精品美女国产在线| 免费看91的网站| 捆绑调教美女网站视频一区| 在线综合视频网站| 亚洲精品高潮| 久久久久久亚洲精品中文字幕| 天天干,天天操,天天射| 色域天天综合网| 国产1区2区在线观看| 精品一二三四在线| 男人添女荫道口女人有什么感觉| 欧美国产极品| 国产91在线播放九色快色| 日本在线视频观看| 欧美一级理论片| 青青青国产在线| 中文字幕一区二区在线观看| 日本中文字幕精品| 国产亚洲永久域名| 水蜜桃亚洲精品| 88久久精品| 日本不卡视频在线播放| 九七久久人人| 日韩久久免费电影| 91国产免费视频| 亚洲第一综合色| 黄色国产在线播放| 成人亚洲精品久久久久软件| 国产免费人做人爱午夜视频| 亚洲精品国产成人影院| 久久青青草综合| 国产成人久久精品一区二区三区| 午夜免费日韩视频| 日本高清中文字幕在线| 日韩福利在线播放| 国产肥老妇视频| 色噜噜狠狠成人中文综合 | 黄色av网站在线免费观看| 5858s免费视频成人| 在线免费黄色av| 亚洲精品中文在线观看| 亚洲精品国产精品国自| 99国产精品99久久久久久| 亚洲第一区第二区第三区| 欧美亚洲三级| 日韩黄色片在线| 国产精品97| 欧美久久久久久一卡四| 91麻豆精品激情在线观看最新| 国产精品视频一区国模私拍| 女人让男人操自己视频在线观看| 欧美成aaa人片免费看| 国产黄色片在线观看| 日韩av网站在线| 国产黄色小视频在线观看| 欧美性淫爽ww久久久久无| 欧美一级视频免费观看| 亚洲综合色区另类av| 免费黄色国产视频| 中文字幕精品综合| 中文字幕在线免费看线人| 毛片无码国产| 国产美女精品视频免费播放软件| 91免费视频网| 中文字幕22页| 视频一区视频二区在线观看| 免费在线观看视频a| 欧美二区视频| 精品少妇人妻av一区二区| 欧洲三级视频| 欧美日本亚洲| 中文字幕精品无| 97国产一区二区| 国产69视频在线观看| 国产黑丝在线一区二区三区| 99国产精品久久久久久| 久久精品99久久久| the porn av| 美日韩一级片在线观看| 天天操天天爱天天爽| 日日夜夜精品视频免费| 国产av人人夜夜澡人人爽| 国精产品一区二区三区有限公司 | 日韩高清一区| 国产欧美精品日韩| 日韩大陆av| 91国产丝袜在线播放| 中文字幕无线精品亚洲乱码一区 | 日韩中文一区二区| 91热福利电影| 久久的色偷偷| 99热国产免费| 好吊妞国产欧美日韩免费观看网站| 国产精品久久九九| 久久黄色影视| 久久婷婷国产综合尤物精品| 国产做受高潮漫动| 国产美女精品视频免费播放软件| 97在线视频免费看| 妞干网免费在线视频| 国产99久久精品一区二区 夜夜躁日日躁| 久久r热视频| 欧美日韩中国免费专区在线看| 国产美女免费网站| 国产精品人成在线观看免费| 国产精品99久久久久久成人| 亚洲精品国久久99热| 国产一级片视频| 富二代精品短视频| 伊人久久久久久久久久久久| 欧美日韩免费不卡视频一区二区三区| 伊人情人网综合| 亚洲在线观看av| 精品福利免费观看| 草莓视频18免费观看| 欧美日韩美少妇| 亚洲AV无码乱码国产精品牛牛| 成人一区在线看| 丁香啪啪综合成人亚洲| 麻豆精品一区二区| √天堂资源在线| 91网站视频在线观看| 欧美丰满老妇熟乱xxxxyyy| 亚洲精品五月天| 中文字幕第3页| 一级片在线观看视频| 国产精品久久久久天堂| 欧美日韩免费做爰视频| 精品久久久久久久久久久久久久 | 色吧亚洲日本| 亚洲高清色综合| 国产黄色在线| 欧美精品videossex88| 日韩免费福利视频| 91丝袜脚交足在线播放| 久久av导航| 欧美日韩dvd| 色呦呦呦在线观看| 国产曰批免费观看久久久| 2022亚洲天堂| 国内精品久久久久影院一蜜桃| 一起草在线视频| 亚洲欧洲精品天堂一级| 国产精品男女视频| 欧美一区二区精美| 国产私人尤物无码不卡| 欧美国产日韩一区| 成人免费视频观看| 精品一区二区日本| 欧美18一19xxx性| 亚洲女同性videos| 天堂成人av| 国产精品最新在线观看| 日韩高清在线免费观看| 国产制服91一区二区三区制服| 日韩精品亚洲一区| 疯狂揉花蒂控制高潮h| 亚洲精品福利视频网站| 中文字幕有码无码人妻av蜜桃| 亚洲国产婷婷香蕉久久久久久| 激情成人四房播| 国产精品激情av在线播放 | 久久综合999| 最近中文字幕2019免费| 欧美熟妇另类久久久久久不卡 | 日本道中文字幕| 亚洲色图.com| 成人黄色三级视频| 国产亚洲成av人片在线观看桃| 免费高潮视频95在线观看网站| 超碰97人人人人人蜜桃| 色欲av永久无码精品无码蜜桃| 亚洲精品久久久久| а√天堂资源官网在线资源| 18成人免费观看网站下载| 五月久久久综合一区二区小说| 久久久精品麻豆| 国产人成一区二区三区影院| 日韩一级在线视频| 亚洲日韩第一页| 欧美日韩视频免费观看| 免费在线观看91| 久久亚洲精选| 无码少妇一区二区| 欧美亚洲国产一区二区三区| 爱爱爱免费视频在线观看| 国产精品久久久久久久久久东京 | 夜夜爽www精品| 麻豆国产精品777777在线| 女同久久另类69精品国产| 欧美巨大另类极品videosbest| 美女隐私在线观看| 亚洲一区中文字幕在线观看| 欧美精品入口| 超碰caoprom| 黑人巨大精品欧美一区二区| 久久免费看视频| 国产精品久久久久久av福利软件| 精品国产日韩欧美| 性chinese极品按摩| 亚洲视频一区在线| 亚洲精品久久久蜜桃动漫| 午夜精品久久久久久久99黑人| 天堂成人娱乐在线视频免费播放网站| 成人在线免费观看av| 国产欧美中文在线| 国产精品一区二区黑人巨大| 欧美成人午夜激情在线| 久久综合另类图片小说| 91av俱乐部| 亚洲男人电影天堂| 五月婷婷久久久| 国产精品日韩一区| 中文字幕一区二区三区在线视频 | 久久视频这里有精品| 国产夜色精品一区二区av| 91久久国语露脸精品国产高跟| 色综合老司机第九色激情 | 日韩禁在线播放| 欧美一级网址| 国产精品12345| 日本一区二区动态图| 精品人妻无码一区二区| 国产成人精品久久| 你懂的视频一区二区| 亚洲熟妇一区二区三区| 欧美精品aⅴ在线视频| 欧美日韩国产观看视频| 一本色道久久99精品综合| av在线播放不卡| 亚洲综合一区中| 97在线视频一区|