Tiempo estimado de lectura < 3 min
En la actualidad, todo está en “la nube” por varios motivos, como la seguridad y la accesibilidad desde casi cualquier dispositivo. Si, por algún motivo, las soluciones de tipo nube (Onedrive, Google Drive, Sugar, SpiderOak,…) se queda pequeña, se vuelve cara o poco fiable, se puede enchufar un USB a la Raspberry Pi y tirar de Nginx. (Para que la siguiente lectura pueda reportar alguna utilidad, recomiendo antes disponer de una Raspberry Pi y de tener en ésta Nginx instalado…).
Desde hacía un tiempo quería poder acceder a mi software desde cualquier lugar. Con “mi software” me refiero a todos archivos de instalación (set up), para que, en caso de necesitarlo, poder entrar, pillarlo e instalarlo.
Ya tenía un dominio web que redirigía a la Raspberry de mi casa, así que lo único que hice fue:
- Declarar otro servidor virtual en mi archivo de configuración de Nginx:
- Indicar un puerto de escucha diferente al 80 (es el predeterminado del protocolo HTTP).
- Indicar la ruta al directorio del USB (que previamente había montado).
- Añadir las sentencias necesarias para la ejecución de PHP (el php5 ya estaba instalado). Después veremos que esto no era necesario.
- Redirigir el puerto en el Router, para llegar desde el WAN hasta la Raspberry Pi.
- Llenar el USB de archivos. Esto lo hice con Filezilla desde otro ordenador cuando ya estaba montado USB.
La configuración del servidor en nginx.conf quedó más o menos así:
[code language=”text”]
server {
listen EL_PUERTO;
server_name MI_DOMINIO;
root /RUTA_A_MI_USB;
index index.html index.htm index.php;
location ~ \.php$ {
fastcgi_pass unix:/var/run/php5-fpm.sock;
fastcgi_index index.php;
include fastcgi_params;
}
}
[/code]
Mi objetivo era utilizar PHP (lenguaje en el que nunca antes había programado) para poder navegar por los directorios, recorriendo los archivos y sin afectar esto a la vulnerabilidad.
Construí el siguiente archivo “index.php” y lo deposité en el directorio raíz. (En caso de ser el lector alguien experimentado en PHP, agradecería las críticas).
[code language=”php”]
<html>
<head>
<style type="text/css">
.un_directorio {
color: blue;
}
.un_archivo {
color: green;
}
</style>
</head>
<body>
<?php // Aquí está el grueso. El archivo se modifica según el directorio.
$LA_RUTA = "/MI_RUTA";
function fDesplegar ($dir) {
if (substr($dir,0,strlen($LA_RUTA)) <> $LA_RUTA) {
$dir = $LA_RUTA;
}
echo "<h1>" . $dir . "</h1></br>";
$a = scandir($dir);
$arrlength = count($a);
if ($dir == $LA_RUTA) {
$inicio = 2;
} else {
$inicio = 1;
}
for ($x = $inicio; $x < $arrlength; $x++) {
if (is_dir($dir . "/" . $a[$x])){
$b = "\"" . "index.php?raiz=" . $dir . "/" . $a[$x] . "\"";
$clase = "\"" . "un_directorio" . "\"";
} else {
$b = "\"" . $dir . "/" . $a[$x] . "\"";
$clase = "\"" . "un_archivo" . "\"";
}
echo "<a class=$clase href=$b>" . $a[$x] . "</p>";
}
}
$raiz = $_GET["raiz"];
if (!isset($raiz)) {
echo "<h1>Bienvenido</h1>";
$raiz = getcwd();
}
$directorio = realpath(dir($raiz)->path);
if ($directorio){
fDesplegar($directorio);
}
unset($raiz);
?>
</body>
</html>
[/code]
He de decir que el script funcionó. Estuve un rato probándolo y parecía no fallar.
Sin embargo, se lo comenté a un amigo, quien me habló de “no reinventar la rueda”. Y además me adjuntó un enlace de Stackoverflow que hablaba de esto.
Después de este “chasco” (tanto tiempo para un script sustituible por 2 líneas…), abrí nginx.conf y cambié la declaración de la directiva por esta otra:
[code language=”text”]
server {
listen EL_PUERTO;
server_name MI_DOMINIO;
root /RUTA_A_MI_USB;
index index.html index.htm index.php;
autoindex on; # Indexa el contenido y sub-contenido
autoindex_exact_size off; # Redondea el tamaño de los archivos
}
[/code]
De esta manera, al menos a priori, es más seguro y el formato de la página queda más estandarizado.
¡Ciao!
Muchas gracias por compartir tu sabiduría, Toni