Servidor HTTP de linha de comando simples

121

Eu tenho um script que gera um relatório diário que quero servir ao chamado público em geral. O problema é que não quero adicionar à minha dor de cabeça a manutenção de um servidor HTTP (por exemplo, Apache) com todas as configurações e implicações de segurança.

Existe uma solução simples para servir uma pequena página HTML sem o esforço de configurar um servidor HTTP completo?

Cid
fonte
4
Consulte a resposta stackoverflow.com/a/4994745 na pergunta Servidor de uma linha ftp em python no Stack Overflow .
manatwork
2
Por que não usar apenas netcat?
Dylan
De fato! Use o FTP, como a World Wide Web fez antes da conclusão do HTTP! (Embora eu suponho que não era tão world-wide no início de 1990 😉.)
Michael Scheper
1
Uma grande coleção de métodos foram compilados neste essência
davidcondrey

Respostas:

32

Sim, nweb.

Pode ser encontrado aqui: nweb.c

(anteriormente em ibm.com )

Para compilar o nweb.c:

gcc -O -DLINUX nweb.c -o nweb
Alexander
fonte
160

Experimente o SimpleHTTPServer :

python -m SimpleHTTPServer
# or the Python 3 equivalent
python3 -m http.server

Ele deve servir o que estiver no CWD (por exemplo, index.html) em http://0.0.0.0:8000 .

Olivier Lalonde
fonte
11
Opcionalmente, você pode especificar um número de porta como esta: python3 -m http.server 1337. Você não pode especificar a qual IP vincular, tanto quanto eu posso dizer. Nota: Para ouvir a porta 80, você deve ter privilégios de root, por exemplo:sudo python3 -m http.server 80
Hubro
1
Este é bom, mas tem um problema ao redirecionar para um URL com uma barra final adicionada. É por isso que prefiro a versão twistd:twistd -n web -p 8000 --path .
Greg Dubicki 14/07/2015
--bind <address>foi adicionado no python 3.4 .
drewbenn
1
Para alterar a porta de escuta padrão 8080 (com python2) para outra coisa, basta colocar um número de porta após:python -m SimpleHTTPServer 3000
Maksim Luzik
44

Há uma grande lista de one-liners de servidor estático http :

Para entrar nessa lista, uma solução deve:

  1. servir arquivos estáticos usando seu diretório atual (ou um diretório especificado) como raiz do servidor
  2. poder ser executado com um único comando de uma linha (as dependências são boas se forem únicas)
  3. serve tipos básicos de arquivo (html, css, js, imagens) com tipos mime adequados, não requer configuração (de arquivos ou outros) além do próprio comando (sem servidores específicos da estrutura, etc.)
  4. deve ser executado ou ter um modo em que possa ser executado em primeiro plano (ou seja, sem daemons)

Por exemplo:

  • Torcido (Python)

    twistd -n web -p 8000 --path . 
    
  • Erlang :

    erl -s inets -eval 'inets:start(httpd,[{server_name,"NAME"},{document_root, "."},{server_root, "."},{port, 8000},{mime_types,[{"html","text/html"},{"htm","text/html"},{"js","text/javascript"},{"css","text/css"},{"gif","image/gif"},{"jpg","image/jpeg"},{"jpeg","image/jpeg"},{"png","image/png"}]}]).'
    
  • Plack (Perl)

    cpan Plack
    plackup -MPlack::App::Directory -e 'Plack::App::Directory->new(root=>".");' -p 8000
    
  • webfs

    webfsd -F -p 8000
    
  • Ruby 1.9.2+

    ruby -run -ehttpd . -p8000
    
Evgeny Vereshchagin
fonte
43

Use node.js, rápido e leve.

Ou

basta usar o nccomando netcat simples para iniciar um servidor da web rápido em uma porta e servir o conteúdo de um arquivo, incluindo os cabeçalhos de resposta do servidor.

Referência da Wikipedia:

http://en.wikipedia.org/wiki/Netcat#Setting_up_a_one-shot_webserver_on_port_8080_to_present_the_content_of_a_file

