File size: 1,579 Bytes
3362e49 92d9cd6 59e02b0 3362e49 61af184 3362e49 | 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 | const http = require('http');
const WebSocket = require('ws');
const pty = require('node-pty');
const url = require('url');
const port = 8000;
const requiredPassword = process.env.TERMINAL_PASSWORD;
const server = http.createServer();
const wss = new WebSocket.Server({ server });
wss.on('connection', (ws, req) => {
const query = url.parse(req.url, true).query;
const password = query.password;
if (password !== requiredPassword) {
ws.send('Erro: Senha incorreta');
ws.close();
return;
}
const shell = '/bin/fish';
const cwd = process.env.HOME || '/tmp';
const ptyProcess = pty.spawn(shell, [], {
name: 'xterm-256color',
cols: 80,
rows: 24,
cwd: cwd,
env: {
...process.env,
TERM: 'xterm-256color',
COLORTERM: 'truecolor',
HOME: process.env.HOME || '/home/node'
}
});
console.log(`Terminal iniciado (PID: ${ptyProcess.pid})`);
ptyProcess.on('data', (data) => {
if (ws.readyState === WebSocket.OPEN) {
ws.send(data);
}
});
ws.on('message', (msg) => {
ptyProcess.write(msg.toString());
});
ws.on('resize', (size) => {
try {
ptyProcess.resize(size.cols || 80, size.rows || 24);
} catch (e) {
console.error('Erro ao redimensionar:', e);
}
});
ws.on('close', () => {
console.log('Conexão encerrada');
ptyProcess.kill();
});
ws.on('error', (err) => {
console.error('Erro na conexão WebSocket:', err);
ptyProcess.kill();
});
});
server.listen(port, () => {
console.log(`Servidor rodando na porta ${port}`);
}); |