Archivo de etiquetas bash

PorLeón Ramos

Wrapper: Ejecutar un script desde un servidor web en una cubieboard

¡Hola!

En esta ocasión vamos a realizar un wrapper o un script para realizar algunas acciones desde una página web en nuestra cubieboard A10.

IMPORTANTE: Cabe resaltar que esta práctica es altamente insegura y deberán de colocarse controles adicionales como contraseñas o manejo de usuarios para evitar problemas futuros.

Instalar dependencias

  • Lo primero que hay que realizar es asegurarse de que tenemos el servidor web apache instalado:
sudo apt-get install apache2 php

¿Funciona apache?

  • Ahora probaremos que está funcionando, conéctate a la misma red de tu cubieboard y revisa cuál es su dirección ip.
ip a
  • Abre un navegador y deberás ver una página de inicio como la siguiente

 

El script bash

  • Crearemos un script sencillo para probar la ejecución en la carpeta /var/www/html/scripts
sudo mkdir -p /var/www/html/scripts

cd /var/www/html/scripts/

nano script1.sh

El contenido del script será el siguiente:

#!/bin/bash

usuario=$(whoami)
echo "Este es un script BASH!!!! ejecutado por $usuario"

Recuerda darle premisos de ejecución:

sudo chmod 755 script1.sh

La página html

  • Ahora generaremos una página web con un botón en el archivo boton.html
cd /var/www/html

nano boton.html

El contenido del archivo es este:

<!DOCTYPE html>
<html lang="es">
  <head>
  <meta charset="UTF-8">
    <title>Botón para invocar un script Bash</title>
    <script>
      function ejecutarScript() {
        // Realiza una solicitud HTTP POST a un script PHP que ejecutará el script Bash
        console.log("Invocando PHP de fondo");
        var xhr = new XMLHttpRequest();
        xhr.open("POST", "ejecutar_script.php", true);
        xhr.send();
      }
    </script>
  </head>
  <body>
    <h1>Botón para invocar un script Bash</h1>
    <form action="ejecutar_script.php" method="post">
      <input type="submit" value="Ejecutar script redirigiendo"/>
    </form>
    <form action="ejecutar_script_sudo.php" method="post">
      <input type="submit" value="Ejecutar script redirigiendo y sudo"/> 
    </form>
    <button onclick="ejecutarScript()">Ejecutar Script SIN redirigir</button>
  </body>
</html>

El script php

  • Ahora crearemos un script ejecutar_script.php para que lance el script bash
nano ejecutar_script.php

el contenido del archivo es el siguiente:

<?php
// Ruta al script Bash
$scriptPath = "/var/www/html/scripts/script1.sh";

// Ejecuta el script Bash
$output = shell_exec("bash $scriptPath");

// Si deseas imprimir la salida del script Bash, puedes hacerlo aquí
echo "<pre>$output</pre>";
?>

El gemelo malvado

También haremos otro script muy parecido  ejecutar_script_sudo.php pero este lo usaremos para ejecutar el script con permisos de superusuario

nano ejecutar_script_sudo.php

el contenido del archivo es el siguiente:

<?php
// Ruta al script Bash
$scriptPath = "/var/www/html/scripts/script1.sh";

// Ejecuta el script Bash
$output = shell_exec("sudo bash $scriptPath");

// Si deseas imprimir la salida del script Bash, puedes hacerlo aquí
echo "<pre>$output</pre>";
?>

Primera prueba

  • Hasta el momento si abrimos el navegador y escribimos la dirección http://<ip_cubieboard>/boton.html vamos a  ver lo siguiente:

Si damos clic en el primer botón todo funcionará correctamente y nos aparecerá la siguiente leyenda:

Sin embargo, si usamos el segundo botón, que intenta ejecutar el script con permisos de superusuario, nos generará un error, es necesario agregar algo más para que los permisos de superusuario funcionen.

