1 回答

TA贡献1793条经验 获得超6个赞
你有几个问题。
首先,您正在尝试生成一个交互式命令(默认情况下将在目标命名空间中启动一个shell),但是您也将stdout连接到变量,这意味着即使它有效,您也无法在命令退出之前看到任何输出,这可能不是您想要的。nsenter
其次,您没有将stdin连接到任何有用的东西,这意味着大多数交互式命令将简单地退出。
要在 Go 中启动交互式子命令,可以编写如下内容:
package main
import (
"os"
"os/exec"
)
func main() {
cmd := exec.Command("bash", "--norc")
cmd.Stdout = os.Stdout
cmd.Stdin = os.Stdin
cmd.Stderr = os.Stderr
cmd.Env = os.Environ()
cmd.Env = append(cmd.Env, "PS1=example$ ")
cmd.Run()
}
(这将启动一个带有提示符的外壳程序bashexample$ )
这里的关键是我们将 stdin、stdout 和 stderr 连接到父进程的相应描述符,这允许我们与子进程进行交互。
如果您不打算启动交互式 shell,那么您现在拥有的内容将起作用。也就是说,您可以编写:
package main
import (
"bytes"
"fmt"
"os/exec"
)
func main() {
var stdout bytes.Buffer
cmd := exec.Command("sudo", "nsenter", "-n", "--target", "2399896", "ip", "addr")
cmd.Stdout = &stdout
cmd.Run()
fmt.Println(stdout.String())
}
以上工作正常,并显示目标网络命名空间内运行的结果。ip addr
请注意,您可能更典型地使用模块中的方法:Outputexec
package main
import (
"fmt"
"os/exec"
)
func main() {
cmd := exec.Command("sudo", "nsenter", "-n", "--target", "2399896", "ip", "addr")
stdout, err := cmd.Output()
if err != nil {
panic(err)
}
fmt.Println(string(stdout))
}
- 1 回答
- 0 关注
- 139 浏览
添加回答
举报