gpt4 book ai didi

go - 如何进行简单的 SSH x11 转发

转载 作者:数据小太阳 更新时间:2023-10-29 03:36:12 40 4
gpt4 key购买 nike

我正在尝试在 Go 中实现 ssh x11 转发,引用了 Paramiko 的源代码,但效果不佳。

x11-req 请求似乎是成功的,但由于 OpenChannel 而失败。有没有更好的办法?

https://www.rfc-editor.org/rfc/rfc4254#section-6.3.2

完整代码在这里。

https://gist.github.com/blacknon/6e2e6e2c0ebcd64c381925f0e3e86e42

package main

(omit)

func main() {
// Create sshClientConfig
sshConfig := &ssh.ClientConfig{
User: user,
Auth: []ssh.AuthMethod{
ssh.Password(pass),
},
HostKeyCallback: ssh.InsecureIgnoreHostKey(),
}

// SSH connect.
client, err := ssh.Dial("tcp", host+":"+port, sshConfig)

// Create Session
session, err := client.NewSession()
defer session.Close()

// NOTE:
// x11-req Payload
payload := x11request{
SingleConnection: false,
AuthProtocol: string("MIT-MAGIC-COOKIE-1"),
AuthCookie: string("d92c30482cc3d2de61888961deb74c08"),
ScreenNumber: uint32(0),
}

// NOTE:
// send x11-req Request
ok, err := session.SendRequest("x11-req", true, ssh.Marshal(payload))
if err == nil && !ok {
fmt.Println(errors.New("ssh: x11-req failed"))
}
fmt.Printf("x11-req: %v\n", ok)
fmt.Println("-----")

// x11 OpenChannel (Not working...)
x11Data := x11channel{
Host: "localhost",
Port: uint32(6000),
}

sshChan, req, x11err := client.OpenChannel("x11", ssh.Marshal(x11Data))
fmt.Println(sshChan) // DEBUG
fmt.Println(req) // DEBUG
fmt.Println(x11err) // DEBUG

(omit)
}

我添加了 sshd 端调试日志。

sshd[1811]: debug1: server_input_channel_req: channel 0 request x11-req reply 1
sshd[1811]: debug1: session_by_channel: session 0 channel 0
sshd[1811]: debug1: session_input_channel_req: session 0 req x11-req
sshd[1811]: debug1: channel 1: new [X11 inet listener]
sshd[1811]: debug1: channel 2: new [X11 inet listener]
sshd[1811]: debug1: server_input_channel_open: ctype x11 rchan 1 win 2097152 max 32768
sshd[1811]: debug1: server_input_channel_open: failure x11

谢谢大家!多亏了它,我才能安全地实现它。有工作代码。

https://gist.github.com/blacknon/9eca2e2b5462f71474e1101179847d2a

最佳答案

// x11 OpenChannel (Not working...)
x11Data := x11channel{
Host: "localhost",
Port: uint32(6000),
}

sshChan, req, x11err := client.OpenChannel("x11", ssh.Marshal(x11Data))

这里的根本问题是 X11 转发 channel 是从 SSH 服务器到 SSH 客户端发起的。您正在尝试打开从客户端到服务器的 X11 channel 。您的服务器不支持此操作,并且这不是使用 X 转发的常用方法。

我不是围棋程序员。但是看了之后the documentation , 在你发送你的 x11-req 之后你会调用 client.HandleChannelOpen()接收来自服务器的 X11 channel 请求。

更多背景:为了清楚起见,从术语开始。您的程序是一个 ssh 客户端,它连接到一个 ssh 服务器。对于 X,服务器 是控制显示器、键盘和鼠标的程序。 X 客户端 是像 xterm 和 xeyes 这样的程序,它们连接到服务器以显示窗口并做类似的事情。

当你想通过SSH转发X11时,ssh客户端会向ssh服务器发送一个X11请求。这告诉服务器客户端想要 X11 转发连接。服务器将执行一些设置并打开 TCP 监听端口以接收来自 X 客户端的连接。

当 X 客户端连接到 ssh 服务器的 X11 监听端口时,ssh 服务器将打开一个返回 ssh 客户端的 channel 。 ssh 客户端将连接到本地 X 服务器,ssh 客户端和 ssh 服务器将在 X 服务器(本地到 ssh 客户端主机)和 X 客户端(本地到 ssh 服务器主机)之间中继数据。每个 channel 处理一个 X 客户端。

因此像您这样的程序必须向服务器发送请求,表明您的程序希望通过 ssh 连接转发 X11。当 X 客户端尝试使用转发的 X11 服务时,实际的 x11 channel 将按需从 ssh 服务器打开到 ssh 客户端。

关于go - 如何进行简单的 SSH x11 转发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56953203/

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