Estou tentando configurar um servidor web mínimo usando o netcat (nc). Quando o navegador chama localhost: 1500, por exemplo, ele deve mostrar o resultado de uma função ( data no exemplo abaixo, mas eventualmente será um programa em python ou c que gera alguns dados). Meu pequeno servidor web netcat precisa ser um loop while true no bash, possivelmente tão simples quanto isto:
while true ; do echo -e "HTTP/1.1 200 OK\n\n $(date)" | nc -l -p 1500 ; done
Quando eu tento isso, o navegador mostra os dados atualmente disponíveis durante o momento em que o nc é iniciado. Quero que o navegador exiba os dados durante o momento em que o navegador solicita. Como posso conseguir isso?
Respostas:
Tente o seguinte:
O
-c
faz com que o netcat execute o comando fornecido em um shell, para que você possa usar o eco. Se você não precisar de eco, use-e
. Para mais informações sobre isso, tenteman nc
. Observe que, ao usar,echo
não há como o seu programa (adate
substituição) obter a solicitação do navegador. Então você provavelmente finalmente quer fazer algo assim:Onde
yourprogram
deve fazer o protocolo, como manipular GET, enviar HTTP 200 etc.fonte
while true; do echo -e "HTTP/1.1 200 OK\n\n $(date)" | nc -l localhost 1500; done
It is an error to use this option in conjunction with the -l option
-p
opção juntamente com a opção-l
seja um erro, o site oficial do netcat usa as duas opções em seus exemplos. Veja: nc110.sourceforge.netnc
: Hobbit (o original), BSD / Mac OS X e GNU (o mais antigo do grupo, e não é mais mantido). Há também o Ncat do Nmap . Eu trago este acima porque eu acho que é importante notar que os-l
e-p
bandeiras juntos só são consideradas um erro no sabor BSD de nc, daí a sintaxe alternativa dada pela @matlehmannNão sei como ou por que, mas eu consigo encontrar isso por aí e funciona para mim, eu tive o problema que eu queria retornar o resultado da execução de uma festança
NOTA: Este comando foi obtido em: http://www.razvantudorica.com/08/web-server-in-one-line-of-bash
isso executa o teste do script bash e retorna o resultado para um cliente do navegador que se conecta ao servidor executando este comando na porta 8080
Meu script faz este caixa eletrônico
e meu navegador está aparecendo
simplesmente incrível!
fonte
-k
bandeira, não adicionandoConnection: keep-alive
ao cabeçalho da solicitação.Adicione
-q 1
ànetcat
linha de comando:fonte
-q
1 não está funcionando emCentOS
6.x o que deve ser usado paraCentOS
6.x onde ele dizendo:nc: invalid option -- 'q'
.while true; do tail -f /usr/local/freeswitch/log/freeswitch.log | nc -l 9999; done &
/usr/local/freeswitch/log/freeswitch.log
?-q 1
funcionou para mim no Ubuntu 18.04. Espero que ajude.O problema que você está enfrentando é que a nc não sabe quando o cliente da Web termina sua solicitação para poder responder à solicitação.
Uma sessão da web deve ser algo como isto.
Linhas que começam com "\ n" são simplesmente linhas vazias, sem espaço, e não contêm nada além de um novo caractere de linha.
Eu tenho meu httpd do bash lançado pelo xinetd, xinetd tutorial . Ele também registra data, hora, endereço IP do navegador e toda a solicitação do navegador em um arquivo de log e calcula o Comprimento do Conteúdo para a resposta do cabeçalho do Servidor.
Para adicionar mais funcionalidades, você pode incorporar.
Feliz batendo!
fonte
Eu tinha a mesma necessidade / problema, mas nada aqui funcionou para mim (ou eu não entendi tudo), então essa é a minha solução.
Publico meu minimal_http_server.sh (trabalhando com meu / bin / bash (4.3.11), mas não com / bin / sh por causa do redirecionamento):
E meu a_script.sh (com sua necessidade):
fonte
read
etr
) e um menor ([
após elif). Eu não reproduzo seu problema. Não vejo por que o minimal_http_server.sh causaria esses intervalos de 1 segundo. Você pode determinar se é o minimal_http_server.sh ou seu "a_script.sh" que está com defeito executando várias vezes (na mesma taxa que suas solicitações de curl) ./a_script.sh após definir a variável de ambiente REQUEST.Outra maneira de fazer isso
Vamos testá-lo com 2 solicitações HTTP usando curl
Neste exemplo, 172.16.2.6 é o endereço IP do servidor.
Lado do servidor
Lado do Cliente
Se você deseja executar outro comando, substitua $ (data).
fonte
fonte
read line<pipe
vai esperar aténc
vai escreverpipe
? Mas neste momento, acho que a solicitação é feita antes que a resposta seja escrita ..?Aqui está a beleza de um pequeno servidor web de bash , eu o encontrei on-line e peguei uma cópia e aprimorei-a um pouco - ela usa
socat
ounetcat
eu a testeisocat
- é independente em um script e gera seu próprio arquivo de configuração e favicon.Por padrão, ele será iniciado como um navegador de arquivos habilitado para a Web, mas é facilmente configurado pelo arquivo de configuração para qualquer lógica. Para arquivos, ele transmite imagens e músicas (mp3), vídeo (mp4, avi etc.) - testei a transmissão de vários tipos de arquivos para dispositivos Linux, Windows e Android, incluindo um smartwatch!
Eu acho que transmite melhor do que o VLC, na verdade. Achei útil transferir arquivos para clientes remotos que não têm acesso além de um navegador da web, por exemplo, Android smartwatch sem precisar se preocupar em se conectar fisicamente a uma porta USB.
Se você quiser experimentá-lo, basta copiá-lo e colá-lo em um arquivo chamado bashttpd, em seguida, inicie-o no host com
$> bashttpd -s
Em seguida, você pode acessar qualquer outro computador (presumindo que o firewall não esteja bloqueando as conexões TCP de entrada com a porta 8080 - a porta padrão, você pode alterar a porta para o que desejar, usando as variáveis globais na parte superior do script).
http://bashttpd_server_ip:8080
fonte
main
função em que diz[ "${REQUEST_METHOD}" = "GET" ] || fail_with 405
: github.com/AdamDanischewski/bashttpd/blob/master/bashttpdLOL, um hack super manco, mas pelo menos curl e firefox aceitam:
É melhor substituí-lo em breve por algo adequado!
Ah, sim, os meus
nc
não eram exatamente iguais aos seus, não gostou da-p
opção.fonte
Se você estiver usando o Apline Linux, o BusyBox netcat é um pouco diferente:
fonte
Digite nc -h e veja se você tem a opção -e disponível. Se sim, você pode criar um script, por exemplo:
script.sh
e execute assim:
Observe que a opção -e precisa estar ativada na compilação para estar disponível.
fonte
Acho que o problema de que toda a solução listada não funciona é intrínseco à natureza do serviço http, todas as solicitações estabelecidas são com um cliente diferente e a resposta precisa ser processada em um contexto diferente. instância de resposta ...
A solução atual Eu acho que é o
-e
denetcat
, mas eu não sei por que não trabalho ... talvez é a minhanc
versão que eu testar emopenwrt
...com
socat
isso funciona ....Eu tento isso https://github.com/avleen/bashttpd
e funciona, mas devo executar o script de shell com este comando.
O
socat
enetcat
samples no github não funcionam para mim, mas osocat
que eu usei funciona.fonte
reuseaddr
bandeira você fez o meu dia! OBRIGADONa verdade, a melhor maneira de fechar normalmente a conexão é enviar o
Content-Length
cabeçalho da seguinte maneira. Cliente (comocurl
fechará a conexão depois de receber os dados.fonte