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?



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:



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 .


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
    

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

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

¡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/.


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.


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]
...

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 .


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


2

Ruby one liner simple para servir un directorio:

ruby -run -e httpd . -p 8080


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


0

Ejemplo simple de netcat para poner en script bash:

while true ; do nc -l 80 <index.html ; done 

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

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.


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

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.
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.