ddxiami

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 3434|回复: 2

go执行系统命令

[复制链接]
发表于 2020-11-19 12:24:33 | 显示全部楼层 |阅读模式
#范例1
======================================
package main

import (
  "bytes"
  "fmt"
  "io"
  "os"
  "os/exec"
)

func main() {
  // 1. exec.LookPath()
  cmdPath, _ := exec.LookPath("ls")
  fmt.Printf("cmdPath=%s\n", cmdPath)

  // 2. exec.Command()
  fmt.Println()
  cmd := exec.Command("ls", "-l")
  cmd.Stdout = os.Stdout
  // Run 和 Start只能用一个
  // Run starts the specified command and waits for it to complete.
  _ = cmd.Run()

  // Start starts the specified command but does not wait for it to complete.
  // _ = cmd.Start()
  // _ = cmd.Wait()

  // 3. pipe
  fmt.Println()
  ps := exec.Command("ps", "-ef")
  grep := exec.Command("grep", "-i", "ssh")

  r, w := io.Pipe()
  defer r.Close()
  defer w.Close()
  // ps | grep
  ps.Stdout = w
  grep.Stdin = r

  var buffer bytes.Buffer
  grep.Stdout = &buffer

  _ = ps.Start()
  _ = grep.Start()
  ps.Wait()
  w.Close()
  grep.Wait()
  io.Copy(os.Stdout, &buffer)
}
======================================



回复

使用道具 举报

 楼主| 发表于 2020-11-19 12:24:41 | 显示全部楼层
#范例2
======================================
package main

import (

    "bytes"

    "fmt"

    "log"

    "os/exec"

)

const ShellToUse = "bash"

func Shellout(command string) (error, string, string) {

    var stdout bytes.Buffer

    var stderr bytes.Buffer

    cmd := exec.Command(ShellToUse, "-c", command)

    cmd.Stdout = &stdout

    cmd.Stderr = &stderr

    err := cmd.Run()

    return err, stdout.String(), stderr.String()

}

func main() {

    err, out, errout := Shellout("ls -ltr")

    if err != nil {

        log.Printf("error: %v\n", err)

    }

    fmt.Println("--- stdout ---")

    fmt.Println(out)

    fmt.Println("--- stderr ---")

    fmt.Println(errout)

}

======================================
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-1-31 21:31:44 | 显示全部楼层
#简单的示例
======================================
package main

import (
    "fmt"
    "io/ioutil"
    "os/exec"
)

func main() {
    cmd := exec.Command("/bin/bash", "-c", `df -lh`)

    //创建获取命令输出管道
    stdout, err := cmd.StdoutPipe()
    if err != nil {
        fmt.Printf("Error:can not obtain stdout pipe for command:%s\n", err)
        return
    }

    //执行命令
    if err := cmd.Start(); err != nil {
        fmt.Println("Error:The command is err,", err)
        return
    }

    //读取所有输出
    bytes, err := ioutil.ReadAll(stdout)
    if err != nil {
        fmt.Println("ReadAll Stdout:", err.Error())
        return
    }

    if err := cmd.Wait(); err != nil {
        fmt.Println("wait:", err.Error())
        return
    }
    fmt.Printf("stdout:\n\n %s", bytes)
}
======================================
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|技术文档库 ( 闽ICP备15017263号-2 )|网站地图

GMT+8, 2025-5-18 17:24 , Processed in 0.035509 second(s), 16 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表