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}`); });