{ echo -ne "HTTP/1.0 200 OK\r\n\r\n"; cat some.file; } | nc -l -p 8080
{ echo -ne "HTTP/1.0 200 OK\r\nContent-Length: $(wc -c <some.file)\r\n\r\n"; cat some.file; } | nc -l -p 8080
Nikhil Mulley
fonte
27
Um processo bare.js simples, com apenas o shell interativo em execução, requer 15 MB (7,5 compartilhados) de RAM. E então você deve executar o servidor HTTP dentro dele. É engraçado que as pessoas o vejam leve. ;-)
jpc
Sim, eu considero leve, você pode escalar bem com menos espaço de memória. Por favor, leia thecodinghumanist.com/blog/archives/2011/5/6/… No entanto, se você achar complicado usar o node.js, o utilitário netcat simples atenderá bem a essa finalidade.
precisa saber é o seguinte
1
Você está certo se comparar o nó com o Apache, mas o que achei divertido foi a aparência do nó quando comparado ao cr.yp.to/publicfile.html ou algo semelhante. :)
JPC
hmmmmm .. ok ;-)
Nikhil Mulley
8
+1 para a ncsolução baseada :). Observe que os -nesinalizadores para echopodem não ser portáveis, usando o printfcomando pode ser uma alternativa melhor.
precisa saber é o seguinte
29

Desde a versão 5.4.0, o PHP também possui um servidor da web embutido :

php -S localhost:8000

Você pode especificar o diretório de documentos do servidor da Web com -t, por exemplo:

php -S localhost:8000 -t /var/lib/www

Se você deseja acessar o servidor pela rede, então:

php -S 0.0.0.0:8000 -t /var/lib/www
homem a trabalhar
fonte
Uau, isso foi fácil e útil!
Michael-O
Este é realmente bom se você quiser testar scripts php localmente.
Erik
15

O nó possui um módulo de servidor HTTP simples, rápido e leve. Para instalar:

sudo npm install http-server -g

(Supondo que você tem nodee npmjá instalado.)

Para executá-lo, use o diretório atual como raiz do site:

http-server

Isso cria um servidor http://0.0.0.0:8080/.

ashes999
fonte
Funciona. Eu tenho um projeto Node em uma máquina FreeBSD, apenas corro npm install -D http-serverdentro do diretório do projeto e adiciono as seguintes linhas ao meu package.jsonarquivo: "scripts": { "build": "webpack && cd src/public && http-server" },agora só preciso rodar npm run buildno diretório do projeto para iniciar o servidor HTTP, escutando na porta 8080 por padrão.
user3405291
2
Primeiro eu tentei " python3 -m http.server", mas é de thread único e apenas um cliente pode baixar por vez, os outros precisam esperar. Essa solução com o Node.js funciona melhor, devido à natureza assíncrona do Node. Se você deseja compartilhar um arquivo com várias pessoas, use isso.
Jabba
6

Tente usar SimpleHTTPServerem Python.

mkdir ~/public_html
command_to_generate_output > ~/public_html/output.txt

(cd ~/public_html; python -c 'import SimpleHTTPServer,BaseHTTPServer; BaseHTTPServer.HTTPServer(("", 8080), SimpleHTTPServer.SimpleHTTPRequestHandler).serve_forever()')

As duas primeiras linhas são configuradas para o servidor web. A última linha cria um servidor web simples, aberto na porta 8080, que serve apenas arquivos de ~/public_html. Se apenas um arquivo está no diretório, então, apenas que é exposta: http://localhost:8080/output.txt.

Arcege
fonte
é isso que eu uso, basta copiar a última linha e colá-la em um .pyarquivo, depois executá-lo com python(ou torná-lo executável). Lembre-se de que você deve executar com o interpretador python 2.x.
Hanan N.
3

Você pode pegar o xinetd . Coloque o seguinte arquivo de configuração em /etc/xinetd.d/ e service xinetd reload :

service http
{
  flags = REUSE IPv4
  protocol = tcp
  socket_type = stream
  port = 80
  wait = no
  user = nobody
  server = /bin/echo
  server_args = -e HTTP/1.0 301 Moved Permanently\nContent-Length: 0\nLocation: https://goo.gl/\n\n
  disable = no
}

Funciona para meus propósitos de redirecionamento:

# wget 127.0.0.1
--2016-04-04 22:56:20--  http://127.0.0.1/
Connecting to 127.0.0.1:80... connected.
HTTP request sent, awaiting response... 301 Moved Permanently
Location: https://goo.gl/ [following]
...
AX-Labs
fonte
2

Servidor HTTP Ruby WEBrick Oldschool :

#!/usr/bin/env ruby

require 'webrick'
server = WEBrick::HTTPServer.new(:Port => 8000,
                                 :DocumentRoot => '~/webrickroot')

# stop server with Ctrl-C
trap('INT') { server.stop }
server.start

Certifique-se de modificar o DocumentRootpara sua instalação. Veja também isso .

Comunidade
fonte
2

Outra opção seria instalar o lighttpd. A seguir, são sugeridas as etapas para instalar o lighttpd em um Unbuntu 12.04 LTS.

