golang调用外部命令,并且通过stdin传数据

golang调用外部命令,并且通过stdin传数据的例子

使用场景:

当我们需要调用一个外部命令,然后给外部命令传参数,常用方便的做法是通过命令行传参数,但是有些时候数据太长,或者基于安全考虑,比如传密码,等不方便使用参数时,我们可以通过stdin传递。

下面一个docker login传递密码的例子:

func dockerLogin(registry string, username string, token string) error {
    cmdarray := []string{"-c", fmt.Sprintf("docker login %s -u %s --password-stdin", registry, username)}
    cmd := exec.Command("bash", cmdarray...)

    stdin, err := cmd.StdinPipe()
    if err != nil {
        return err
    }

    go func() {
        defer stdin.Close()
        io.WriteString(stdin, token+"\n")
    }()

    _, err = cmd.CombinedOutput()
    if err != nil {
        return err
    }
    return nil
}

当然这都需要外部命令本身支持从stdin读入数据哈。

欢迎关注我们的微信公众号,每天学习Go知识