在golang-ssh会话关闭时将EOF作为错误获取



我使用'ssh'golang模块,我想知道我是否实现了它(或尝试实现它(。"EOF"是否为会话中预期的错误。关闭((?在我在网上看到的例子中,没有人检查会话。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: %sn", 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: %sn", 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
$ 

有什么建议吗?

这似乎类似于golang/go/issue 31401(然后指issue 32453:"x/crypto/ssh:关于运行会话的语义。调用会话后等待((。Run((,当发送EOF消息时"(

由于会话已关闭(由Run()关闭(,因此返回错误
SSH连接泄漏是因为它从未关闭——从Dial()返回的客户端对象被丢弃,但这是需要关闭以清理底层TCP连接的对象。

顺便说一下,这似乎是一个微妙的API,可以正确使用
会话可以随时由另一方异步关闭,因此正确编写的代码始终可以从Close()获得EOF

因此,您可能需要测试该特定错误,并在defer函数中忽略它。

最新更新