Go 执行命令获取结果 golang os/exec StdoutPipe StdinPipe

0xFFFFFFFE · · 1114 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

go语言执行命令

go在执行Cmd/Shell命令时,跟一些语言是有区别的.
在不调用shell的情况下,需要自己对每个步骤手动写

我的目的是执行

netstat -aon | findstr :80   //Win
netstat -ano | grep :80  //Unix

因为中间加了管道| 所以很多资料都不能满足我的想法
所以自己手动找了很多资料实现了

过程

  • cmdNetstat
  • cmdGrep
  • netstatOutPutPip (输出管道)
  • grepInPutPip(输入管道)
  • cmdNetstat.Start
  • 得到输出管道中的数据
  • cmdGrep.Start
  • 将得到的数据写入另一个管道
  • 得到最后的结果数据

代码


func ShellCmdNetstat(port int) ([]byte, error) {
    cmdNetstat := exec.Command("netstat", "/a", "/n", "/o") // netstat -ano

    var cmdGrep *exec.Cmd
    if runtime.GOOS == "windows" {
        cmdGrep = exec.Command("findstr", fmt.Sprintf(":%d ", port)) // win:    findstr ":80 "
    } else if runtime.GOOS == "linux" {
        cmdGrep = exec.Command("grep", fmt.Sprintf(":%d ", port)) // unix:  grep ":80"
    }

    netstatOutPutPip, _ := cmdNetstat.StdoutPipe() // netstat out pipe
    grepInPutPip, _ := cmdGrep.StdinPipe()         // grep in pipe

    if err := cmdNetstat.Start(); err != nil {
        return make([]byte, 0), err
    }

    data, _ := ioutil.ReadAll(netstatOutPutPip)

    if err := cmdNetstat.Wait(); err != nil {
        fmt.Println("cmdNetstat.Wait()", err)
        return make([]byte, 0), err
    }

    var grepOutBuffer bytes.Buffer
    cmdGrep.Stdout = &grepOutBuffer
    if err := cmdGrep.Start(); err != nil {
        fmt.Println(err)
        return make([]byte, 0), err
    }

    grepInPutPip.Write(data) // cmdNetstat out >> grepInPutPip in

    // 这行代码让你原地打转2天
    // The pipe will be closed automatically after Wait sees the command exit.
    // A caller need only call Close to force the pipe to close sooner.
    // For example, if the command being run will not exit until standard input
    // is closed, the caller must close the pipe.
    grepInPutPip.Close() //  This Is So Important!!!  命令在输入关闭后才会执行返回时需要显式关闭管道。

    if err := cmdGrep.Wait(); err != nil {
        return make([]byte, 0), err
    }
    return grepOutBuffer.Bytes(), nil
}





有疑问加站长微信联系(非本文作者)

本文来自:简书

感谢作者:0xFFFFFFFE

查看原文:Go 执行命令获取结果 golang os/exec StdoutPipe StdinPipe

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

1114 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传