go 有办法调用基础库 golang.org/x/crypto 的私有结构和方法吗?

2023-10-25 07:47:58 +08:00
 LonnyWong

开源项目 https://github.com/trzsz/trzsz-ssh 想支持 ssh ControlMaster 的功能。

go 基础库 golang.org/x/crypto 有个 PR https://go-review.googlesource.com/c/crypto/+/383374 还没合入。

有办法在不 fork 基础库 golang.org/x/crypto 的情况下,优雅地在自己的项目实现这个 PR 的逻辑吗?

import "golang.org/x/crypto/ssh"

func NewControlClientConn(c net.Conn) (ssh.Conn, <-chan ssh.NewChannel, <-chan *ssh.Request, error) {
  conn := &ssh.connection{     ■ undefined: ssh.connection
    sshConn: ssh.sshConn{conn: c},     ■ undefined: ssh.sshConn
  }
  var err error
  if conn.transport, err = handshakeControlProxy(c); err != nil {
    return nil, nil, nil, fmt.Errorf("ssh: control proxy handshake failed; %v", err)
  }
  conn.mux = ssh.newMux(conn.transport)     ■ undefined: ssh.newMux
  return conn, conn.mux.incomingChannels, conn.mux.incomingRequests, nil
}

handshakeControlProxy 这个函数很好办,直接从 PR 中复制出来就行了。

问题:上面的 ssh.connectionssh.sshConnssh.newMux 依赖很深,发现很难直接 copy 出来。

2208 次点击
所在节点    Go 编程语言
25 条回复
kkbblzq
2023-10-25 17:20:17 +08:00
@kkbblzq mux ,骚一点就是。。
//go:linkname newMux golang.org/x/crypto/ssh.newMux
func newMux(p packetConn) *mux

type mux struct {
conn packetConn
_ [40]byte

incomingChannels chan ssh.NewChannel
globalSentMu sync.Mutex
globalResponses chan interface{}
incomingRequests chan *ssh.Request

errCond *sync.Cond
err error
}
kkbblzq
2023-10-25 17:26:59 +08:00
@kkbblzq 接口可以
//go:linkname SendRequest golang.org/x/crypto/ssh.(*mux).SendRequest
func SendRequest(mux *mux, name string, wantReply bool, payload []byte) (bool, []byte, error)

func (c *connection) SendRequest(name string, wantReply bool, payload []byte) (bool, []byte, error) {
return SendRequest(c.mux, name, wantReply, payload)
}

不过整体也不是很优雅就是了,兼容性很差
matrix1010
2023-10-25 17:27:52 +08:00
我觉得最优雅的办法就是 fork 。fork 完 release 个新版本,等 ssh 真的支持你想要的,再发布个新版本换回原来的
learningman
2023-10-26 00:03:29 +08:00
@LonnyWong 但是这样 go 版本更新的时候你可以显式的 review 改了什么,用 linkname 炸的无声无息,stacktrace 都没有那种
LonnyWong
2023-10-29 16:27:01 +08:00

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/985115

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX