Bash bang commands y más

15 Septiembre 2016 at 11:26 by Adrián Pérez

bash
A continuación una serie de comandos útiles en bash, que (por lo menos a mí) me viene bien tener a mano, razón por la cual seguramente este post se actualice varias veces a medida que vaya añadiéndo comandos útiles a mi día a día.

"$?": Exit code

"$?" Muestra el exit code del comando que se acaba de ejecutar.

[adri@localhost tmp]$ cat test 
#!/bin/bash
exit 0
[adri@localhost tmp]$ ./test 
[adri@localhost tmp]$ echo $?
0
[adri@localhost tmp]$ cat test 
#!/bin/bash
exit 1
[adri@localhost tmp]$ ./test 
[adri@localhost tmp]$ echo $?
1

Ésto se puede usar dentro de scripts en bash, para saber cómo ha acabado la línea anterior del script, lo cual puede resultar muy muy útil.

Algunos apuntes sobre Bash

12 Febrero 2015 at 16:41 by Adrián Pérez

bashHe querido recoger algunas notas de Bash scripting para no tener que correr a Google (o a cualquier página de StackExchange) cada vez que las dudas me asalten.

/usr/bin/env bash vs /usr/bin/bash

Leí en la siguiente página sobre las "mejores prácticas en Bash" acerca del uso de "#!/usr/bin/env bash" en lugar del habitual "#!/usr/bin/bash" o "#!/bin/bash". La idea es usar"#!/usr/bin/env bash" pues de esta manera lo que hacemos es buscar en el PATH dónde está bash, el cual es probable se encuentre en ubicaciones distintas en servidores diferentes. Ésto evitará problemas portando scripts a otros entornos. [Más info] [2]

#!/usr/bin/env bash

Corchete simple vs Doble corchete

Básicamente, ambos sirven para evaluar expresiones. "[" es un alias para el comando "test" y tanto uno como el otro están disponibles en el estándar POSIX. "[[" sin embargo es una keyword, no un programa, y se trata una versión mejorada para evaluar expresiones, únicamente disponible en Bash, KornShell y Zsh. Si no estás preocupado por la portabilidad de tus scripts con sistemas donde no cuentes con Bash, es mejor usar siempre el doble corchete, por la funcionalidad extra que aporta (posibilidad de usar && y ||, expresiones regulares, pattern matching, etc.). [Más info] [2]

La siguiente evaluación será "true" pues b és mayor que a, 8 mayor que 4, y abcd entra dentro del patrón "a*":

if [[ b > a && 8 -gt 4 && abcd = a* ]]; then ...

PD: Dejo un enlace a la wikipedia donde se especifican los nombres en inglés de éstos símbolos, según la zona.

Fecha de creación de un fichero en Linux

27 Marzo 2014 at 10:58 by Adrián Pérez

timeHace un tiempo tuve la necesidad de ver la fecha de creación de un fichero en un servidor Linux. Conocía las fechas atime, ctime y mtime, pero no tenía muy claro cómo ver la fecha en la que el fichero se creó, puesto que por defecto, la salida del comando "ls -l" muestra la fecha de modificación del mismo.

Finamente he llegado a un blog donde explican perfectamente cómo sacar la crtime (o CReation Time). La idea es usar el comando "stat" con "debugfs". Para ello, primero tenemos que tomar como referencia la raíz del sistemas de ficheros que contiene el archivo a inspeccionar.

Maldet - Linux Malware Detect

26 Febrero 2014 at 16:34 by Adrián Pérez

virusMaldet (también conocido como LMD de las iniciales de Linux Malware Detect) es un detector de malware para entornos Linux compartidos, bajo licencia GNU GPLv2, que funciona desde el terminal.

Instalación

Podemos instalar Maldet de la siguiente manera:

1. Bajaremos el tarball de la página oficial:

[root@miServer tmp]# wget http://www.rfxn.com/downloads/maldetect-current.tar.gz

2. Descomprimiremos e instalaremos

[root@miServer tmp]# tar -zxcvf maldetect-current.tar.gz
[root@miServer tmp]# cd maldetect-1.4.2/
[root@miServer tmp]# ./install.sh

3. Ya estaremos listos para usar Maldet

Sustituir texto en múltiples ficheros en Linux

