![](/img/trans.png)
[英]Is there a way to chroot/sandbox a go os.exec call (prevent rm -rf /)
[英]Does os.exec from go (golang) not execute commands in $PATH?
我正在尝试使用exec库(golang)执行shell命令。 但是,每当我尝试使用随go install
二进制文件执行它时,它都无法工作。
我尝试仅在终端上运行我的二进制文件,它们可以工作。 我检查了我的$ PATH是否具有用于我的go路径的bin文件,以便在终端上正常运行。 但是后来我尝试通过执行以下操作在os exec中执行相同的检查:
echo := exec.Command("echo", "$PATH")
b, err := echo.Output()
if err != nil {
log.Fatal(err)
}
fmt.Println(string(b))
但是令人惊讶的是,它以一种奇怪的方式工作,它回显了文字字符串$PATH
! 难以置信! 我做错了什么吗? 我什至看不到$ PATH os exec实际上正在运行...也无法在go exec中将我的二进制文件作为命令运行,如下所示:
exec.Command("myCommand").Run()
任何人对为什么会这样有什么建议?
这个问题的问题不是打印 $PATH
。 无法正常工作的是,即使在$PATH
下,我也无法运行在$GOPATH/bin
下安装的命令
环境变量扩展是Shell功能,而不是程序功能。
您将必须使用os.Getenv("PATH")
。
echo := exec.Command("echo", os.Getenv("PATH"))
或者您可以使用
os.ExpandEnv
:
echo := exec.Command(strings.Fields(os.ExpandEnv("echo $PATH"))...)
您正在尝试运行shell命令,在不使用shell进行变量扩展的情况echo $PATH
。 正在运行的echo
是一个二进制文件,可能是/ bin / echo,并且正在传递字符串$PATH
。 $ PATH不会扩展,因为那是外壳程序的功能,并且不涉及,因此不会发生扩展。 要获得您期望的结果,您需要使用外壳程序来运行命令,例如exec.Command("sh", "-c", "echo $PATH")
所以我弄清楚了为什么我无法运行命令。 这是我的原始代码:
cmd := exec.Command("my command")
b, err := cmd.Output()
//fmt.Println("string(b):", string(b)) //<--inspecting stdout before throwing an error revealed that it *was* doing my command!
if err != nil {
log.Fatal(err)
}
fmt.Println("string(b):", string(b)) //<-- wouldn't run so I would never see its out put.
它正在运行命令,但是由于我发出的命令返回错误,因此exec也是如此,我无法确定它是否正在退出,因为找不到命令或命令有错误。 因此,如果命令抛出错误但也将其写入stdout,则可以在.Output()'s
两个返回值上获得“有效”信息。
我尝试打印$PATH
的唯一原因是查看go的exec env中的命令是否甚至在$ PATH中。 但是如果OneOfOne的答案明确指出,可以通过以下方式找到它:
echo := exec.Command("echo", os.Getenv("PATH"))
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.