Si damos clic een el tercer botón, se lanzará el script pero de fondo y no sabemos si se ejecutó o no. Para esto abre la consola de desarrollador de tu navegador y al presionar le botón deberás ver una salida como esta:

Donde nos indica que el código javascript efectivamente lanzó la ejecución del script bash pero no vemos la salida en la pantalla.

Permisos de root

  • Para agregar los permisos de super usuario será necesario que escribamos realicemos el siguiente procedimiento:

Abrir la tabla de sudoers con el comando que valida la sintaxis:

sudo visudo

Agregar al final del archivo la siguiente línea:

www-data ALL=(ALL) NOPASSWD: /bin/bash /var/www/html/scripts/script1.sh

Guardar y salir del archivo. Si todo ha salido bien, ahora el segundo botón funcionará y el script bash se habrá ejecutado como root o superusuario.

Happy coding!

PorLeón Ramos

¿Cómo borrar y no borrar en linux?

Hola amigos de Creadores Digitales en ésta ocasión veremos cómo borrar y cómo NO borrar en Linux.

Borrar un archivo sencillo

Éste es el comando más sencillo, usa rm que podría ser el acrónimo de “remover”, seguido del nombre del archivo que vas a borrar.

rm mi_archivo.txt

Borrar un directorio

Para eliminar un directorio se puede usar el comando rmdir que podría significar “remover directorio”, sin embargo, casi no se usa porque el directorio en cuestión debe de estar vacío para ser borrado por este comando. Por lo que, o bien, primero borras todo su contenido, o bien, usamos un comando recursivo.

rmdir directorio_vacio

Borrar un directorio recursivamente

¿Recursivo? Si, lo que vamos a hacer para borrar un directorio con todo su contenido, sin importar cuántos niveles tiene, es usar el comando:

rm -Rf nombre_directorio

En mi caso uso las opciones R mayúscula para indicarle que borrará recursivamente, es decir, borrará a todos sus hijos. Pero también uso la opción f minúscula porque con ella evito que el sistema me pregunte si estoy seguro de borrar cada archivo. Ojo, ten mucho cuidado con éste comando porque puedes hacer cosas locas que te costará trabajo recuperar.

Borrando selectivamente con find

El comando find (encontrar) nos ayuda a listar el contenido de una carpeta con todos sus archivos. Por ejemplo:

find <carpeta a buscar>

Nos mostrará todo el contenido de una carpeta, tanto archivos, directorios y ligas simbólicas.

A veces queremos listar solamente los archivos y  dejar los directorios. El comando find permite filtrar con la opción -type seguida de la letra f para un archivo (file), la letra d para un directorio, o la letra l para una liga.

Por ejemplo, si queremos encontrar todos los archivos dentro de varias carpetas, podemos ejecutar el siguiente comando:

find <directorio a buscar> -type f

Ahora, ¿qué tal si queremos listar los archivos que terminen con la palabra conf? podemos hacerlo de la siguiente forma:

find <directorio a buscar> -type f -name “*conf”

¿Todo se ve muy bien verdad? Ahora, en lugar de mostrarlos, los eliminaremos.

find <directorio a buscar> -type f -name “*conf” -exec rm {} \;

Las llaves se sustituirán por el contenido que find encontró, es decir, los archivos que filtraste por tipo y por nombre. Si te fijas, al final se pone una diagonal invertida y un punto y coma. El punto y coma indica que por cada archivo que encuentre, se ejecutará una vez el comando rm.

También podemos decirle al sistema que lo intente hacer de un sólo jalón, cambiemos la diagonal invertida y el punto y coma por un signo de suma.

find <directorio a buscar> -type f -name “*conf” -exec rm {} +

Posibles errores al borrar

Archivo sin permisos

Si intentamos borrar un archivo sin permisos de escritura el sistema nos va a pedir confirmación para su borrado, pero si el archivo se encuentra en nuestro home, lo va terminar haciendo.

rm mi_archivo_sin_perms.txt

