2016-12-31 14 views
0

SSH接続内のx11ポート転送がプログラムでどのように機能するかを理解しようとしています。x11転送のためのssh2ライブラリのxserversockとxclientsockの意味

特に、私はNode's SSH2 client libraryのコードレシピの一部であるREADMEのこの部分を理解しようとしています。クライアントがインスタンス化されると、変数xserversockxclientsockは何をしますか?なぜ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サーバへの着信Xクライアント要求(例ではxeyes)を表すストリームです。

  2. xclientsock.pipe(xserversock).pipe(xclientsock);は、自分自身への配管ではなく、ローカルXサーバとリモートXクライアント間で双方向にデータを流すだけです。 pipe()は、渡されたストリームを常に返して、ストリームの連鎖を容易にします。だから、このコードの1行に相当します:

    xclientsock.pipe(xserversock); 
    xserversock.pipe(xclientsock); 
    
  3. 最後に、xserversockを覚えて、あなたのローカル Xサーバに接続されたソケットです。これは、.connect()引数がソケットに渡されていることから明らかです。したがって、127.0.0.1:6000に接続します。

関連する問題