File size: 2,616 Bytes
f5f8a63 f1aa5a4 f5f8a63 f1aa5a4 f5f8a63 f1aa5a4 f5f8a63 f1aa5a4 f5f8a63 f1aa5a4 f5f8a63 c32ab8c f5f8a63 f1aa5a4 c32ab8c f5f8a63 f1aa5a4 f5f8a63 c32ab8c f5f8a63 f1aa5a4 c32ab8c f5f8a63 f1aa5a4 f5f8a63 f1aa5a4 f5f8a63 f1aa5a4 f5f8a63 c32ab8c f1aa5a4 f5f8a63 c32ab8c f1aa5a4 f5f8a63 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 |
const fs = require('fs');
const path = require('path');
const http = require('http');
const SSHClient = require('ssh2').Client;
const socketIO = require('socket.io');
// Create HTTP server
const server = http.createServer(onRequest);
// Attach Socket.IO to the server
const io = socketIO(server);
// Load static files into memory
let staticFiles = {};
let basePath = path.join(require.resolve('xterm'), '..');
staticFiles['/xterm.css'] = fs.readFileSync(path.join(basePath, '../css/xterm.css'));
staticFiles['/xterm.js'] = fs.readFileSync(path.join(basePath, 'xterm.js'));
basePath = path.join(require.resolve('xterm-addon-fit'), '..');
staticFiles['/xterm-addon-fit.js'] = fs.readFileSync(path.join(basePath, 'xterm-addon-fit.js'));
staticFiles['/'] = fs.readFileSync('index.html');
// Handle static file serving
function onRequest(req, res) {
let file;
if (req.method === 'GET' && (file = staticFiles[req.url])) {
res.writeHead(200, {
'Content-Type': 'text/' + (/css$/.test(req.url) ? 'css' : (/js$/.test(req.url) ? 'javascript' : 'html'))
});
return res.end(file);
}
res.writeHead(404);
res.end();
}
// Setup WebSocket connection
io.on('connection', (socket) => {
const conn = new SSHClient();
// Debug logging
conn.on('debug', (msg) => {
console.log('DEBUG:', msg);
});
// On SSH connection ready
conn.on('ready', () => {
socket.emit('data', '\r\n*** SSH CONNECTION ESTABLISHED ***\r\n');
// Start shell session
conn.shell((err, stream) => {
if (err) {
return socket.emit('data', '\r\n*** SSH SHELL ERROR: ' + err.message + ' ***\r\n');
}
// When data is received from the client, write to the stream
socket.on('data', (data) => {
stream.write(data);
});
// Send data back to the client when received from the SSH session
stream.on('data', (d) => {
socket.emit('data', d.toString('binary'));
}).on('close', () => {
conn.end();
});
});
})
.on('close', () => {
socket.emit('data', '\r\n*** SSH CONNECTION CLOSED ***\r\n');
})
.on('error', (err) => {
console.error('SSH Connection Error:', err);
socket.emit('data', '\r\n*** SSH CONNECTION ERROR: ' + err.message + ' ***\r\n');
})
.connect({
host: process.env.REMOTE_HOST,
port: 22,
username: process.env.REMOTE_USERNAME,
password: process.env.REMOTE_PASSWORD,
readyTimeout: 60000,
debug: (msg) => console.log('DEBUG:', msg) // Enable debug logging
});
});
// Start the server
const port = 8000;
console.log('Listening on port', port);
server.listen(port);
|