精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

久久久久九九九九| 亚洲国产毛片完整版| 特级黄色录像片| 亚洲第一黄色片| 国产精品一区毛片| 正在播放亚洲1区| 永久免费看片在线观看| 天堂√8在线中文| 国产精品久久一卡二卡| 国产精品露出视频| 少妇又紧又色又爽又刺激视频| 99re6这里只有精品| 日韩精品一区国产麻豆| 日韩视频在线免费看| www国产在线观看 | 又黄又爽又色的视频| 久久99亚洲网美利坚合众国| 久久久久成人黄色影片| 91久久国产婷婷一区二区| 日韩三级视频在线| 91欧美日韩| 日韩国产欧美精品一区二区三区| av中文字幕网址| 男人av在线播放| 亚洲女人的天堂| 欧美性天天影院| 精品乱子伦一区二区| 日韩成人av影视| 91精品国产乱码久久久久久蜜臀| 国产福利视频网站| 国产欧美日韩免费观看| 亚洲福利视频在线| 天天久久综合网| 91大神在线观看线路一区| 亚洲成人av资源| 亚洲黄色网址在线观看| 国产免费a∨片在线观看不卡| 成人国产免费视频| 91丝袜脚交足在线播放| 在线观看毛片av| 可以看av的网站久久看| 国自在线精品视频| 青青草原国产视频| 欧美影院一区| 久热在线中文字幕色999舞| 亚洲一区 欧美| 精品美女久久久| 日韩精品黄色网| www.超碰97| 青青一区二区| 亚洲精品黄网在线观看| 岛国精品一区二区三区| 亚洲精品aⅴ| 欧美一区二区三区婷婷月色 | 精品在线视频一区| 国产精品欧美在线| 在线观看毛片视频| 亚洲熟妇无码另类久久久| 欧美卡一卡二| 亚洲一线二线三线久久久| 国产精品啪啪啪视频| 超碰免费公开在线| 亚洲黄色录像片| 国产精品va在线观看无码| 午夜成年人在线免费视频| 玉足女爽爽91| www.av片| 亚洲一区站长工具| 欧美性xxxxx极品少妇| the porn av| 青青青国产精品| 91精品福利在线一区二区三区| 日韩va在线观看| 伊色综合久久之综合久久| 精品久久人人做人人爽| chinese麻豆新拍video| 伊人久久大香线蕉| 最近免费中文字幕视频2019| 大地资源高清在线视频观看| 欧美阿v一级看视频| 午夜精品久久久久久久久久久久久| 日本中文字幕免费观看| 一区二区三区四区五区在线| 欧美中文在线视频| 中文字幕日本人妻久久久免费| 蜜臀av一区二区在线免费观看| 成人高清视频观看www| 99久久国产免费| 成人精品小蝌蚪| 欧美尤物一区| 韩国av网站在线| 黄色一区二区三区| 91欧美视频在线| 成人资源在线| 国产一区二区三区久久精品| 神马午夜精品91| 中文在线一区| 91嫩草在线视频| 亚洲欧美一区二区三| 中文在线资源观看网站视频免费不卡 | 蜜臀久久99精品久久久无需会员 | 69堂国产成人免费视频| 欧美熟妇精品一区二区蜜桃视频| 欧美日韩播放| 久久久久久久久久久免费精品| 无码人妻精品一区二区三区蜜桃91 | 欧美视频官网| 国产精品国产三级国产aⅴ浪潮 | www999久久| 亚洲美女中文字幕| 欧美另类视频在线观看| 日韩高清欧美激情| 国产精品一区二区a| av基地在线| 欧美色另类天堂2015| 欧美丝袜在线观看| 久久av综合| 97久久超碰福利国产精品…| 一区二区视频免费| 26uuu另类欧美亚洲曰本| 精品国产一区二区三区在线| 日韩免费va| 亚洲国产天堂久久综合网| 天海翼在线视频| 久久中文在线| 精品一区国产| 爱情岛亚洲播放路线| 91麻豆精品国产综合久久久久久| 精品人妻无码一区二区三区| 黑人一区二区| 51成人做爰www免费看网站| 国产精品久久久久久久龚玥菲| 亚洲国产综合视频在线观看| 午夜福利123| 成人羞羞网站入口免费| 国产91在线高潮白浆在线观看| 亚洲精品视频91| 亚洲男人的天堂一区二区| 成人免费在线观看视频网站| 伊人久久大香线蕉综合网蜜芽| 欧美—级高清免费播放| 国产www免费观看| 亚洲视频图片小说| 国产三级生活片| 欧美国产一区二区三区激情无套| 国产精品激情av电影在线观看| 日韩a级作爱片一二三区免费观看| 亚洲一区二区三区精品在线| 在线成人精品视频| 国内成人在线| 91一区二区三区| 特级毛片在线| 欧美r级在线观看| 精品视频久久久久| 粉嫩av一区二区三区| 日韩成人三级视频| 国产精品巨作av| 97在线观看视频| 亚洲色欧美另类| 欧美日韩中文字幕在线视频| 久久丫精品国产亚洲av不卡| 久久久噜噜噜| 视频一区视频二区视频三区高| 激情开心成人网| 久久韩国免费视频| 99久久一区二区| 亚洲一区二区四区蜜桃| 99riav国产精品视频| 激情一区二区| 欧美福利精品| 国产情侣一区二区三区| 另类色图亚洲色图| 人人妻人人澡人人爽久久av | 久久久久久久久97黄色工厂| 青青在线视频免费| 99久久99久久精品国产片果冰| 91免费精品国偷自产在线| 天堂8中文在线| 国产网站欧美日韩免费精品在线观看| 无码人妻精品一区二区三区9厂 | 欧美性猛交内射兽交老熟妇| 大奶在线精品| 国产精品福利在线观看网址| 日本福利专区在线观看| 日韩一区二区三| 日韩一区二区视频在线| 国产精品久久久久影院| 中文字幕无码毛片免费看| 亚洲欧美日本日韩| 在线观看成人av| 久久人人爽人人爽人人片av不| 欧洲亚洲妇女av| 麻豆tv入口在线看| 日韩麻豆第一页| 一级特黄aaa大片在线观看| 亚洲综合在线观看视频| 中文字幕被公侵犯的漂亮人妻| 久久机这里只有精品| 加勒比成人在线| 久久亚洲国产| 久久66热这里只有精品| 欧美特黄色片| 2019中文字幕免费视频| 欧美三级理伦电影| 日韩av影视综合网| 国产精品毛片久久久久久久av| 亚洲va欧美va人人爽午夜| 污污视频网站在线免费观看| a亚洲天堂av| 亚洲第一成肉网| 日韩精品五月天| 国产无限制自拍| 在线电影一区二区| 色999五月色| 日韩大尺度在线观看| 91九色国产社区在线观看| xxxxxx欧美| 97热在线精品视频在线观看| 免费网站免费进入在线| 亚洲欧美国产一本综合首页| 亚洲av无码乱码国产精品久久 | 午夜精品一区二区三区在线播放 | 亚洲丝袜精品丝袜在线| 久久久久久九九九九九| 成人污视频在线观看| 第一区免费在线观看| 日韩中文字幕一区二区三区| 妞干网在线观看视频| 午夜国产精品视频| 伊人情人网综合| 欧洲乱码伦视频免费| 久久久com| 久久99国产精品久久99大师| 91传媒视频免费| 亚洲欧美专区| 国产精品流白浆视频| 亚洲www免费| 日本精品免费一区二区三区| av免费不卡| 久久久久日韩精品久久久男男| 国产区在线观看| 日韩一中文字幕| 色的视频在线免费看| 在线成人免费网站| 国产黄在线播放| 亚洲性生活视频在线观看| 日韩a在线观看| 亚洲视频欧美视频| 国产黄色片在线观看| 国产一区二区三区视频| 国产三级视频在线播放线观看| 亚洲欧美色婷婷| 国产日本在线视频| 尤物九九久久国产精品的分类| 国产九九在线| 日韩三级影视基地| 菠萝菠萝蜜在线视频免费观看| www.欧美免费| 欧美人与性动交α欧美精品图片| 欧美夫妻性生活xx| 大香伊人中文字幕精品| 91精品国产高清自在线 | 国产美女91呻吟求| 91嫩草国产线观看亚洲一区二区 | 久久久久久国产精品久久| 色www永久免费视频首页在线| 久久人人看视频| 英国三级经典在线观看| 国产精品福利无圣光在线一区| 韩日精品一区| 亚洲一区二区免费| 激情小说亚洲色图| 色播亚洲视频在线观看| 99久久精品费精品国产风间由美| 国产又粗又爽又黄的视频| 欧美三级特黄| 男人天堂网视频| 麻豆91小视频| 91亚洲一线产区二线产区| 91伊人久久大香线蕉| 少妇av片在线观看| 一区二区在线观看视频| 黄网在线观看视频| 欧美在线高清视频| 亚洲成人中文字幕在线| 亚洲精品永久免费精品| 欧美尤物美女在线| 97在线观看视频| 免费成人黄色网| 国产精品美女久久久久av福利| 一本色道久久综合亚洲精品酒店| 亚洲欧美电影在线观看| 欧美日韩亚洲一区在线观看| 国产精品免费观看久久| 久色婷婷小香蕉久久| 精品一区二区三区四区五区六区| 国产婷婷色一区二区三区| 岛国毛片在线观看| 色88888久久久久久影院野外| 国产精品熟女久久久久久| 亚洲精品美女久久久久| 蜜桃视频网站在线观看| 欧美孕妇毛茸茸xxxx| 91国拍精品国产粉嫩亚洲一区| www 成人av com| 欧美综合在线视频观看| 欧美乱大交xxxxx潮喷l头像| 美女一区二区视频| 亚洲av无码国产精品久久| 亚洲精品视频在线看| 成人一二三四区| 亚洲精品v欧美精品v日韩精品| 免费网站黄在线观看| 国产999精品久久久影片官网| aaa国产精品| 尤物一区二区三区| 日本不卡一二三区黄网| 成人免费无码大片a毛片| 亚洲摸摸操操av| 亚洲一二区视频| 亚洲最新视频在线| 美女高潮视频在线看| 999国内精品视频在线| 色琪琪久久se色| 成年人网站大全| 成人性生交大片免费看视频在线 | 欧美二区不卡| 九九精品久久久| 亚洲国产电影在线观看| 欧美一区二区三区四| 亚洲精品一区二区三区在线观看| 暖暖日本在线观看| 国产精品揄拍一区二区| 欧洲乱码伦视频免费| 日本成人在线免费视频| 91香蕉视频mp4| 日韩精品人妻中文字幕| 精品国产乱码久久久久久图片 | 国产精品十八以下禁看| 伊人成综合网yiren22| 116极品美女午夜一级| a美女胸又www黄视频久久| 国产一国产二国产三| 日韩精品中文字幕在线不卡尤物| 国产黄大片在线观看画质优化| 国产欧美精品久久久| 日韩在线视频精品| 欧美成年人视频在线观看| 国产欧美日韩麻豆91| 久久久久久久亚洲| 伊人久久精品视频| 国产精品高潮久久| 伊人久久大香线蕉精品| 麻豆国产一区二区| 日韩欧美综合视频| 欧美一区二区三区免费大片| caoporm免费视频在线| 亚洲最大福利视频网站| 欧美黄色一区| 又黄又色的网站| 五月天亚洲精品| 毛片网站在线观看| 国产精品免费网站| 欧美好骚综合网| 无码人妻久久一区二区三区蜜桃| 亚洲午夜免费福利视频| 青青草观看免费视频在线| 国产精品video| 欧美国产偷国产精品三区| 26uuu国产| 欧美午夜精品伦理| 337p日本欧洲亚洲大胆鲁鲁| 成人在线国产精品| 国产精品theporn| 国产美女喷水视频| 精品视频在线免费观看| 18av在线播放| 久久国产精品久久| 日本伊人色综合网| 永久看片925tv| 日韩精品免费在线视频| 成人交换视频| 天堂а√在线中文在线| ww亚洲ww在线观看国产| 91亚洲精品国偷拍自产在线观看| 欧美日韩xxxxx| 国产aⅴ精品一区二区三区久久| 亚洲第一区第二区第三区| 亚洲r级在线视频| 成人在线观看一区| 高清视频在线观看一区| 久久久久国产精品一区三寸 | 欧美午夜性色大片在线观看| 69av在线| 精品国产乱码久久久久久郑州公司 | 日本熟妇人妻中出| 亚洲永久精品大片| 国产精品一区在线看| 国产精品视频在线免费观看| 三级久久三级久久久|