我试图了解SSH连接中的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'
});
答案 0 :(得分:2)
xserversock
是与您的计算机上本地运行的X服务器的连接。 xclientsock
是表示传入的X客户端请求(例如示例中的xeyes)到本地X服务器的流。
xclientsock.pipe(xserversock).pipe(xclientsock);
不是xclientsock
管道本身,它只是允许数据在本地X服务器和远程X客户端之间双向流动。 pipe()
始终返回传递给它的流,以便轻松链接流。所以这一行代码相当于:
xclientsock.pipe(xserversock);
xserversock.pipe(xclientsock);
最后,请记住xserversock
是一个连接到本地 X服务器的套接字。传递给套接字的.connect()
参数很明显,因此它将连接到127.0.0.1:6000。