Script con funciones bash y encf con password automático

Extracto:

Usualmente manejo tres carpetas que encripto con encfs, a las que llamaré para este arículo ‘aikido’, ‘judo’ y ‘karate’, cada una de ellas con su propio password. En este script podemos ver cómo mediante una función en bash puede automatizarse este proceso. Es importante compilar luego con el comando shc para ofuscar el código fuente, es decir, las palabras de paso.

@pedroruizhidalg― Trabajo solo. Esto, con sus inconvenientes, también tiene la ventaja de permitirme ciertas licencias en cuanto a la seguridad dentro de mi propio equipo. Tengo mi ordenador preparado para ejecutar scripts propios, y también ejecuto el comando shc para poder “compilar” (sí, entre comillas) mis códigos bash, de forma que el código fuente fuente quede ofuscado. Por lo que automatizar un script que posea passwords no me supone más problema que impedir el acceso de extraños a mi equipo.

Descripción

Mediante este script puedo montar los volúmenes sin necesidad de añadir más código, ni passwords.

#!/bin/bash

:<<COMMENT

 Subject: this script allows to mount few directories with encfs.
 Author: Pedro Ruiz Hidalgo
 Date: 2017-15-03

COMMENT

# COLORES

tab="\t"
RED='\033[0;31m'
BOLD='\033[1m'
NC='\033[0m'

# FUNCION MONTAJE

function montaje()
{
 local dircripto=$1
 local dirclaro=$2
 local passwd=$3

 echo $passwd | encfs -S $dircripto $dirclaro
}

# PROCESO
echo -e "Selecciona opción "
echo -e "${BOLD}1$NC) Judo"
echo -e "${BOLD}2$NC) Aikido"
echo -e "${BOLD}3$NC) Karate"
read -p "Introduce tu opción: " -n 1 -r

case $REPLY in
 1)
 echo -e "\nEstás montando ${BOLD}Judo$NC"
 montaje '/home/pedro/judo' '/home/pedro/judo_' 'passworddejudo'

 exit $?
 ;;
 2)
 echo -e "\nEstás montando ${BOLD}aikido$NC"
 montaje '/home/pedro/aikido' '/home/pedro/aikido_' 'passworddeaikido'
 exit $?
 ;;
 3)
 echo -e "\nEstás montando ${BOLD}Karate$NC"
 montaje '/home/pedro/Documentos/karate' '/home/pedro/Documentos/karate_' 'passworddekarate'
 exit $?
esac

Ejecución

La primera linea es la llamada “shebang” que permite comunicar al sistema qué intérprete debe ejecutar el presente script. Luego viene un comentario multilínea de bash para identificar el archivo fuente. En la sección COLORES se describen los colores a usar en el script. En FUNCIÓN MONTAJE, se describen tres variables locales, la primera de ellas la incluiré en la variable dircripto: el directorio que contiene los archivos encriptados. La segunda de las variables la moveré a dirclaro: el directorio que me permite ver los archivos desencriptados. La tercera es para el password. Cuando tengo las tres variables uso la función echo con la variable password y una tubería hacia el comando encfs con el argumento -S, que permite recibir el password desde fuera del propio comando encfs.

Tras eso, no es más que mostrar por pantalla unas opciones y evaluarlas en un case-esac, dependiendo del número que haya elegido se montará una u otra carpetas.

Es fácil crear otro script para que desmonte los directorios mediante:

$ fusermount -u $dirclaro

 

Epílogo

Espero y deseo que este artículo haya sido de utilidad. Es muy importante para la continuación de trabajos de calidad recibir algún tipo de feedback por parte de los lectores: es decir, responde con comentarios, evalúa la calidad del trabajo con el sistema de estrellas, comparte con tus redes sociales, da me gusta, marca el blog como favorito. Son pequeños gestos que ayudan a mantener el trabajo de creación.

 #aboutpedroruizhidalgo
[polldaddy poll=9120832]
♻ miotroblogsite ahorra papel

Aprende a usar el comando shc para compilar scripts

shell bash

Extracto:

El comando shc permite ofuscar los scripts escritos en bash, lo que elimina uno de los grandes inconvenientes a  la hora de difundir nuestros scripts en modo texto: todo el mundo que tenga acceso al script tiene acceso a su código fuente. Shc es fácil de manejar y bastante intuitivo.

@pedroruizhidalg― Cuando creamos un script en bash, uno de sus pricipales inconvenientes es el acceso al código fuente en texto plano.

Descripción