10 Enero 2014 at 12:29 by Adrián Pérez

ReemplazarBueno, aquí un post que empecé a escribir a principios del 2012, con algunos comandos útiles para sustituir texto en Linux, que siempre viene bien tener a mano. Hay que tener en cuenta, que la sustitución de texto en Linux se puede hacer de muchas formas diferentes. A continuación explico uno de los posibles métodos para sustituir texto.

Sustitución múltiple en un único fichero con vi

Si se quiere reemplazar tanto BUG como bug como cualquier combinación de mayúsculas y minúsculas de BUG por ISSUE, bastará con abrir el fichero con "vi" y ejecutar lo siguiente:

:%s/BUG/ISSUE/gi

Es importante notar que para ejecutar el comando, deberemos estar fuera del modo de inserción, para poder introducir los dos puntos del inicio del comando. La "i" del final es la que hace que el texto a buscar sea case insensitive.

Configurar SFTP con OpenSSH

20 Noviembre 2013 at 15:54 by Adrián Pérez

seguridadHoy toca ver cómo configurar openSSH (como siempre, en entornos Red Hat) para aceptar únicamente peticiones SFTP enjaulando a los usuarios sftp en sus homes. Para añadirle contenido, además, configuraremos este servicio en un segundo proceso que correrá en la máquina de forma independiente al proceso openssh habitual, para evitar tener problemas con nuestras conexiones SSH, y por tanto, se configurará un puerto de escucha diferente al habitual, en el ejemplo, el 12022.

Fichero de configuración

En primer lugar copiaremos el fichero de configuración de openssh para adaptar la copia a nuestras necesidades:

[root@myserver]# cp /etc/ssh/sshd_config /etc/ssh/sshd_config_12022
Lo abriremos con vi, y nos aseguraremos de cambiar el puerto de escucha por el nuevo puerto. Además, cambiaremos el "Subsystem sftp" por defecto y añadiremos al final las líneas correspondientes al enjaulado de usuarios:
# Cambiamos el puerto
Port 12022
 
# Modificamos el Subsystem original
#Subsystem sftp /usr/libexec/openssh/sftp-server 
Subsystem sftp internal-sftp 
 
# Añadimos el enjaulado 
Match Group sftp12022 
  ChrootDirectory /sftp/%u
  ForceCommand internal-sftp 
  AllowTcpForwarding no
Desde este momento, trabajaremos con el nuevo fichero de configuración sshd_config_12022, asegurándonos así de no intervenir en el servicio de openssh de la máquina que ofrece el servicio de SSH. Además de decirle a openssh que a partir de ahora usaremos el puerto 12022 para las coneciones SFTP, habremos definido que se enjaulará a todos los usuarios de sistema cuyo grupo principal sea el grupo "sftp12022". Además, estaremos enjaulando a todos estos usuarios en el directorio /sftp/nombreusuario.

Automatiza el mantenimiento de directorios temporales en Linux

17 Septiembre 2013 at 12:07 by Adrián Pérez

cleanNo sé cómo he podido vivir tanto tiempo sin conocer tmpwatch, una herramienta que suele venir con el sistema y que nos permite automatizar el mantenimiento de directorios que por su naturaleza, acumulan ficheros temporales que pocas veces se vuelven a usar. tmpwatch, por lo tanto, busca los ficheros y directorios antiguos en una determinada ubicación, y los elimina de forma recursiva. Lo que antes solía hacer con una instrucción como la siguiente, ahora lo haré con tmpwatch:

# eliminación ficheros con más de 365 días desde la última modificación desde el directorio actual
find . -mtime +365 -exec rm {} \;

# eliminación ficheros con más de 365 días desde la última modificación desde el directorio actual y sub-directorios
find . -depth -mtime +365 -exec rm {} \;

Un ejemplo muy claro, es usar tmpwatch para eliminar los ficheros que no se han usado (access time) en los últimos x días (o meses) dentro de directorios como /tmp o ~/Downloads. En cuanto a servidores, seguro que tendemos la típica aplicación que va dejando cientos de archivos temporales en una determinada ubicación, que hemos de estar borrando cada cierto tiempo ya sea a mano o con algún script programado en el cron.

chmod recursivo diferenciando ficheros y directorios

