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