$ shc --help
shc: invalid option -- '-'
shc parse: Unknown option
shc Version 3.8.9b, Generic Script Compiler
shc Copyright (c) 1994-2015 Francisco Rosales <frosal@fi.upm.es>
shc Usage: shc [-e date] [-m addr] [-i iopt] [-x cmnd] [-l lopt] [-rvDTCAh] -f script

    -e %s  Expiration date in dd/mm/yyyy format [none]
    -m %s  Message to display upon expiration ["Please contact your provider"]
    -f %s  File name of the script to compile
    -i %s  Inline option for the shell interpreter i.e: -e
    -x %s  eXec command, as a printf format i.e: exec('%s',@ARGV);
    -l %s  Last shell option i.e: --
    -r     Relax security. Make a redistributable binary
    -v     Verbose compilation
    -D     Switch ON debug exec calls [OFF]
    -T     Allow binary to be traceable [no]
    -C     Display license and exit
    -A     Display abstract and exit
    -h     Display help and exit

    Environment variables used:
    Name    Default  Usage
    CC      cc       C compiler command
    CFLAGS     C compiler flags

    Please consult the shc(1) man page.

$

Para muestra, un botón. Este es, así de simple, el help del comando shc con lo que podemos insertar fecha de caducidad al script, esto es especialmente útil cuando tengas que distribuir en tu equipo (hablo de personas) de trabajo un script que por sus características tengan fecha de caducidad, por cualquier causa. Mensaje cuando el archivo esté caducado. Así como otras opciones interesantes que os dejo descubrir a vosotros.

Es interesante saber que está en los repositorios Ubuntu. En la práctica significa que podemos descargarlo así:

$ sudo apt update
$ sudo apt install shc

Y con esto ya lo tenemos listo para ejecutar.

Ejecución

El comando shc generará dos archivos, uno con la extensión .x, que será el ejecutable, y otro .x.c que contendrá el código en c. Con el argumento -f indicamos el nombre del archivo shell a compilar. Me encontré un problema con la línea shebang porque según mi costumbre la escribo llamando a env, para que el suministre la dirección de bash. Lo hago así.

#!/usr/bin/env bash

Sin embargo para compilar hay que cambiarlo a:

#!/bin/bash

La sintaxis es simple, imaginemos que quiero compilar un archivo que se llama “buscar”, sería así.

$ shc -f buscar

Epílogo

Espero y deseo que este artículo haya sido de utilidad. Es muy importante para la continuación de trabajos de calidad recibir algún tipo de feedback por parte de los lectores: es decir, responde con comentarios, evalúa la calidad del trabajo con el sistema de estrellas, comparte con tus redes sociales, da me gusta, marca el blog como favorito. Son pequeños gestos que ayudan a mantener el trabajo de creación.

#aboutpedroruizhidalgo

[polldaddy poll=9120832]
♻ miotroblogsite ahorra papel

Dejar funcionando un proceso aunque cerremos el terminal

procesos
procesos
procesos en Linux

Extracto:

Dejar funcionando un proceso aunque cerremos el terminal. El comando de Linux disown permite perder la propiedad de un proceso para que éste siga ejecutándose en segundo plano, lo que permite cerrar el terminal sin que por ello se pierda (o muera) el proceso.

@pedroruizhidalg― Es muy común que tengamos de dejar un terminal abierto porque en él tenemos un proceso muy largo. También suele coincidir que los procesos largos son “delicados”. Mientras trabajamos en otra cosa, siempre corremos el riesgo de cerrar el terminal accidentalmente: matando irremisiblemente el proceso o procesos que estuvieran activos en ese terminal. Se acabó todo.

Descripción

El comando disown, como decimos arriba, pierde la propiedad del proceso: en otras palabras, desvincula el proceso del la ejecución del terminal. Vamos a simular un comando muy largo con el comando de linux yes. Como sabéis este comando envía al terminal (o a la salida que hayamos definido) el carácter ‘y’ mientras esté activo.

Por tanto nuestra idea va a ser desviar el comando yes a /dev/null y pasar este proceso a segundo plano mediante la orden ‘&’. Comprobaremos que se está ejecutando con el comando jobs. Posteriormente desvincularemos, cerraremos el terminal y dispondremos de ese proceso desde un terminal nuevo.

Ejecución

$ yes > /dev/null &
[1] 10889
$ jobs
[1]+  Ejecutando              yes > /dev/null &

Como ahora tenemos un el proceso yes enviando datos a /dev/null en segundo plano, esto está numerado con nuestro proceso 1. Al que nos referiremos como %1 para identificar el proceso. Ahora vamos a desvincularlo y procesarlo desde otro terminal.

$ disown -h %1
$ jobs

Ahora podemos cerrar el terminal tranquilamente. Abrimos otro y miramos los procesos ‘yes’ que se esté ejecutando así:

$ ps -ef | grep yes
pedro 10889 8917 99 15:00 pts/1 00:07:14 yes

Si queremos cerrarlo definitivamente, en el ejemplo que nos ocupa es conveniente para no tener ahí un proceso ejecutándose hasta que se apague el ordenador. Así:

$ kill -9 10889

Con lo que hemos terminado el ciclo completo.

Epílogo

Espero y deseo que este artículo haya sido de utilidad. Es muy importante para la continuación de trabajos de calidad recibir algún tipo de feedback por parte de los lectores: es decir, responde con comentarios, evalúa la calidad del trabajo con el sistema de estrellas, comparte con tus redes sociales, da me gusta, marca el blog como favorito. Son pequeños gestos que ayudan a mantener el trabajo de creación.

 #aboutpedroruizhidalgo
[polldaddy poll=9120832]
♻ miotroblogsite ahorra papel

Crea scripts propios para encriptar y desencriptar

La Criptografía simétrica es un muro.

Extracto:

Tener la posibilidad de encriptar y desencriptar rápidamente en tu sistema aporta un plus de comodidad que hará ejecutes tus propios comandos más a menudo que si lo haces directamente desde el comando nativo del sistema ―al menos para mí―.

Este artículo consta de dos scripts (muy similares), realizados en BASH, uno para encriptar y otro para desencriptar, a los que añadiremos un parámetro para ayuda que nos proporcione la sintaxis en caso de olvidarla.

@pedroruizhidalg― Antes de continuar leyendo asegúrate que sabes cómo preparar tu sistema para ejecutar nuestros comandos.

Existe la creencia que la CS es menos potente que la CA. Es un mito, quizá debido al desconocimiento. Aclaremos, antes de empezar algunos conceptos: La diferencia entre las CS y CA no es más que la desconfianza en el canal de distribución de las claves. En el caso de la CA, existen dos claves, una pública y otra privada, de tal forma que exponiendo tu clave pública en uno de los muchos servidores existentes. Yo uso Rediris, pero realmente no tiene mucha importancia cuál uses, pues los servidores de clave se intercambian información para expandir lo más posible alrededor del mundo el mayor número de claves posible. El programa GPG encripta conociendo la clave privada del emisor y la clave pública del receptor, encripta de distinta forma para cada uno de los destinatarios, aún cuando el mensaje sea el mismo.

En cambio, la criptografía simétrica, asume que el canal de distribución de las claves es absolutamente seguro. Esta afirmación es cierta cuando estás encriptando para ti mismo ¿En qué situación? Pues porque quieres alejar de miradas indiscretas algo que tienes en tu sistema, ya sea, por ser información comprometida o por alguna otra razón que no entraré a describir.

Abreviaturas usadas

  • CS: Criptografía Simétrica.
  • CA: Criptografía Asimétrica.
  • GPG: GnuPG.

Descripción

Preparemos el primero de los comandos, lo llamaremos “symmetric.c” y se encargará de encriptar. Así:

$ touch symmetric.c
$ chmod +x symmetric.c

Con nuestro editor preferido le añadimos el siguiente código:

#!/usr/bin/env bash
echo "+------------------------+"
echo "| por Pedro Ruiz Hidalgo |"
echo "+------------------------+"
echo " "

if [[ $1 == "-h" ]];
then
 echo " "
 echo "symmetric.c ARCHIVO para comprimir"
 echo "symmetric.c ARCHIVO ARCHIVO para comprimir indicando archivo de salida"
 echo " "
 exit 0
fi

