Как получить стандартный вывод при отправке нескольких команд в Go - PullRequest
1 голос
/ 22 апреля 2020

Я пишу Go функцию для загрузки локальных Docker изображений в экземпляр, который имеет доступ S SH. Для этого я использую следующий метод:

        cmdSave := exec.Command("docker", "save", image)
        cmdLoad := exec.Command("ssh", fmt.Sprintf("%s@%s", user, externalIP), "docker load")

        read, write := io.Pipe()
        cmdSave.Stdout = write
        cmdLoad.Stdin = read

        var buffer bytes.Buffer
        cmdLoad.Stdout = &buffer
        var stderrSave bytes.Buffer
        cmdSave.Stderr = &stderrSave
        var stderrLoad bytes.Buffer
        cmdLoad.Stderr = &stderrLoad

        err = cmdSave.Start()
        if err != nil {
            return errors.Wrap(err, stderrSave.String())
        }

        err = cmdLoad.Start()
        if err != nil {
            return errors.Wrap(err, stderrLoad.String())
        }
        err = cmdSave.Wait()
        if err != nil {
            return errors.Wrap(err, stderrSave.String())
        }

        err = write.Close()
        if err != nil {
            return err
        }

        err = cmdLoad.Wait()
        if err != nil {
            return errors.Wrap(err, stderrLoad.String())
        }

        _, err = io.Copy(os.Stdout, &buffer)
        if err != nil {
            return err
        }

Однако из-за того, как команды передаются по конвейеру, возникает проблема, например, с ключом S SH или WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!, когда SSH к экземпляру, функции просто бесконечно зависают на cmdSave.Wait (), и никакой вывод не отображается, оставляя пользователя не знающим, в чем проблема.

Есть ли способ сделать это так, чтобы вывод не проглатывался, а функция не оставалась зависшей?

...