我已经被困在这个几天了,我试图运行一个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)
}