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

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 "<!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