Получение EOF как ошибки в golang s sh закрытии сеанса - PullRequest
1 голос
/ 27 марта 2020

Я использую модуль 's sh' golang, и мне интересно, реализовал ли я его (или пытался). Является ли "EOF" как ошибка, ожидаемая в сеансе. Close ()? В примерах, которые я видел в Интернете, никто не проверяет ошибку session.Close (). Это то, что я должен игнорировать или обрабатывать? Из того, что я могу сказать, от сервера также не ожидается никаких ошибок. Мне интересно, не выполняю ли я команду правильно или нет, или не читаю буфер должным образом.

Вот мой код:

package main

import (
    "bytes"
    "fmt"
    "strings"

    "golang.org/x/crypto/ssh"
)

func main() {
    sshConfig := &ssh.ClientConfig{
        User: “my_username”,
        Auth: []ssh.AuthMethod{
            ssh.Password(“my password”),
        },
        HostKeyCallback: ssh.InsecureIgnoreHostKey(),
    }
    connection, err := ssh.Dial("tcp", "localhost:22", sshConfig)
    if err != nil {
        fmt.Printf("Failed to dial: %s\n", err)
        return
    }

    defer func() {
        if err := connection.Close(); err != nil {
            fmt.Println("Received an error closing the ssh connection: ", err)
        } else {
            fmt.Println("No error found closing ssh connection")
        }
    }()

    session, err := connection.NewSession()
    if err != nil {
        fmt.Printf("Failed to create session: %s\n", err)
        return
    }

    defer func() {
        if err := session.Close(); err != nil {
            fmt.Println("Received an error closing the ssh session: ", err)
        } else {
            fmt.Println("No error found closing ssh session")
        }
    }()
    fmt.Println("created session")
    var stdOut bytes.Buffer
    var stdErr bytes.Buffer

    session.Stdout = &stdOut
    session.Stderr = &stdErr
    err = session.Run("pwd")
    fmt.Println("Executed command")

    fmt.Println("Command stdOut is:", strings.TrimRight(stdOut.String(), "\n"), " --- stdError is:", strings.TrimRight(stdErr.String(), "\n"))

}

Вывод, который я получаю:

$ go run main.go
created session
Executed command
Command stdOut is: /Users/my_username  --- stdError is: 
Received an error closing the ssh session:  EOF
No error found closing ssh connection
$ 

Любой совет?

1 Ответ

1 голос
/ 27 марта 2020

Это похоже на golang / go / Issue 31401 (что затем относится к Issue 32453 : "x/crypto/ssh: семантика вокруг выполнения session.Wait () после вызова сеанса. Run (), когда отправляются сообщения EOF ")

Ошибка возвращается, так как сеанс уже закрыт (Run()).
Соединение S SH пропадает, потому что оно никогда не закрывается - клиентский объект, возвращенный из Dial(), отбрасывается, но это объект, который необходимо закрыть для очистки основного TCP-соединения.

Помимо этого, это кажется тонким API для используйте правильно.
Сеанс может быть закрыт асинхронно в любое время другой стороной, и поэтому всегда правильно написанный код может получить EOF от Close()

Так что вы можете захотеть проверить эту конкретную ошибку и игнорировать ее в своей функции отсрочки.

...