Servidor HTTP de línea de comando simple

121

Tengo un script que genera un informe diario que quiero servir al llamado público en general. El problema es que no quiero agregar a mis dolores de cabeza el mantenimiento de un servidor HTTP (por ejemplo, Apache) con todas las configuraciones e implicaciones de seguridad.

¿Existe una solución simple para servir una página HTML pequeña sin el esfuerzo de configurar un servidor HTTP completo?

Cid
fuente
44
Vea la respuesta stackoverflow.com/a/4994745 en la pregunta Servidor ftp de una línea en python en Stack Overflow .
manatwork
2
¿Por qué no solo usar netcat?
Dylan
¡En efecto! ¡Use FTP, como lo hacía la World Wide Web antes de que HTTP terminara! (Aunque supongo que no fue tan mundial a principios de la década de 1990. 😉)
Michael Scheper
1
Una gran colección de métodos han sido compilados en esta GIST
davidcondrey

Respuestas:

32

Sí nweb

Se puede encontrar aquí: nweb.c

(anteriormente en ibm.com )

Para compilar nweb.c:

gcc -O -DLINUX nweb.c -o nweb
Alejandro
fuente
160

Prueba SimpleHTTPServer :

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

Debería servir lo que sea que esté en el CWD (por ejemplo, index.html) en http://0.0.0.0:8000 .

Olivier Lalonde
fuente
11
Opcionalmente, puede especificar un número de puerto de esta manera: python3 -m http.server 1337. No puedo especificar a qué IP vincular hasta donde puedo decir. Nota: Para escuchar el puerto 80 debe tener privilegios de root, por ejemplo:sudo python3 -m http.server 80
Hubro
1
Este es bueno, pero tiene un problema con la redirección a una URL con una barra diagonal agregada. Es por eso que prefiero la versión retorcida:twistd -n web -p 8000 --path .
Greg Dubicki
--bind <address>fue agregado en python 3.4 .
drewbenn
1
Para cambiar el puerto de escucha predeterminado 8080 (con python2) a otra cosa, simplemente coloque un número de puerto después de:python -m SimpleHTTPServer 3000
Maksim Luzik
44

Hay una gran lista de servidores http estáticos :

Para entrar en esta lista, una solución debe:

  1. Servir archivos estáticos utilizando su directorio actual (o un directorio especificado) como raíz del servidor
  2. poder ejecutarse con un solo comando de una línea (las dependencias están bien si son una sola vez)
  3. sirve tipos de archivos básicos (html, css, js, imágenes) con los tipos mime adecuados, no requiere configuración (de archivos o de otro tipo) más allá del comando en sí (sin servidores específicos del marco, etc.)
  4. debe ejecutarse, o tener un modo en el que pueda ejecutarse, en primer plano (es decir, sin demonios)

Por ejemplo:

  • Trenzado (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
fuente
43

Uso node.js, rápido y ligero.

O

simplemente use el nccomando netcat simple para iniciar un servidor web rápido en un puerto y servir el contenido de un archivo, incluidos los encabezados de respuesta del servidor.

Referencia de 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
fuente
27
Un proceso de node.js desnudo con solo el shell interactivo en ejecución toma 15MB (7.5 es compartido) de RAM. Y luego tienes que ejecutar el servidor HTTP dentro de él. Es curioso que la gente lo vea como algo liviano. ;-)
jpc
Sí, lo considero ligero, puedes escalar bien con menos huella de memoria. Lea thecodinghumanist.com/blog/archives/2011/5/6/… Sin embargo, si le resulta engorroso usar node.js, entonces la sencilla utilidad netcat sirve bien para el propósito de corta duración.
Nikhil Mulley
1
Por supuesto, tiene razón si compara el nodo con Apache, pero lo que encontré divertido fue cómo se ve el nodo en comparación con cr.yp.to/publicfile.html o algo similar. :)
jpc
hmmmmm .. ok ;-)
Nikhil Mulley
8
+1 para la ncsolución basada :). Tenga en cuenta que las -nemarcas para echopueden no ser portables, pero usar el printfcomando en su lugar puede ser una mejor alternativa.
WhiteWinterWolf
29

Desde la versión 5.4.0 PHP también tiene un servidor web incorporado :

php -S localhost:8000

Puede especificar el directorio de documentos del servidor web con -t, por ejemplo:

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

Si desea poder acceder al servidor a través de la red, entonces:

php -S 0.0.0.0:8000 -t /var/lib/www
hombre trabajando
fuente
¡Guau, eso fue fácil y útil!
Michael-O
Este es realmente bueno si quieres probar php-scripts localmente.
erik
15