Archivo de otro usuario

Si no somos el dueño y el archivo se encuentra en otro directorio, no podremos borrarlo, el comando nos entregará un error.

rm /un_archivo.txt

rm: ¿borrar el fichero regular vacío ‘/un_archivo.txt’ protegido contra escritura? (s/n) s
rm: no se puede borrar ‘/un_archivo.txt’: Permiso denegado

Si no somos el dueño, podemos usar sudo, si contamos con el permiso de super usuario, podemos borrar archivos de otros usuarios.

sudo rm /un_archivo.txt

Nunca cometer

Borrado recursivo total

Hay muchos trolls que, en algunos foros van a intentar convencerte de ejecutar el siguiente comando o un script que contenga el siguiente comando:

sudo rm –no-preserve-root -Rf /

Dicho comando causará un borrado del sistema completamente y, si tienes los suficientes permisos, el sistema no se quejará en lo más mínimo, causando la pérdida de toda la información y que tu sistema no arranque.

Borrado de archivos de arranque

En linux los archivos de arranque se encuentran en la carpeta /boot, procura tener especial cuidado en borrar cualquiera de esos porque evitarás que el sistema vuelva a encender.

sudo rm -Rf /boot

Conclusiones

Así que ya sabes, en linux siempre hay una forma de alcanzar lo que estás buscando, sólo ten mucho cuidado al momento de realizar limpieza en tu sistema.

Hasta la próxima, no se te olvide suscribirte y recomendarnos!

PorLeón Ramos

¿Cómo cambiar un texto en varios archivos en Linux?

Mini tutorial: ¿Como cambiar texto o cadena en varios archivos en Linux?

¡Hola Creadores!

En éste mini tutorial vamos a ver cómo cambiar un texto o una cadena en varios archivos en un sistema Linux.

En la primera parte nos concentramos en encontrar los archivos que tienen la cadena de texto con la herramienta egrep.

$ egrep 'texto' * -ri

Luego vemos cómo contar los archivos encontrados utilizando la herramienta wc.

$ egrep 'cadena' -ri | wc -l

Finalmente nos concentramos en realizar el cambio que queremos

$ egrep 'cadena' -ril | xargs sed -i 's/cadena/nueva/g'

Espero que les sirva!

PorLeón Ramos

Script para hacer respaldos automáticos de mongodb

A principios de este año 2017 se presentó un tipo de «Ransomeware» que atacaba bases de datos no relaciones MongoDB, <<Ransomeware es un tipo de software malicioso que codifica tu información sensible y cobra un rescate para devolverte el acceso a la misma, proviene del inglés «Ransome» que significa secuestro y «Software»>>  y digo un tipo de Ransomeware porque en realidad no codificaba tu información, simplemente ejecutaba una sentencia de borrado y aún así te pedía rescate. Para los que alguna vez jugamos con bases de datos relacionales, su equivalente sería un «delete database» ejecutado de forma remota sobre servidores mal asegurados.

Dicho lo anterior, ese hecho dejó bien claro que era momento de tener respaldos frecuentes y bien almacenados. Si, como yo, tienes una aproximación muy práctica a las cosas, aquí te dejo un script que puede ayudarte con ese cometido.

Realizar un respaldo de bases de datos mongodb programado y, después borrar los respaldos mayores a un número de días para evitar saturación de disco duro.

No está demás mencionar que el script puede modificarse para respaldar casi cualquier cosa y, como lo estoy liberando bajo la licencia GPLv3, te invito a que lo modifiques a tu antojo. Sólo recuerda compartirlo una vez que lo cambies. Puedes realizar una derivación de mi repositorio.

El archivo readme.md tiene las instrucciones básicas de su uso, pero si tienes alguna duda posterior, no vaciles en contactarme.

Aquí la liga de acceso al repositorio: https://goo.gl/wKfiVK

¡Que la paz mental te acompañe con respaldos completos!

Hasta la próxima,