网站地图    收藏   

主页 > 后端 > Golang >

golang执行系统command

来源:未知    时间:2019-12-10 21:26 作者:小飞侠 阅读:

[导读] golang下的os/exec包执行外部命令,它将os.StartProcess进行包装使得它更容易映射到stdin和stdout。这点和python下的command、os.system等功能是一样的。这里列两个具体操作的代码。其可以调用类...

golang下的os/exec包执行外部命令,它将os.StartProcess进行包装使得它更容易映射到stdin和stdout。这点和python下的command、os.system等功能是一样的。这里列两个具体操作的代码。其可以调用类LINUX系统下的shell命令,也可以在windows下调用cmd下的命令。

Linux下执行命令的方法

代码一

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

以上代码执行后,效果如下:


[root@361way go] go  run cmd.go
--- stdout ---
total 24
drwxr-xr-x 6 root root   79 Jun 13  2017 src
-rw-r--r-- 1 root root  752 Aug 19 10:55 login.go
-rw-r--r-- 1 root root 1189 Aug 19 14:29 log.go
-rw-r--r-- 1 root root  623 Aug 19 16:43 cmd.go
-rw-r--r-- 1 root root  538 Aug 19 17:41 cmd2.go
-rw-r--r-- 1 root root  519 Aug 19 21:38 http.go
-rw-r--r-- 1 root root  462 Aug 19 22:29 test.py
--- stderr --


代码二

package main
import (
          "fmt"
          "os/exec"
)
func Cmd(cmd string, shell bool) []byte {
if shell {
    out, err := exec.Command("bash", "-c", cmd).Output()
    if err != nil {
        panic("some error found")
    }
    return out
} else {
    out, err := exec.Command(cmd).Output()
    if err != nil {
        panic("some error found")
    }
    return out
        }
}
func main() {
        //cmd := "ls -al"
        cmd := "python test.py"
        //cmd := "python -V" //没有输出
        //cmd := "env"
        out := string(Cmd(cmd,true))
        //out := string(Cmd(cmd,false))
        fmt.Println(out)
}


因为都是调用的exec.Command方法并调用bash shell,本质上并没有什么区别。其也可以正常调用python脚本,但在直接调用python -V命令时没有输出,这点感觉很奇怪。


image.png


windows下执行命令的方法


package main
import(
    "fmt"
    "os/exec"
)
func main(){
    c := exec.Command("cmd", "/C", "del", "D:\\a.txt")
    if err := c.Run(); err != nil {
        fmt.Println("Error: ", err)
    }
}


自学PHP网专注网站建设学习,PHP程序学习,平面设计学习,以及操作系统学习

京ICP备14009008号-1@版权所有www.zixuephp.com

网站声明:本站所有视频,教程都由网友上传,站长收集和分享给大家学习使用,如由牵扯版权问题请联系站长邮箱904561283@qq.com

添加评论