8 Julio 2013 at 17:05 by Adrián Pérez

En Linux, en más de una ocasión necesitamos cambiar los permisos de todo un árbol de directorios, por ejemplo, de un proyecto web que encontramos con demasiados permisos. Es habitual, para los directorios, dejar los permisos 755, mientras que para ficheros se suele usar 644.

Pero, ¿cómo modificar los permisos de forma recursiva, diferenciando ficheros de directorios? Unos comandos muy muy útiles (y que podemos encontrar en muchas webs, por ejemplo aquí) son los siguientes:

Modificar los permisos recursivamente únicamente de directorios, desde el punto en el que estamos situados:

find . -type d -exec chmod 755 {} \;

Modificar los permisos recursivamente únicamente de ficheros, también desde el punto en el que estamos situados:

find . -type f -exec chmod 644 {} \;

Con estos dos comandos, podremos cambiar los permisos de forma recursiva, aplicando diferentes permisos para los directorios y para los ficheros. Si se quiere profundizar más, el siguiente enlace explica cómo usar "find" para distinguir los tipos de ficheros.

Fuentes:

http://rainsoftletters.wordpress.com/2008/07/22/recursively-chmodi-only-directories-or-files/

Programar tareas con 'at' en Linux

3 Julio 2013 at 16:52 by Adrián Pérez

Un comando que he de reconocer que no uso todo lo que debería, es "at". Esta herramienta nos permite programar tareas que se ejecutarán una única vez. Es realmente fácil de usar y funciona a las mil maravillas. No tiene sentido usar "cron" para este tipo de tareas, puesto que cron está pensado para programar tareas que se ejecutarán con cierta periodicidad.

La idea es primeramente escribir en qué momento se va a ejecutar la tarea. Por ejemplo, si estamos a jueves a las 16:00, y queremos ejecutar una tarea una única vez la madrugada del jueves al viernes, a las 06:00, podemos ejecutar:

[root@myserver]# at -v 06:00
Fri May 17 06:00:00 2013

Actualización: Si por el contrario, queremos programar la tarea para que se ejecute el próximo 18 de Mayo a las 03AM, bastará con ejecutar:

[root@myserver]# at -v 3am May 18
Sat May 18 03:00:00 2013

La opción "-v" nos devolverá la fecha en que se va a programar la tarea. Al ejecutar la sentencia, nos entrará en "at>", que es donde tendremos que introducir la tarea a ejecutar, que al igual que hacemos con cron, puede ser una instrucción o por ejemplo la ejecución de un script:

at> /home/adri/script.sh >> /tmp/out_script.log 2>&1

Una vez acabados de introducir los comandos a ejecutar, pulsaremos "Control+D" para salir de "at>" y finalizar así las instrucciones a ejecutar. Ésto nos mostrará el fin de la tarea, el job id y de nuevo la fecha y hora programados:

at> <EOT>
job 1 at 2013-05-17 06:00

Con "at -l" listaremos las tareas pendientes, donde el primer carácter corresponderá con el id del job:

[root@myserver]# at -l
1 2013-05-17 06:00 a root

Podremos ver los detalles de la tarea programada, con "at -c" seguido del id del job. Ésto nos mostrará todo lo que se ejecutará, incluído el entorno:

[root@myserver]# at -c 1

Finalmente, siempre podremos cancelar un job, antes de la fecha de ejecución, con la opción "-d":

[root@myserver]# at -d 1

Fuente:

http://content.hccfl.edu/pollock/unix/atdemo.htm

Guardar la hora en el history de Linux

10 Abril 2013 at 19:43 by Adrián Pérez

history linux

Algo que nos puede venir muy bien, es modificar el history de linux para:

  1. Almacenar la fecha y la hora en la que se ejecutaron los comandos
  2. Aumentar el límite por defecto del history para almacenar más comandos

En entornos RedHat (he hecho la prueba en un CentOS 6.3), en lugar de modificar el .bashrc de cada usuario, se puede modifiar el script de bash global, para que afecte a todos los usuarios del sistema. Sin embargo, esta modificación no se debe hacer directamente en  /etc/bashrc, si no que es preferible crearse un fichero donde ir añadiendo las modificaciones globales, sin tocar los archivos de sistema.