Table of Contents
Varias formas de crear servidores mediante linea de comandos (Netcat, Python, PHP, Perl y Ruby )
Netcat
Opción 1
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 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\\\n<html>date: \$\(date\)<br>server:\$SOCAT_SOCKADDR:\$SOCAT_SOCKPORT<br>client: \$SOCAT_PEERADDR:\$SOCAT_PEERPORT\\\n<pre>\\\"\"; cat; echo -e \"\\\"\\\n</pre></html>\\\"\""
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
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 "<!DOCTYPE HTML><html><head><meta http-equiv=\"refresh\" content=\"5\" charset=\"UTF-8\"></head><body><pre>" > index.html && { date; echo $'\n'; df -h; echo $'\n'; top -b -n 1; } >> index.html && echo "</pre></body></html>" >> 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
- autoindex.sh
#!/bin/bash INDEX=`du -h * --exclude "index.html" | awk '{print "<tr><td><a href=\"" $2"\">"$2"</a></td><td>"$1"</td></tr>"}'` echo " <html> <head> <STYLE type='text/css'> body {background-color:#b0c4de;} margin:0px;padding:0px; width:100%; box-shadow: 10px 10px 5px #888888; border:1px solid #000000; -moz-border-radius-bottomleft:0px; -webkit-border-bottom-left-radius:0px; border-bottom-left-radius:0px; -moz-border-radius-bottomright:0px; -webkit-border-bottom-right-radius:0px; border-bottom-right-radius:0px; -moz-border-radius-topright:0px; -webkit-border-top-right-radius:0px; border-top-right-radius:0px; -moz-border-radius-topleft:0px; -webkit-border-top-left-radius:0px; border-top-left-radius:0px; }.CSSTableGenerator table{ border-collapse: collapse; border-spacing: 0; width:100%; height:100%; margin:0px;padding:0px; }.CSSTableGenerator tr:last-child td:last-child { -moz-border-radius-bottomright:0px; -webkit-border-bottom-right-radius:0px; border-bottom-right-radius:0px; } .CSSTableGenerator table tr:first-child td:first-child { -moz-border-radius-topleft:0px; -webkit-border-top-left-radius:0px; border-top-left-radius:0px; } .CSSTableGenerator table tr:first-child td:last-child { -moz-border-radius-topright:0px; -webkit-border-top-right-radius:0px; border-top-right-radius:0px; }.CSSTableGenerator tr:last-child td:first-child{ -moz-border-radius-bottomleft:0px; -webkit-border-bottom-left-radius:0px; border-bottom-left-radius:0px; }.CSSTableGenerator tr:hover td{ } .CSSTableGenerator tr:nth-child(odd){ background-color:#e5e5e5; } .CSSTableGenerator tr:nth-child(even) { background-color:#ffffff; }.CSSTableGenerator td{ vertical-align:middle; border:1px solid #000000; border-width:0px 1px 1px 0px; text-align:left; padding:7px; font-size:14px; font-family:Arial; font-weight:normal; color:#000000; }.CSSTableGenerator tr:last-child td{ border-width:0px 1px 0px 0px; }.CSSTableGenerator tr td:last-child{ border-width:0px 0px 1px 0px; }.CSSTableGenerator tr:last-child td:last-child{ border-width:0px 0px 0px 0px; } .CSSTableGenerator tr:first-child td{ background:-o-linear-gradient(bottom, #4c4c4c 5%, #000000 100%); background:-webkit-gradient( linear, left top, left bottom, color-stop(0.05, #4c4c4c), color-stop(1, #000000) ); background:-moz-linear-gradient( center top, #4c4c4c 5%, #000000 100% ); filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#4c4c4c', endColorstr='#000000'); background: -o-linear-gradient(top,#4c4c4c,000000); background-color:#4c4c4c; border:0px solid #000000; text-align:center; border-width:0px 0px 1px 1px; font-size:16px; font-family:Arial; font-weight:bold; color:#ffffff; } .CSSTableGenerator tr:first-child:hover td{ background:-o-linear-gradient(bottom, #4c4c4c 5%, #000000 100%); background:-webkit-gradient( linear, left top, left bottom, color-stop(0.05, #4c4c4c), color-stop(1, #000000) ); background:-moz-linear-gradient( center top, #4c4c4c 5%, #000000 100% ); filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#4c4c4c', endColorstr='#000000'); background: -o-linear-gradient(top,#4c4c4c,000000); background-color:#4c4c4c; } .CSSTableGenerator tr:first-child td:first-child{ border-width:0px 0px 1px 0px; } .CSSTableGenerator tr:first-child td:last-child{ border-width:0px 0px 1px 1px; } </STYLE> </head> <body> <div class='CSSTableGenerator' style='width:600px;height:150px;'> <table> <tr> <td>Fichero</td> <td > Tamaño </td> </tr> $INDEX </table> </div> </body> </html>"
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