Servidor de terminal remoto via WebSocket escrito em Go, usando PTY (pseudo-terminal) para rodar um shell real de forma interativa no navegador.
Atenção (segurança): este projeto expõe um shell remoto. Use somente em ambientes controlados. Troque a senha e o segredo do servidor antes de rodar em produção.
- Backend em Go com:
- Endpoint
POST /authpara gerar um token e uma assinatura HMAC - Endpoint
GET /que faz upgrade para WebSocket e liga o socket a um PTY
- Endpoint
- Frontend simples (xterm.js) em
view/index.html.
- O cliente envia a senha para
POST /auth. - O servidor retorna
{ token, signature }. - O cliente abre
wss://.../?token=...&signature=.... - O servidor valida HMAC e, se OK, inicia um shell (via PTY) e faz o “pipe” entre PTY ⇄ WebSocket.
- Go (para rodar localmente)
- Ou Docker / Docker Compose (recomendado)
No arquivo main.go, altere:
const serverSecret = "CHAVE-MUITO-SECRETA-ALTERAR-AQUI"const password = "123"
Recomendação: use valores longos, aleatórios e não versionados (env vars / secrets).
go mod download
go run . -port=9090Depois conecte com um cliente WebSocket (ou use o view/index.html apontando para seu host).
Build:
docker build -t wterm .Run:
docker run --rm -p 9090:9090 \
-e SHELL=/bin/bash \
-e HOME=/root \
wtermO repositório inclui um docker-compose.yml. Para subir:
docker compose up -dPor padrão, ele:
- expõe
9090:9090 - monta
./workspaceem/root(diretório HOME dentro do container) - monta
/var/run/docker.sock(use com cuidado)
POST /auth(form urlencoded)- body:
password=<sua_senha> - response: JSON com
tokenesignature
- body:
GET /(WebSocket)- query:
tokenesignature
- query:
O arquivo view/index.html usa xterm.js via CDN e implementa um fluxo simples de login:
- pede a senha
- chama
/auth - abre o WebSocket com o token assinado
Se você for rodar localmente, ajuste as URLs hardcoded no
view/index.htmlpara apontar para o seu servidor.
Sem licença definida no momento. Se quiser, posso adicionar uma licença (ex.: MIT) e atualizar o README para refletir.