Node tiene un módulo de servidor HTTP simple, rápido y ligero. Instalar:

sudo npm install http-server -g

(Suponiendo que tiene nodey npmya está instalado).

Para ejecutarlo, use el directorio actual como raíz del sitio web:

http-server

Esto crea un servidor encendido http://0.0.0.0:8080/.

cenizas999
fuente
Funciona. Tengo un proyecto Node en una máquina FreeBSD, solo ejecuto npm install -D http-serverdentro del directorio del proyecto y luego agrego las siguientes líneas a mi package.jsonarchivo: "scripts": { "build": "webpack && cd src/public && http-server" },ahora solo necesito ejecutar npm run builden el directorio del proyecto para iniciar el servidor HTTP, escuchando en el puerto 8080 por defecto.
user3405291
2
Primero probé " python3 -m http.server", pero es de un solo subproceso y solo 1 cliente puede descargar a la vez, los demás deben esperar. Esta solución con Node.js funciona mejor, debido a la naturaleza asíncrona de Node. Si desea compartir un archivo con varias personas, use esto.
Jabba
6

Intenta usarlo SimpleHTTPServeren 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()')

Las dos primeras líneas están configuradas para el servidor web. La última línea crea un servidor web simple, abierto en el puerto 8080, que solo sirve archivos ~/public_html. Si sólo hay un archivo está en ese directorio, entonces sólo se expone que: http://localhost:8080/output.txt.

Arcege
fuente
eso es lo que uso, solo copie la última línea y péguela en un .pyarchivo, luego ejecútela python(o hágalo ejecutable). Tenga en cuenta que debe ejecutar con el intérprete python 2.x.
Hanan N.
3

Puedes llevar a cuestas a xinetd . Coloque el siguiente archivo de configuración en /etc/xinetd.d/ y vuelva a cargar service xinetd :

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 mis propósitos de redireccionamiento:

# 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]
...
Laboratorios AX
fuente
2

Servidor HTTP Oldschool Ruby WEBrick :

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

Asegúrese de modificar el DocumentRootpara su configuración. Ver también esto .

Comunidad
fuente
2

Otra opción sería instalar lighttpd. Los siguientes son pasos sugeridos para instalar lighttpd en 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 es donde se ubicarán todos los archivos web accesibles. La ubicación es / var / wwww

El paso anterior instalará un servidor web lighttpd básico. Para más información consulte las siguientes referencias

Referencias

Mahendra Gunawardena
fuente
2

Ruby one liner simple para servir un directorio:

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

Una solución / mejora simple para una respuesta votada un poco injusta (en mi humilde opinión) también podría funcionar. Primero configuremos el archivo html ...

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

Ahora puede servirlo con esta frase:

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

Esta idea básica se presta a otros trucos que podrían funcionar para usted a través de otras catideas o sub-shell 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
fuente
0

Ejemplo simple de netcat para poner en script bash:

while true ; do nc -l 80 <index.html ; done 
hotrider
fuente
11
Eso no puede hablar HTTP por completo.
derobert
Lo intenté while [ 1=1 ] ; do echo "TEST" | nc -l 80; done: ir a 127.0.0.1 de hecho devuelve el contenido. Sin embargo, tuve que hacer eso como root. Entonces, de una manera extremadamente cruda, puede hacer el trabajo, y eso me gusta. Intenté ir a my-hostnname.local en otra máquina en la LAN y también funcionó.
unfa
0

SFK vale la pena mencionar aquí

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

Una excelente herramienta multipropósito sin dependencias

disponible en sabores deb y rpm

sfk httpserv -port 1234

servirá directorio actual

sfk httpserv -port 1234 -rw

también permitirá subir archivos

Tagwint
fuente
0

Pure bash: un servidor web en un script de shell .

Además, necesitará xinetd (creo que está disponible en cualquier distribución) para escuchar el puerto y ejecutar el script cuando sea necesario, por lo que no tiene que codificar tcp stack, etc. en bash.

Putnik
fuente
0

Usé estas instrucciones para instalar un servidor web en mi máquina CentOS sin tener que usar sudo o tocar ningún archivo del sistema:

Primer nodo de instalación:

$ 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

luego instale el servidor http:

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

luego ejecute http-server en el puerto 12321:

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

He mejorado ncun poco la solución para que:

  • Agrega la filename=pista,
  • Se ejecuta en un bucle hasta que Ctrl + C,
  • Guarda un PID para /tmp/serveFile-$PORTque pueda matarlo más tarde fácilmente.

.

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

También se podría usar, nc -k -l ...pero de esta manera puedes

  • realizar acciones personalizadas entre archivos servidos,
  • hacer alternar varios archivos.
Ondra Žižka
fuente