sps / server.js
agosh's picture
Update server.js
92d9cd6 verified
Raw
History Blame Contribute Delete
1.58 kB
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}`);
});