Как прочитать стандартный вывод из неудачной команды - PullRequest
0 голосов
/ 05 ноября 2019

У меня есть следующий код, чтобы проверить, работает ли SSH-соединение с данным хостом.

func IsSSHConnectionWorking(Host Host) bool {
    cmd :=
        fmt.Sprintf("ssh -o \"PasswordAuthentication no\" -i %s -p %s %s@%s", Host.IdentityFile, Host.Port, Host.User, Host.IP)

    fmt.Printf("Connecting to %s with %s", Host.IP, cmd)

    output, err := exec.Command("bash", "-c", cmd).Output()

    if err != nil {
        log.Println(err)
        log.Printf("Failed to connect to Host: %s\n Error: %s", Host.IP, output)
        return false
    }

    return true
}

Я заметил, что если параметр неверен, ошибка, возвращаемая обратно в программуравен exit status 255, а вывод пуст.

Выполнение проблемной команды на самом CLI вернет user@host: Permission denied (publickey,password).

Есть ли способ перехватить это?

1 Ответ

2 голосов
/ 05 ноября 2019

Пожалуйста, попробуйте использовать CombinedOutput вместо этого, так как это будет захватывать как stdout, так и stderr. Между тем, Output возвращает только стандартный вывод.

https://golang.org/pkg/os/exec/#Cmd.CombinedOutput

Если вы все еще хотите использовать Output, пожалуйста, приведите ошибку к ExitError и также проверьте ExitError.Stderr.

https://golang.org/pkg/os/exec/#Cmd.Output

...