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