while true; do { echo -e 'HTTP/1.1 200 OK\r\n'; cat index.html; } | nc -l 8080; done
**Opcion 2**
nc -kl 5432 -c 'echo -e "HTTP/1.1 200 OK\r\n$(date)\r\n\r\n";echo "Hola chicas !?"
==== Python ====
Opción 1.
python -m SimpleHTTPServer
Opción 2.
python3 -m http.server 8000
Opción 3.
twistd -n web --path /var/www
**Opción 4 (Servidor HTTPS)**
Opción 1: El fichero "/tmp/cert-and-key.pem" debe tener la llave privada y el certificado de manera concatenada.
from http.server import HTTPServer, SimpleHTTPRequestHandler
import ssl
httpd = HTTPServer(('localhost', 4443), SimpleHTTPRequestHandler)
httpd.socket = ssl.wrap_socket(httpd.socket, certfile='/tmp/cert-and-key.pem', server_side=True)
httpd.serve_forever()
Opción 2.
Servidor Web con Autenticación y HTTPS: [[https://github.com/tianhuil/SimpleHTTPAuthServer]]
==== PHP ====
php -S localhost:8000
==== Ruby ====
Opción 1. WEBrick
ruby -rwebrick -e "WEBrick::HTTPServer.new(:Port => 8000, :DocumentRoot => Dir.pwd).start"
Opción2. adsf
gem install adsf # Dependencia.
adsf -p 8000
Opción3. Sinatra
gem install sinatra # Dependencia.
ruby -rsinatra -e'set :public_folder, "."; set :port, 8000'
==== Perl ====
Opción 1. IO
perl -MIO::All -e 'io(":8080")->fork->accept->(sub { $_[0] < io(-x $1 ? "./$1 |" : $1) if /^GET \/(.*) / })'
Opción 2. HTTP Server.
cpan HTTP::Server::Brick # Dependencia.
perl -MHTTP::Server::Brick -e '$s=HTTP::Server::Brick->new(port=>8000); $s->mount("/"=>{path=>"."}); $s->start'
Opción 3. Plack.
cpan Plack # Dependencia.
plackup -MPlack::App::Directory -e 'Plack::App::Directory->new(root=>".");' -p 8000
Opción 4. Mojolicious.
cpan Mojolicious::Lite # Dependencia.
perl -MMojolicious::Lite -MCwd -e 'app->static->paths->[0]=getcwd; app->start' daemon -l http://*:8000
==== Bash & SoCat ====
Dependencias: socat y [[https://github.com/AdamDanischewski/bashttpd|bashttpd]]
wget https://raw.githubusercontent.com/AdamDanischewski/bashttpd/master/bashttpd
chmod u+x bashttpd && ./bashttpd # Pulsamos la tecla enter para que termine el proceso.
El fichero /tmp/bashttpd.conf se genera tras la primera ejecución, se debe editar para amoldarlo a nuestras necesidades (DOCROOT).
Si queremos simplemente devolver un fichero o la salida de un comando, se podría hacer lo siguiente con socat.
# Salida del comando date.
socat TCP-LISTEN:8000,crlf SYSTEM:"echo HTTP/1.0 200; echo Content-Type\: text/plain; echo; date"
# Devuelve información de la petición usando código HTML.
socat -T 1 -d -d tcp-l:10081,reuseaddr,fork,crlf system:"echo -e \"\\\"HTTP/1.0 200 OK\\\nDocumentType: text/html\\\n\\\ndate: \$\(date\)
server:\$SOCAT_SOCKADDR:\$SOCAT_SOCKPORT
client: \$SOCAT_PEERADDR:\$SOCAT_PEERPORT\\\n\\\"\"; cat; echo -e \"\\\"\\\n
\\\"\""
==== webfs ====
webfsd -F -p 8000
==== busybox httpd ====
busybox httpd -f -p 8000
==== 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"}]}]).'
==== Node.js ====
**node-static**
npm install -g node-static # Dependencia.
static -p 8000
**http-server**
npm install -g http-server # Dependencia.
http-server -p 8000
==== Nginx ====
https://github.com/Duncaen/dotfiles/blob/master/bin/nginx-here
==== Compartir / Visualizar la salida de comandos por web ====
En muchas ocasiones es útil poder mostrar / compartir rápidamente por medio de una enlace http, la salida de un comando. Esto es muy socorrido para no tener que compartir / configurar nuevos accesos a ssh cuando se quiere mostrar comandos con salidas dinámicas en tiempo real, como puede ser el comando top, ping, vmstat, etc.
En esta guía se ofrecen varias posibilidades de visualizar vía un servidor web un directorio concreto del sistema. Pero si en el directorio existe un fichero "index.html", este será visualizado de manera predeterminada. Crear un fichero html con la salida de un comando que se actualice sin interacción del usuario es realmente algo muy simple y se puede realizar en pocos segundos.
Vamos a ver un ejemplo para mostrar en unos segundos una web donde cada 5 segundos se muestren la salidas de comandos df y top, con la fecha y hora en la cabecera.
El siguiente comando mostrará una web con la fecha y la salida de df -h y top. La web se actualizará para los clientes cada 5 segundos y la ejecución del comando cada 4 segundos.
# Deja el comando watch ejecutándose cada 4 segundos, el cual crea un documento html con la salida del comando date, df y top (modo batch).
watch -n 4 -d 'echo "" > index.html && { date; echo $'\n'; df -h; echo $'\n'; top -b -n 1; } >> index.html && echo "
" >> index.html'
# Ahora solo falta crear un servidor web en el directorio donde se encuentra el fichero index.html y compartirlo con quien se quiera.
==== Crear un índice de ficheros vistoso de forma automática ====
#!/bin/bash
INDEX=`du -h * --exclude "index.html" | awk '{print ""$2" "$1" "}'`
echo "
Fichero Tamaño
$INDEX
"
bash autoindex.sh > index.html
==== Enlaces de interés ====
* **Darkhttpd** (pequeño servidor web escrito en C): [[https://unix4lyfe.org/darkhttpd/]]
* **tws** (Pequeño servidor web escrito en Perl): [[https://github.com/waldner/tws]]