apt-get update
apt-get upgrade --show-upgraded
apt-get install lighttpd
ifconfig
http://[your-ip-address]:80
/etc/lighttpd/lighttpd.conf (Edit to add server.port)
server.port = "8080"

Nota: O Documentroot é o local onde todos os arquivos acessíveis pela Web serão locais. O local é / var / wwww

A etapa acima instalará um servidor web lighttpd básico. Para mais informações, consulte as seguintes referências

Referências:

Mahendra Gunawardena
fonte
2

Simples liner Ruby para servir um diretório:

ruby -run -e httpd . -p 8080
Travis Reeder
fonte
2

./devd -o -a -P devd:devd .

  • -o abre o URL no navegador
  • -a para todas as interfaces
  • -P usuário / senha de autenticação
  • . servir arquivos no mesmo diretório

https://github.com/cortesi/devd/releases

nwgat
fonte
2

Uma correção / aprimoramento simples para uma resposta votada levemente injusta (imho) também pode funcionar. Vamos configurar o arquivo html primeiro ...

echo '<html><head><title>My Test File</title></head><body><hi>OK!</h1></body></html>' > my_file.html

Agora você pode atendê-lo com esta linha única:

while true; do echo -e "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n" | cat - my_file.html  | nc -l -p 8080; done

Essa ideia básica se presta a outros truques que podem funcionar para você por meio de outras catidéias ou subconjuntos, como:

while true; do echo -e "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\nI think the date is $(date), Have a good day!" | nc -l -p 8080; done
Vijay
fonte
0

Exemplo simples de netcat para colocar no script bash:

while true ; do nc -l 80 <index.html ; done 
hotrider
fonte
11
Isso falha totalmente em falar HTTP.
Derobert
Eu tentei while [ 1=1 ] ; do echo "TEST" | nc -l 80; done- indo para 127.0.0.1 realmente retorna o conteúdo. Eu tive que fazer isso como raiz. Então, de uma maneira extremamente grosseira - ele pode fazer o trabalho, e eu gosto disso. Tentei acessar meu-hostnname.local em outra máquina na LAN e funcionou também.
unfa
0

Vale a pena mencionar aqui o SFK

http://stahlworks.com/dev/swiss-file-knife.html

uma excelente ferramenta multiuso sem dependências

disponível nos sabores deb e rpm

sfk httpserv -port 1234

servirá diretório atual

sfk httpserv -port 1234 -rw

também permitirá o upload de arquivos

Tagwint
fonte
0

Pure bash: um servidor web em um script de shell .

Além disso, você precisará do xinetd (acredito disponível em qualquer distribuição) para ouvir a porta e executar o script quando necessário, para que você não precise codificar a pilha tcp etc. no bash.

Putnik
fonte
0

Usei estas instruções para instalar um servidor Web na minha máquina CentOS sem precisar usar o sudo ou tocar em nenhum arquivo de sistema:

Primeiro nó de instalação:

$ cd ~
$ wget https://nodejs.org/download/release/latest/node-v8.6.0-linux-x64.tar.gz
$ tar node-v8.6.0-linux-x64.tar.gz

instale o servidor http:

$ export PATH=~/node-v8.6.0-linux-x64/bin:$PATH
$ npm install http-server

em seguida, execute o servidor http na porta 12321:

$ ~/node-v8.6.0-linux-x64/bin/node_modules/http-server/bin/http-server -p 12321
user674669
fonte
0

Melhorei ncum pouco a solução para que:

  • Adiciona a filename=dica,
  • É executado em um loop até Ctrl + C,
  • Salva um PID para /tmp/serveFile-$PORTque você possa matá-lo mais tarde facilmente.

.

#!/bin/bash

FILE=$1;
if [ "$FILE" == "" ] ; then echo "Usage: $0 <file-to-serve> [<port:7979>]"; exit; fi
PORT=${2:-7979}
echo Serving $FILE at $PORT, PID: $$
echo $$ > /tmp/serveFilePID-$PORT

while true; do 
    { echo -ne "HTTP/1.0 200 OK\r\nContent-Length: $(wc -c <$FILE)\r\nContent-Disposition: inline; filename=\"$(basename $FILE)\"\r\n\r\n"; cat $FILE; } | nc -l $PORT
    CODE=$?
    #echo "Code: $CODE";
    if [ $CODE -gt 128 ] ; then break; fi;
done;

rm /tmp/serveFilePID-$PORT

Pode-se também usar, nc -k -l ...mas desta maneira você pode

  • faça ações personalizadas entre os arquivos veiculados,
  • alterne vários arquivos.
Ondra Žižka
fonte