2016-12-31 2 views
0

Я пытаюсь понять, как переадресация портов x11 внутри соединений SSH работает программно.Значение xserversock и xclientsock в библиотеке ssh2 для пересылки x11

В частности, я пытаюсь понять эту часть README, которая является частью рецептов кода внутри Node's SSH2 client library. Как только экземпляр клиента создается, что делают переменные xserversock и xclientsock? Почему xclientsock данные о трубах возвращаются к себе через xserversock? Наконец, действительно xserversock действительно подключиться к 127.0.0.1:6000, или до 10.13.23.10:6000?

var net = require('net'); 

var Client = require('ssh2').Client; 

var conn = new Client(); 

conn.on('x11', function(info, accept, reject) { 
    var xserversock = new net.Socket(); 
    xserversock.on('connect', function() { 
    var xclientsock = accept(); 
    xclientsock.pipe(xserversock).pipe(xclientsock); 
    }); 
    // connects to localhost:0.0 
    xserversock.connect(6000, 'localhost'); 
}); 

conn.on('ready', function() { 
    conn.exec('xeyes', { x11: true }, function(err, stream) { 
    if (err) throw err; 
    var code = 0; 
    stream.on('end', function() { 
     if (code !== 0) 
     console.log('Do you have X11 forwarding enabled on your SSH server?'); 
     conn.end(); 
    }).on('exit', function(exitcode) { 
     code = exitcode; 
    }); 
    }); 
}).connect({ 
    host: '10.13.23.10', 
    username: 'foo', 
    password: 'bar' 
}); 

ответ

1
  1. xserversock является соединение с сервером X работает локально на вашем компьютере. xclientsock - это поток, представляющий входящий запрос X-клиента (например, xeyes в примере) на ваш локальный X-сервер.

  2. xclientsock.pipe(xserversock).pipe(xclientsock); не является xclientsock трубопроводом для себя, он просто позволяет передавать данные в обоих направлениях между локальным сервером X и удаленным X-клиентом. pipe() всегда возвращает переданный ему поток, чтобы обеспечить легкую цепочку потоков. Так что это одна строка кода эквивалентна:

    xclientsock.pipe(xserversock); 
    xserversock.pipe(xclientsock); 
    
  3. Наконец, помните xserversock это сокет, который подключается к вашему локальному серверу X. Это видно с аргументами .connect(), переданными в сокет, поэтому он будет подключаться к 127.0.0.1:6000.

Смежные вопросы