Как сделать простую пересылку SSH x11 - PullRequest
0 голосов
/ 09 июля 2019

Я пытаюсь реализовать пересылку 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

1 Ответ

0 голосов
/ 09 июля 2019
// x11 OpenChannel (Not working...)
x11Data := x11channel{
    Host: "localhost",
    Port: uint32(6000),
}

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

Основная проблема здесь заключается в том, что каналы пересылки X11 инициируются от сервера SSH к клиенту SSH. Вы пытаетесь открыть канал X11 от клиента к серверу. Это не поддерживается вашим сервером, и это не обычный способ переадресации X.

Я не программист. Но после просмотра документации после отправки вашего x11-req похоже, что вы бы позвонили client.HandleChannelOpen () для получения запросов X11-каналов, поступающих с сервера.

Дополнительные сведения: Для ясности начните с терминологии. Ваша программа - ssh-клиент , и она подключается к ssh-серверу . С X * server - это программа, которая управляет дисплеем, клавиатурой и мышью. X клиенты - это программы, такие как xterm и xeyes, которые подключаются к серверу для отображения окон и выполняют аналогичные действия.

Если вы хотите переслать X11 через SSH, клиент ssh отправит запрос X11 серверу ssh. Это говорит серверу, что клиент хочет пересылку X11 для соединения. Сервер выполнит некоторую настройку и откроет порт прослушивания TCP для приема соединений от клиентов X.

Когда клиент X подключается к порту прослушивания X11 сервера ssh, сервер ssh откроет канал обратно клиенту ssh. Ssh-клиент будет подключаться к локальному X-серверу, а ssh-клиент и ssh-сервер будут передавать данные между X-сервером (локальным для хоста ssh-клиента) и X-клиентом (локальным для хоста ssh-сервера). Каждый канал обрабатывает один X-клиент.

Таким образом, такая программа, как ваша, должна отправить запрос на сервер, сигнализирующий, что ваша программа хочет переслать X11 через соединение ssh. Фактические каналы x11 будут открыты по запросу с сервера ssh на клиент ssh, когда клиент X попытается использовать переадресованную службу X11.

...