Servidor HTTP de linha de comando simples

94

Eu tenho um script que gera um relatório diário que desejo veicular ao chamado público geral. O problema é que eu não quero adicionar à minha manutenção dores de cabeça 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?

    
por Cid 20.02.2012 / 11:55

19 respostas

21

Sim, nweb.

Pode ser encontrado aqui: nweb.c

(anteriormente em ibm.com )

Para compilar o nweb.c:

gcc -O -DLINUX nweb.c -o nweb
    
por 20.02.2012 / 12:13
130

Tente SimpleHTTPServer :

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

Deverá servir o que estiver no CWD (por exemplo, index.html) em link .

    
por 20.02.2012 / 16:45
38

Use node.js , rápido e leve.

Ou

use apenas o comando nc netcat simples para iniciar um servidor da web rápido em uma porta e exibir o conteúdo de um arquivo, incluindo os cabeçalhos de resposta do servidor.

Referência da Wikipedia:

link

{ 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
    
por 20.02.2012 / 12:13
37

Existe uma Grande lista de one-liners de servidores estáticos :

To get on this list, a solution must:

  1. serve static files using your current directory (or a specified directory) as the server root
  2. be able to be run with a single, one line command (dependencies are fine if they're a one-time thing)
  3. serve basic file types (html, css, js, images) with proper mime types, require no configuration (from files or otherwise) beyond the command itself (no framework-specific servers, etc)
  4. must run, or have a mode where it can run, in the foreground (i.e. no 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
    
por 14.07.2015 / 04:41
25

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

php -S localhost:8000

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

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

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

php -S 0.0.0.0:8000 -t /var/lib/www
    
por 02.03.2012 / 09:13
14

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

sudo npm install http-server -g

(Supondo que você tenha node e npm já instalado.)

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

http-server

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

    
por 03.10.2014 / 00:01
6

Tente usar SimpleHTTPServer em 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 da web. A última linha cria um servidor da Web simples, aberto na porta 8080, que apenas exibe arquivos de ~/public_html . Se apenas um arquivo estiver nesse diretório, apenas isso será exposto: http://localhost:8080/output.txt .

    
por 20.02.2012 / 13:10
2

Oldschool Ruby WEBrick HTTP servidor:

#!/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 DocumentRoot da sua configuração. Veja também este .

    
por 05.10.2014 / 00:22
2

Outra opção seria instalar o lighttpd. A seguir estão as etapas sugeridas 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: Documentroot é onde todos os arquivos acessíveis pela web serão colocados. A localização é / var / wwww

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

Referências:

por 14.07.2015 / 03:37
2

Simple Ruby um forro para servir um diretório:

ruby -run -e httpd . -p 8080
    
por 18.11.2015 / 22:55
2

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

  • -o abre o URL no navegador
  • -a para todas as interfaces
  • -P auth user / pass
  • servir arquivos no mesmo diretório

link

    
por 12.03.2016 / 20:21
2

Você pode usar 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]
...
    
por 05.04.2016 / 01:00
1

Uma simples correção / melhoria para uma resposta levemente injusta 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 este verso:

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 presta-se a outros truques que podem funcionar para você por meio de outras ideias de cat ou subshell, 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

Espero que ajude a fazer algumas idéias ... Eu sei que algumas das respostas anteriores aqui ajudaram a me lembrar do poder do nc e ncat: -)

    
por 01.01.2017 / 11:48
0

Exemplo simples de netcat para colocar no script bash:

while true ; do nc -l 80 <index.html ; done 
    
por 02.05.2012 / 18:45
0

SFK vale a pena mencionar aqui

link

uma excelente ferramenta multiuso sem dependências

disponível nos sabores deb e rpm

sfk httpserv -port 1234

servirá o diretório atual

sfk httpserv -port 1234 -rw

também permitirá o upload de arquivos

    
por 12.03.2016 / 21:24
0

Pure bash: Um servidor da Web em um script de shell .

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

    
por 30.08.2016 / 20:07
0

tente caddy

curl https://getcaddy.com | bash

veicula conteúdo de / var / www caddy -root /var/www "browse"

agora você encontra o servidor no link

por 09.09.2017 / 17:14
0

Eu usei essas instruções para instalar um servidor da web na minha máquina do CentOS sem ter que 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

em seguida, instale o http-server:

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

execute http-server na porta 12321:

$ ~/node-v8.6.0-linux-x64/bin/node_modules/http-server/bin/http-server -p 12321
    
por 04.10.2017 / 21:51
0

Eu melhorei um pouco a solução nc para isso:

  • Adiciona a filename= hint,
  • É executado em loop até Ctrl + C ,
  • Salva um PID para /tmp/serveFile-$PORT , para que você possa eliminá-lo mais tarde com facilidade.

#!/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

Também é possível usar nc -k -l ... , mas dessa forma você pode

  • faça ações personalizadas entre os arquivos exibidos,
  • alterna vários arquivos.
por 04.12.2017 / 21:23