Пытаюсь реализовать форвардинг ssh x11 в Go, ссылаясь на источник Paramiko, но не получается.
Запрос x11-req кажется успешным, но не работает с OpenChannel. Нет ли лучшего способа?
https://tools.ietf.org/html/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