Shell gráfico nativo para SSH
(probablymarcus.com)- Em vez de expor apenas um terminal, servidores e dispositivos de borda podem oferecer um shell gráfico baseado em navegador, permitindo usar apps remotos de forma mais natural a partir de outros dispositivos
- Esse shell fornece uma tela inicial de apps e uma API de descoberta de URLs entre apps, criando um fluxo para encaminhar arquivos ou recursos ao app apropriado
- Os apps fornecem a UI por meio de pequenos servidores HTTP, mas funcionam como servidores privados voltados principalmente para SSH ou acesso local, e não como servidores web públicos em geral
- A criptografia não precisa ser implementada por cada app individualmente, podendo ficar a cargo da camada SSH, o que permite que cada servidor de app mantenha uma estrutura simples e com poucas dependências
- Para isso, Lewis transformou o Outer Loop em um navegador SSH e lançou o Outer Shell como open source, considerando tanto apps HTML quanto apps nativos em outerframe
Shell gráfico rodando sobre SSH
- O navegador web já é um exemplo bem estabelecido de fluxo em que um dispositivo, o servidor, fornece a experiência para outro dispositivo, o cliente
- Aplicando a mesma abordagem a servidores e dispositivos de borda, passa a ser possível usar apps gráficos em ambientes remotos em vez de apps baseados em terminal
- O shell fornece uma tela inicial para os apps, e cada app serve sua interface web por meio de um pequeno servidor HTTP
- A API do shell permite que os apps descubram as URLs uns dos outros, criando conexões entre apps
- Por exemplo, se um app se registrar como editor de texto, outro app poderá abrir um arquivo de texto nesse app de edição ao dar duplo clique
- Os apps podem ser web apps HTML já existentes ou apps nativos em outerframe
Como funciona a implementação e os projetos publicados
- Os servidores HTTP dos apps normalmente funcionam como servidores privados que não podem ser acessados por outros dispositivos da rede
- O usuário os utiliza via SSH ou localmente
- Ao contrário da maioria das ferramentas de servidor web existentes, eles usam principalmente arquivos Unix domain socket em vez de portas localhost
- Arquivos Unix domain socket são parecidos com portas, mas existem no sistema de arquivos e têm permissões de usuário explícitas
- Cada servidor HTTP não precisa lidar diretamente com criptografia
- A criptografia é tratada pela camada SSH
- Graças a isso, cada servidor de app pode ser extremamente simples e sem dependências
- O Outer Loop foi criado como um navegador SSH para esse shell gráfico
- O Outer Shell open source foi lançado
- A documentação relacionada é fornecida em três frentes
- Outer Loop: como o navegador funciona
- Outer Shell: API do Outer Shell e como adicionar apps
- Outerframe: como os apps nativos funcionam
- Em navegadores, recursos como conexão com Unix socket eram tratados como funcionalidades muito de nicho, mas ao se combinar com recursos como reconhecimento de SSH e sudo, surgem novas possibilidades técnicas
- Web apps do tipo servidor individual, como Jupyter e Tensorboard, surgiram, mas como cada um usa protocolos de segurança pontuais, nunca se consolidou uma forma comum de encaminhá-los “corretamente”
- Com a IA podendo ajudar na escrita de código, tornou-se prático que cada app tenha uma base de código para cada plataforma-alvo, e propõe-se como uma arquitetura web natural usar HTML para leitura e apps leves, e apps nativos adaptados à plataforma para apps de trabalho
1 comentários
Comentários do Hacker News
É bem frustrante ver tantas reações diminuindo essa ideia. Parece que muitos leitores do HN ainda estão presos à supremacia do TUI e não têm muito interesse em GUI
Há dois pontos centrais. TUI não é inerentemente superior a GUI, e o SSH, como camada de transporte, deveria suportar não só o encaminhamento de pty, isto é, a camada de apresentação de TUI, mas também a camada de apresentação de GUI
Na verdade, essas duas coisas já existiam no UNIX há 30 anos, e havia também o protocolo X e a solução
ssh -X. Mas o X não venceu, e o futuro em que você acessa uma máquina remota comssh -X, executagnome-control-centere uma janela de configurações aparece para você configurar o computador remoto nunca chegou. Se acha que chegou, é só testar: a experiência é terrívelMesmo assim, essa necessidade continuou existindo, e apps como o Jupyter Notebook começaram a ser desenvolvidos no formato de servidor web. O formato de documento da web, o styling e a linguagem de script do cliente acabaram se tornando, apesar de todos os defeitos, utilizáveis como camada de apresentação para apps interativos e, como partiram desde o início da ideia de documentos remotos, já trazem transparência de rede embutida
Quando se olha para apps Electron, faz sentido reconhecer que a stack HTML/CSS/JS passou a ocupar uma posição dominante também nos apps de desktop e usá-la como camada de apresentação para apps remotos via SSH. Este projeto parece seguir essa linha
Apps Electron também separam servidor de apresentação e cliente, como no X, chamando-os de “renderer process” e “main process”, e eles se comunicam via IPC. Em teoria, se houvesse um meio adequado de transporte para esse IPC, daria até para executar o main process e o renderer process em máquinas diferentes, e isso não parece muito diferente desta ideia
ssh -Xfunciona bem dependendo do toolkit usado e da distância/latência. Por exemplo, Gtk não é bom por causa do pipeline de renderizaçãoQuando a distância e a latência ficam grandes o bastante, é preciso pensar em como isso vai parecer para o usuário. Não dá para escapar dos limites físicos, independentemente do meio. Qualquer ferramenta que prometa acesso gráfico remoto precisa ser projetada com latência em mente. O motivo de o vim funcionar bem mesmo com latência é, na prática, porque ele envia os comandos enfileirados
waypipe. Então esse futuro não está mortognome-control-centerde uma máquina remota comssh -Xpara configurar um servidor não tenha chegado. Configurar servidor por GUI é um jeito abominável de fazer isso, e espero que continue restrito ao mundo WindowsIsso parece mais uma daquelas soluções em busca de um problema, algo que já apareceu muitas vezes no passado. A citação abaixo parece combinar bem com essa tentativa
“Quem não entende Unix está condenado a reinventá-lo de forma ruim.” ~Henry Spencer
Quase toda máquina voltada a desenvolvedores tem um servidor SSH instalado e acessível
Por que um terminal SSH tem que parecer um lixo só de texto dos anos 1960? Por que TUI deveria ser o melhor alvo possível para enviar coisas por SSH? Por que não dá para assistir a filmes em 4K no terminal ou navegar na web com pinch zoom?
A ideia de ver diretórios Linux por SSH com componentes nativos de UI parece boa
Embora parte disso também pareça um problema já resolvido por outros meios, como montagem com
sshfsIsso me lembra um texto antigo sobre termostatos programáveis. Eles eram poderosos o bastante para permitir configurações muito profundas, mas horríveis de usar para a maioria das pessoas. A ideia central era algo como: “as pessoas não querem aprender seu sistema obscuro; elas querem o benefício que ele promete”. Uma boa UI precisa saber reduzir essa distância
A ideia de separar frontend e backend de apps gráficos é boa. Mas é difícil dizer que isso é novidade; talvez eu esteja deixando passar alguma coisa
Parece desconhecimento de
X11Forwarding yesou dehtml5 web appCoisas como a capacidade de um navegador se conectar a sockets Unix vêm sendo rejeitadas por serem funcionalidades extremamente de nicho
Isso não foi implementado por questões de segurança. Pelo menos no caso de sockets Unix brutos; outras portas restritas a WebSocket ou HTTP são possíveis
Não dá para permitir que o navegador se conecte a qualquer socket. Muitos sockets explicitamente não querem conexões vindas do navegador, ou sequer levam em conta a possibilidade de um navegador conseguir se conectar a eles
Então seria preciso adicionar algum tipo de lista de permissões, e isso tornaria a coisa complexa demais para uma funcionalidade tão de nicho
Então, no fim, o ponto principal era mesmo o caráter de nicho
Como referência, o Outer Loop adiciona uma lista de permissões: https://outerloop.sh/unix-domain-sockets/
Estou tentando entender como o Outer Shell funciona aqui. No site, a motivação é apresentada assim
Apps como Jupyter ou TensorBoard, quando estão rodando em um servidor remoto, normalmente não ficam visíveis em um navegador web padrão. Isso porque deixar a internet inteira acessar esses apps é muito perigoso. Em vez disso, eles rodam em portas locais do servidor, e meu computador não consegue acessá-las diretamente
Tradicionalmente, para acessar isso, era preciso abrir um novo terminal e executar comandos como
ssh -L 24601:localhost:8889 mrcslws@lambda4.mycompany.com &,ssh -L 24602:localhost:6006 mrcslws@lambda4.mycompany.com &Isso procede? Normalmente esse tipo de encaminhamento SSH é usado só na prototipagem, e na hora de implantar você não cria um site como
myjupyternotebook.comcom autenticação para impedir o acesso de outras pessoas? Nem autenticação básica HTTP é um grande problemaSe a ideia é expor isso via SSH em vez de HTTP, também existem outras opções, como colocar atrás de uma VPN ou de um túnel
O Outer Loop é muito legal, mas não entendo bem por que ele é necessário. Parece que estou deixando passar alguma coisa, então gostaria de ajuda para entender por que isso foi criado
Eu estou mais próximo dos casos de uso de experimentos de deep learning, otimização de kernel de GPU e desenvolvimento de robótica. Um robô é só um servidor que se move, e nesses casos estamos explicitamente usando um computador remoto
Para as pessoas desse grupo, acho que essa ferramenta parece mais intuitiva do que o fluxo proposto. Mas talvez eu esteja só projetando minha própria visão
Para mim, isso parece uma daquelas coisas fundamentais que podem existir. Dá uma sensação de sistema operacional gráfico com prioridade ao remoto
ssh -D 4711 -q -C -N user@hostIsso faz com que
localhost:4711vire um proxy SOCKS5 que pode ser configurado no navegadorClaro, uma VPN com WireGuard é melhor. Acima de tudo, o SSH multiplexa sobre uma única conexão TCP, então, se um pacote se perde, todo o tráfego encaminhado sofre bloqueio de cabeça de fila até a retransmissão
Parece que o autor nunca ouviu falar do Cockpit
Tudo o que ele diz que “não existe” ou é “novo” já está no Cockpit há mais de 10 anos. Isso inclui conexões de servidor web baseadas em socket, a separação entre backend e frontend de apps de servidor, e até a ideia de um console de servidor com acesso a shell
Para a pergunta “não é estranho isso ainda não existir?”, eu responderia que não. Já existe há muito tempo
Com sinceridade,
a polícia das diretrizes do HN :-)
https://news.ycombinator.com/newsguidelines.html
Texto excelente. Vou deixar salvo nos favoritos para a minha pesquisa
A funcionalidade “clickity clackity” do meu terminal [0] está presa à máquina local, então, no momento em que vou para o remoto, a parte gráfica desaparece
Isso está mudando aos poucos graças ao replay offline [1]. GUIs nativas e TUIs funcionando juntas de uma forma que abre espaço para recursos como rebobinar. Mas ainda há um bom caminho pela frente, e é bom ver outras pessoas experimentando isso de verdade. Terminais são uma área amplamente negligenciada
[0] https://terminal.click
[1] https://terminal.click/posts/2026/06/tui-stability/#:~:text=...
As pessoas acostumadas com terminal esquecem o quanto o SSH é hostil para quem não aprendeu isso na universidade
Se isso puder reduzir a barreira de entrada para uma equipe pequena que administra VPS sem contratar alguém de plataforma, já é um sucesso. Mas fico curioso sobre como eles lidam com chaves e hosts de salto
Impressionante. Definitivamente está indo na direção certa
A camada de separação entre a frente e o fundo precisa ser cortada no menor “pedaço” possível
Muita gente sarcástica aqui entenderia se “sentisse” por conta própria a latência e a sobrecarga extra. Não houve reflexão suficiente sobre como recortar os dados com cuidado para cada caso de uso
Indo além, no demo, o app
top, que foi usado para “mexer nas configurações com frequência e gerar carga”, na minha opinião deveria ter feito mais renderização JIT do lado do cliente. Assim, a informação trocada entre o Pi e o cliente teria sido reduzida a algo como um delta compactado da saída depsIsso não deveria ser feito. Há muitos bons motivos históricos de segurança para não dar permissões gerais de socket ao navegador, além de motivos de isolamento do plano de controle da web
A analogia mecanicamente mais próxima é por que um ATV de 3 rodas é uma má ideia
Os sockets deveriam ser bloqueados por padrão e só poder ser abertos depois de serem explicitamente incluídos em uma lista de permissões no lado do servidor
Deveria haver uma noção real de sudo, de modo que não fosse possível alcançar sockets de root sem a senha do sudo. Isso é importante porque, caso contrário, cria-se um incentivo para as pessoas executarem backends como root em sockets acessíveis ao usuário
Mais detalhes aqui: https://outerloop.sh/security/