if [ $# -lt 1 ];
then
 echo "Necesitas un parámetro como nombre de archivo a encriptar"
 echo " "
 echo "symmetric.c -h para help"
 echo " "
fi

if [ $# = 1 ];
then
 gpg --symmetric --cipher-algo AES256 $1
 exit 0
fi

if [ $# = 2 ];
then
 gpg -a -o $2.gpg --symmetric --cipher-algo AES256 $1
 exit 0
fi

El primero de los if comprueba que el parámetro sea ‘-h”, en tal caso muestra la ayuda. El segudo if, mira si el número de parámetros que nos han pasado. Si viene sin parámetros lo indicamos y sugerimos que se ejecute la ayuda. El tercero, encripta el nombre de archivo que le pasemos como parámetro y genera ese mismo nombre de archivo con la extensión “.gpg” al final. El cuarto if, nos sirve para proporcionar nosotros mismos el nombre del archivo resultante.

A continuación creamos el archivo “symmetric.d” de forma análoga a su compañero. Igualmente le asignamos permisos de ejecución de tal forma como hicimos con su compañero mediante el comando chmod.

#!/usr/bin/env bash
echo "+------------------------+"
echo "| por Pedro Ruiz Hidalgo |"
echo "+------------------------+"
echo " "

if [ $# -lt 1 ];
then
 echo " "
 echo "symmetric.d -h para help"
 echo " "
 exit 0
fi

if [[ $1 == "-h" ]];
then
 echo " "
 echo "symmetric.d ARCHIVO para desencriptar"
 echo "symmetric.d ARCHIVO ARCHIVO para desencriptar indicando archivo de salida"
 echo " "
 exit 0
fi

if [ $# == 1 ];
then
 gpg -d $1
 exit 0
fi

if [ $# == 2 ];
then
 gpg -o $2 -d $1
 exit 0
fi

El primero de los if comprueba que el número de parámetros sea al menos uno. En caso contrario (no hay ningún parámetro) sugiere que pidan ayuda con el parámetro ‘-h’. El segundo if realiza la comprobación de si están pidiendo ayuda, si es así la muestra. El tercero de ellos desencripta y muestra la salida por pantalla. El cuatro if, desencripta de igual forma pero dando nombre al archivo generado.

Ejecución

Probar el script symmetric.c

$ echo "esto es un contenido cualquiera" > qaz.txt
$ symmetric.c qaz.txt qaz.gpg

Probar el script symmetric.d

$ symmetric.d qaz.gpg qaz2.txt

Epílogo

Atenderé cualquier duda que tengáis acerca de los scripts y su funcionamiento. Los he resumido al máximo para su clara comprensión.

Espero y deseo que este artículo haya sido de utilidad. Es muy importante para la continuación de trabajos de calidad recibir algún tipo de feedback por parte de los lectores: es decir, responde con comentarios, evalúa la calidad del trabajo con el sistema de estrellas, comparte con tus redes sociales, da me gusta, marca el blog como favorito. Son pequeños gestos que ayudan a mantener el trabajo de creación.

#aboutpedroruizhidalgo

[polldaddy poll=9120832]
♻ miotroblogsite ahorra papel

Discriminar columnas desde el terminal de linux

sed y awk

Extracto

El comando ‘ls -la‘ nos produce siempre nueve columnas. A veces, sobre todo cuando queremos redirigir el resultado a un fichero, puede que nos estén sobrando información, tan solo queremos alguna de las columnas. Os presento el comando awk de Linux.

@pedroruizhidalg―

Descripción

Cuando ejecutamos ‘ls -la’, yo tengo un alias al que le llamo ‘ll’, nos produce algo así como lo siguiente:

$ ls -la
total 152
drwxrwxr-x  2 pedro pedro  4096 mar  1 13:43 .
drwx-----x 79 pedro pedro 20480 feb 27 20:18 ..
-rwxrwxr-x  1 pedro pedro   640 ene 21 18:17 buscar
-rwxrwxr-x  1 pedro pedro   352 feb  5 11:35 dni
-rwxrwxr-x  1 pedro pedro  3276 feb 12 14:43 l
-rwxrwxr-x  1 pedro pedro  2758 feb 18 11:37 lin
-rwxrwxr-x  1 pedro pedro  1326 feb 21 13:35 list.dir
-rwxrwxr-x  1 pedro pedro  1318 feb 28 12:33 list.files
-rwxrwxr-x  1 pedro pedro   388 feb  7 20:43 prueba_substring
-rwxrwxr-x  1 pedro pedro   185 feb  8 13:15 qqq
-rwxrwxr-x  1 pedro pedro    21 ene 21 17:20 script1
-rwxrwxr-x  1 pedro pedro    49 mar  1 13:41 tawk
$

Sin embargo yo puedo querer filtrar sólo la columna del nombre de usuario, que si nos damos cuenta es la cuarta columna.

Ejecución

Para ello crearemos una tubería tras el comando de listado para que le entrege los datos obtenidos a awk, indicándole que muestre tan solo la columna número 4. Así:

 

$ ls -la | awk '{print $4}'

pedro
pedro
pedro
pedro
pedro
pedro
pedro
pedro
pedro
pedro
pedro
pedro
pedro
$

Epílogo

 

Espero y deseo que este artículo haya sido de utilidad. Es muy importante para la continuación de trabajos de calidad recibir algún tipo de feedback por parte de los lectores: es decir, responde con comentarios, evalúa la calidad del trabajo con el sistema de estrellas, comparte con tus redes sociales, da me gusta, marca el blog como favorito. Son pequeños gestos que ayudan a mantener el trabajo de creación.

 

 #aboutpedroruizhidalgo
[polldaddy poll=9120832]
♻ miotroblogsite ahorra papel