使用Go运行带有参数的sh/bash/python脚本



我已经被困在这个几天了,我试图运行一个bash脚本运行的第一个参数(也许我应该放弃所有的希望,哈哈)

运行脚本的语法可以假定为:

sudo bash script argument,或者因为它有og+x,所以它可以运行为sudo script argument

在go中,我使用以下命令运行它:

package main
import (
    "os"
    "os/exec"
    "fmt"
)
func main() {
    c := exec.Command("/bin/bash", "script " + argument)
    if err := c.Run(); err != nil {
        fmt.Println("Error: ", err)
    }
    os.Exit(0)
}

我绝对没有运气,我也试过很多其他的变化,以及这个…

exec.Command("/bin/sh", "-c", "sudo script", argument)

exec.Command("/bin/sh", "-c", "sudo script " + argument) (my first try)

exec.Command("/bin/bash", "-c", "sudo script" + argument)

exec.Command("/bin/bash", "sudo script", argument)

exec.Command("/bin/bash sudo script" + argument)

大多数我遇到'/bin/bash sudo ect'没有这样的文件或目录,或Error: exit status 1我甚至已经写了一个Python包装器寻找一个参数和执行bash脚本与子进程。为了排除没有定义到脚本的路径,我已经尝试了以上所有方法,并使用直接路由到脚本而不是脚本名称。

看在我剩下的头发的份上,我在这里做错了什么?如何更好地诊断此问题,以便获得更多信息,而不是退出状态1?

您根本不需要调用bash/sh,只需单独传递每个参数,为了获得错误,您必须捕获命令的stderr,下面是一个工作示例:

func main() {
    c := exec.Command("sudo", "ls", "/tmp")
    stderr := &bytes.Buffer{}
    stdout := &bytes.Buffer{}
    c.Stderr = stderr
    c.Stdout = stdout
    if err := c.Run(); err != nil {
        fmt.Println("Error: ", err, "|", stderr.String())
    } else {
        fmt.Println(stdout.String())
    }
    os.Exit(0)
}

最新更新