Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在golang ssh会话关闭中获取EOF as错误_Go_Ssh - Fatal编程技术网

在golang ssh会话关闭中获取EOF as错误

在golang ssh会话关闭中获取EOF as错误,go,ssh,Go,Ssh,我正在使用“ssh”golang模块,我想知道我是否实现了它(或试图实现它)。 会话.Close()中是否应出现“EOF”错误?在我在线看到的示例中,没有人检查session.Close()错误。这是我应该忽略或处理的事情吗? 据我所知,服务器也不会出现错误。 我想知道我是否没有正确执行命令,或者没有正确读取缓冲区 这是我的密码: package main import ( "bytes" "fmt" "strings" "golang.org/x/crypt

我正在使用“ssh”golang模块,我想知道我是否实现了它(或试图实现它)。 会话.Close()中是否应出现“EOF”错误?在我在线看到的示例中,没有人检查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
$ 
有什么建议吗?

类似于(指:
x/crypto/ssh
:调用session.Run()后运行session.Wait()的语义,发送EOF消息时)

返回错误是因为会话已关闭(通过
Run()
)。
SSH连接泄漏,因为它从未关闭过-从
Dial()
返回的客户端对象被丢弃,但需要关闭该对象才能清理底层TCP连接

另外,这似乎是一个需要正确使用的微妙API。
会话可以在任何时候由另一方异步关闭,因此正确编写的代码总是可以从
Close()


因此,您可能希望测试该特定错误,并在延迟函数中忽略它。

谢谢您的回复!您提供的内容很有意义,我得到了run=start+wait,但我仍然觉得在Close()中将EOF作为“error”返回很奇怪。查看Close()是否应为nil的干净/精确版本,对吗?我想这需要记录下来?或者固定不返回EOF而不是nil。@ozn“我仍然觉得有点奇怪”:确切地说,这就是我提到的问题。这使得API的使用非常挑剔。谢谢。我将在golang中打开一个bug,更准确地说是这些东西。@ozn好的,让我知道问题的URL:我将遵循它。这里是链接:让我们看看他们说了什么。