gpt4 book ai didi

go - 关闭加密 ssh session 以释放 golang 中所有资源的正确方法?

转载 作者:IT王子 更新时间:2023-10-29 01:38:46 45 4
gpt4 key购买 nike

TL;DR - 关闭 golang.org/x/crypto/ssh session 以释放所有资源的正确方法是什么?

到目前为止我的调查:

golang.org/x/crypto/ssh *Session 有一个 Close() 函数调用 *Channel Close() 函数发送消息(我猜是远程服务器)关闭,但我没有看到任何关于关闭其他资源的信息,比如从 *Session StdoutPipe() 函数。

查看 *Session Wait() 代码,我看到 *Session stdinPipeWriter 已关闭,但与 无关标准输出管道

这个包感觉很像 os/exec 包,它保证使用 os/exec Wait() 函数将清理所有资源。在那里做一些简单的挖掘显示了 Wait() 函数中的一些相似之处。两者都使用以下结构来报告对它们的标准输出、标准错误、标准输入读取器/写入器的 io.Copy 调用的错误(好吧,如果我没看错的话,实际上只有一个错误)——显示的加密包:

var copyError error
for _ = range s.copyFuncs {
if err := <-s.errors; err != nil && copyError == nil {
copyError = err
}
}

但是 os/exec Wait() 也调用了这个关闭描述符方法

c.closeDescriptors(c.closeAfterWait)

这只是在 io.Closer 接口(interface)的一部分上调用 close 方法:

func (c *Cmd) closeDescriptors(closers []io.Closer) {
for _, fd := range closers {
fd.Close()
}
}

os/exec 创建管道时,它会跟踪需要关闭的内容:

func (c *Cmd) StdoutPipe() (io.ReadCloser, error) {
if c.Stdout != nil {
return nil, errors.New("exec: Stdout already set")
}
if c.Process != nil {
return nil, errors.New("exec: StdoutPipe after process started")
}
pr, pw, err := os.Pipe()
if err != nil {
return nil, err
}
c.Stdout = pw
c.closeAfterStart = append(c.closeAfterStart, pw)
c.closeAfterWait = append(c.closeAfterWait, pr)
return pr, nil
}

在此期间,我注意到 x/cyrpto/ssh *Session StdoutPipe() 返回一个 io.Readerox/exec 返回一个 io.ReadCloser。并且 x/crypto/ssh 不会跟踪要关闭的内容。我在库中找不到对 os.Pipe() 的调用,所以可能实现不同,我遗漏了一些东西并且被 Pipe 名称弄糊涂了。

最佳答案

通过调用 Close() 关闭 session 。没有涉及文件描述符,也没有对 os.Pipe 的任何调用,因为从 Session.StdOutPipe 返回的“管道”在概念上只是一个管道,并且是类型ssh.Channel。 Go channel 不需要关闭,因为关闭 channel 不是清理操作,而只是发送到 channel 的一种消息。 ssh 传输中只涉及一个网络连接。

您需要关闭的唯一资源是网络连接;没有其他系统资源可以释放。在 ssh.Client 上调用 Close() 将调用 ssh.Conn.Close,然后关闭 net.Conn.

如果您需要处理网络连接,您总是可以跳过ssh.Dial 便捷功能并自己拨号网络连接:

c, err := net.DialTimeout(network, addr, timeout)
if err != nil {
return nil, err
}
conn, chans, reqs, err := ssh.NewClientConn(c, addr, config)
if err != nil {
return nil, err
}

// calling conn.Close will close the underlying net.Conn

client := ssh.NewClient(c, chans, reqs)

关于go - 关闭加密 ssh session 以释放 golang 中所有资源的正确方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42590308/

45 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com