Запись в ssh.Session.StdinPipe () висит - PullRequest
0 голосов
/ 04 июня 2019

Я использую ssh-модуль go и пытаюсь передать данные из моей программы в удаленную оболочку через stdin.Это работает, как и ожидалось, печатая Hello World:

mySession := PrepareSession()  // helper method to prepare a Connection and Session object
output, _ := mySession.Output("echo Hello World")
fmt.Println(output)

Однако, когда я пытаюсь ввести ввод stdin, он зависает на строке myStdin.Write("Hello World") (я подтвердил это с помощью отладчика):

mySession := PrepareSession()
myStdin, _ := mySession.StdinPipe()
myStdin.Write("Hello World")
output, _ := mySession.Output("cat /dev/stdin | echo")
fmt.Println(output)

Замена myStdin.Write("Hello World") на fmt.Fprint(myStdin, "Hello World") приводит к той же проблеме.

В целом, я просто не понимаю, как работают каналы в Go - как мне заставить трубу перестать зависать, когда яподача входных данных к нему?

1 Ответ

2 голосов
/ 04 июня 2019

StdinPipe - это стандартный ввод для удаленной команды , как упоминалось в документации .

Ваш второй пример пытается выполнить запись в stdin на удаленномхост без запуска команды.Поскольку удаленной команды не существует, для stdin нет потребителя, который висит навсегда.

Вместо этого следует выполнить метод, аналогичный методу Output :

func (s *Session) Output(cmd string) ([]byte, error) {
    if s.Stdout != nil {
        return nil, errors.New("ssh: Stdout already set")
    }
    var b bytes.Buffer
    s.Stdout = &b
    err := s.Run(cmd)  <---- you need to run a command on the remote host.
    return b.Bytes(), err
}
...