为了账号安全,请及时绑定邮箱和手机立即绑定

如何使用未知参数执行系统命令?

如何使用未知参数执行系统命令?

Go
天涯尽头无女友 2021-07-06 13:50:26
我有一堆系统命令,它们有点类似于将新内容附加到文件中。我写了一个简单的脚本来执行系统命令,如果有像 'ls' 、 'date' 等单个词,它运行良好。但是如果命令大于这个,程序就会死掉。以下是代码package mainimport (    "fmt"    "os/exec"    "sync")func exe_cmd(cmd string, wg *sync.WaitGroup) {    fmt.Println(cmd)    c = cmd.Str    out, err := exec.Command(cmd).Output()    if err != nil {        fmt.Println("error occured")        fmt.Printf("%s", err)    }    fmt.Printf("%s", out)    wg.Done()}func main() {    wg := new(sync.WaitGroup)    wg.Add(3)    x := []string{"echo newline >> foo.o", "echo newline >> f1.o", "echo newline >> f2.o"}    go exe_cmd(x[0], wg)    go exe_cmd(x[1], wg)    go exe_cmd(x[2], wg)    wg.Wait()}以下是我看到的错误exec: "echo newline >> foo.o": executable file not found in $PATHexec: "echo newline >> f2.o": executable file not found in $PATHexec: "echo newline >> f1.o": executable file not found in $PATH 我想,这可能是由于没有单独发送 cmds 和参数(http://golang.org/pkg/os/exec/#Command)。我想知道如何颠覆这一点,因为我不知道我的命令中有多少参数需要执行。
查看完整描述

3 回答

?
喵喔喔

TA贡献1735条经验 获得超5个赞

因为exec.Command()第一个参数需要是可执行文件的路径。然后剩余的参数将作为参数提供给可执行文件。使用strings.Fields()以帮助分裂字为[]字符串。


例子:

package main


import (

    "fmt"

    "os/exec"

    "sync"

    "strings"

)


func exe_cmd(cmd string, wg *sync.WaitGroup) {

    fmt.Println(cmd)

            parts := strings.Fields(cmd)

    out, err := exec.Command(parts[0],parts[1]).Output()

    if err != nil {

        fmt.Println("error occured")

        fmt.Printf("%s", err)

    }

    fmt.Printf("%s", out)

    wg.Done()

}


func main() {

    wg := new(sync.WaitGroup)

    commands := []string{"echo newline >> foo.o", "echo newline >> f1.o", "echo newline >> f2.o"}

    for _, str := range commands {

        wg.Add(1)

        go exe_cmd(str, wg)

    }

    wg.Wait()

}

这是另一种方法,它只是将所有命令写入一个文件,然后在新创建的输出目录的上下文中执行该文件。


示例 2

package main


import (

    "os"

    "os/exec"

    "fmt"

    "strings"

    "path/filepath"

)

var (

    output_path = filepath.Join("./output")

    bash_script = filepath.Join( "_script.sh" )

)

func checkError( e error){

    if e != nil {

        panic(e)

    }

}

func exe_cmd(cmds []string) {

    os.RemoveAll(output_path)

    err := os.MkdirAll( output_path, os.ModePerm|os.ModeDir )

    checkError(err)

    file, err := os.Create( filepath.Join(output_path, bash_script))

    checkError(err)

    defer file.Close()

    file.WriteString("#!/bin/sh\n")

    file.WriteString( strings.Join(cmds, "\n"))

    err = os.Chdir(output_path)

    checkError(err)

    out, err := exec.Command("sh", bash_script).Output()

    checkError(err)

    fmt.Println(string(out))

}


func main() {

    commands := []string{

    "echo newline >> foo.o",

    "echo newline >> f1.o",

    "echo newline >> f2.o",

    }

   exe_cmd(commands)

}


查看完整回答
反对 回复 2021-07-12
  • 3 回答
  • 0 关注
  • 208 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信