Comando linux: test

Este comando linux tiene ciertas peculiariedades que lo alejan de su utilización en consola y lo hacen realmente útil para el programación de scripts. Seguramente el hecho más relevante que reafirma lo que acabamos de decir en la manera en la que test devuelve la información; simplemente a través de su código de retorno. O sea que después de ejecutarlo por consola no veremos absolutamente nada sólo el prompt de nuestro terminal pidiendonos que introduzcamos la siguiente orden.

Test es un comando para evaluar expresiones devolviendo 0 (cómo código de retorno) en el caso de que la expresión evaluada sea verdadera o un valor distinto de 0 en el caso de ser falso. Esto es la manera habitual para la shell, completamente diferente a la programación en C donde 0 es evaluado como falso y diferente de 0 como verdadero (aunque C no tiene tipos booleanos). Bueno que me estoy liando.

El caso es que test es capaz de analizar cadenas de texto, enteros y ficheros evaluando sus propiedades para analizar lo que más nos interese de estos elementos. Así por ejemplo para cadenas es capaz de determinar si estamos ante una cadana vacia o no (-n), si su longitud es cero (-z) si es igual a otro cadena (=). Para enteros puede determinar si son iguales, mayores o menores que otro dado y para ficheros que en mi modesta opinión es donde radica uno de sus puntos puede determinar un montón de cosas como:

FILE1 -ef FILE2
FILE1 y FILE2 son el mismo fichero en realidad (mismo inodo y dispositivo)

FILE1 -nt FILE2
FILE1 es más reciente que el FILE2 (por la fecha de modificación)

FILE1 -ot FILE2
FILE1 es más antiguo que FILE2

-b FILE
FILE existe y es un fichero de bloque especial (no un fichero regular, ver mknod)

-c FILE
FILE existe y es un dispositivo de tipo caracter (ver mknod)

-d FILE
FILE existe y es un directorio

-e FILE
FILE exite (sin entrar en otras consideraciones como en el caso de los otros parámetros)

-f FILE
FILE existe y es un fichero regular

-g FILE
FILE existe y tiene marcado el bit de GUID (id de grupo)

-G FILE
FILE existe y es poseido por el EGUID (id de grupo efectivo)

-h FILE
FILE existe y es un enlace simbólico (igual que el modificador -L)

-k FILE
FILE existe y tiene marcado el bit sticky

-L FILE
FILE existe y es un enlace simbólico (igual que el modificador -h)

-O FILE
FILE existe y es poseido por el EUID (id de usuario efectivo)

-p FILE
FILE existe y es una tuberia con nombre (ver FIFOs)

-r FILE
FILE existe y el usuario actual tiene permiso de lectura sobre él

-s FILE
FILE existe y tiene un tamaño mayor que cero

-S FILE
FILE existe y es un fichero tipo socket

-t FD
el descriptor de fichero FD esta abierto en una terminal

-u FILE
FILE exite y su SUID está marcado

-w FILE
FILE existe y el usuario actual tiene permiso de escritura sobre él

-x FILE
FILE existe y el usuario actual tiene permiso de ejecución (o busqueda) sobre él

Además test es capaz de concatenar varias expresiones empleando AND o OR lógicos con los siguientes modificadores:

EXPRESSION1 -a EXPRESSION2 (AND lógico)

EXPRESSION1 -o EXPRESSION2 (OR lógico)

Como ya he comentado antes test se emplea sobre todo en programación bash en instrucciones condicionales por acabar el articulo con un par de ejemplos que ilustraran claramente su utilización:

file=”/tmp”
if [ -k $file ]
then
echo “El directorio /tmp tiene el bit sticky marcado”;
fi

Otro ejemplo

cadena=”hola”
if [ $cadena = “hola” ]
then
echo “Hola mundo!”;
fi

Observad que en los ejemplos no hemos puesto ningún test pero es que en programación en bash y en este tipo de construcciones el corchete abierto [ es sinónimo de test (y por razones de eficiencia en un builtin (bash lo tiene incluido internamente y no llama al comando test al que emula)

Memcache

Memcache es un sistema para almacenamiento de objetos en memoria que pueden ser solicitados por varios procesos, incluso en distintas máquinas y que actúa como caché para acelerar estas peticiones. Memcache ha sido diseñado de manera genérica aunque su mayor utilidad y para la que fue desarrollado inicialmente es para reducir la carga en sitios web debido a las solicitudes a base de datos que en muchos casos son innecesarias.

    Memcache ha sido desarrollado por Danga Interactive para livejournal en primera instancia pero luego liberado bajo licencia BSD. Hoy en día es empleado por muchos otros sitios webs debido a su gran utilidad, entre ellos: Livejournal, Slashdot, Wikipedia, SourceForge, FotoLog y un largo etc.

    El funcionamiento de memcache es de concepción muy sencilla. En lugar de acceder a la base de datos para solicitar determinada información primero se accede a memcached (el servidor de memcache) a través de tcp/ip (así se puede acceder a servidores memcache en máquinas remotas o en local). Si este tiene la información la devuelve y si no debemos hacer la petición a la base de datos e introducir los datos en memcached para que puedan ser accedidos directamente la próxima vez que los necesitemos. Además cada dato introducido en memcached tiene un tiempo de expiración, tras pasar este tiempo almacenado en el servidor este se considera descartable y se borra del servidor, dejando espacio para otros objetos.

    De una manera muy sencilla también es posible emplear varios servidores memcache, creando una cache distribuida todavía más eficiente o incluso utilizar varios niveles de caché entre máquinas locales y/o remotas.

    Memcaché está basado en libevent una librería de notificación de eventos asíncrona que permite ejecutar callbacks cuando un determinado evento es disparado (además de eventos puede reaccionar a señales o a intervalos de tiempo específicos, más adelante quizás le dedique un post a esta librería).

    Para instalar memcached en nuestro servidor debemos bajarnos las fuentes del sitio de Danga Interactive. La compilación e instalación no debería ser complicada. También es posible descargar fuentes y binario con apt-get o con el gestor de paquetes que tengamos instalado (absténganse windowzers)

apt-get install memcached

 El servidor memcached tiene unas pocas opciones en la línea de argumentos, estos son:

-d (implicito)
-v (verbose)
-vv (más verbose)
-m (memoría en megas disponible para el demonio)
-p (puerto a la escucha, por defecto 11211
-u (usuario bajo el que se ejecuta el servidor)
-l (IP de la que se espera conexiónes, es la única medida de seguridad del servidor, el valor por defecto es escuchar comunicaciones desde cualquier ip lo cual es completamente inseguro si no se está detrás de un firewall)
-c (número máximo de conexiones simultaneas)
-k (activa bloqueos)
-M (devuelve error cuando la memoria se agota)
-r (limita los core dump)

 El demonio toma toda la memoria especificada por el parámetro -m al principio y cuando no puede alamacenar más datos desecha aquellos accedidos menos recientemente (si no se le pasa el parámetro -M)

Ejemplo:
# memcached -d -m 2048 -l 10.0.0.40 -p 11211

El comando anterior iniciará el servidor usando 2GB de memoria y escuchando conexiones desde la ip 10.0.0.40 al puerto 11211. Recordemos que es posible iniciar más servidores memcache en la misma máquina.

Existen disponibles diversas APIs para conectarse al servidor escritas en diferentes lenguajes: PHP, Python, PERL, Ruby, Java, C, C#

Ejemplo en php de conexión con el servidor memcached:

connect(‘localhost’, 11211) or die (“Could not connect”);

$version = $memcache->getVersion();
echo “Server’s version: “.$version.”
\n”;

$tmp_object = new stdClass;
$tmp_object->str_attr = ‘test’;
$tmp_object->int_attr = 123;

$memcache->set(‘key’, $tmp_object, false, 10) or die (“Failed to save data at the server”);
echo “Store data in the cache (data will expire in 10 seconds)
\n”;

$get_result = $memcache->get(‘key’);
echo “Data from the cache:
\n”;

var_dump($get_result);

?>

traceroute y lft

Hoy comentaremos dos utilidades muy importantes para llevar a cabo un análisis del enrutamiento de paquetes en una red. Por todos es conocido la utilidad traceroute, pero lft es mucho menos conocida pero realmente más poderosa y útil.

lft emplea paquetes TCP SYN y FIN utilizando el campo del protocolo IP ‘time to live’ (tiempo de vide). lft también escucha mensajes TCP y ICMP para detectar mas información acerca de la red que está atravesando.

lft sólo tiene un parámetro obligatorio; un nombre de servidor o una dirección IP. tft soporta muchas opciones:

lft [-d dport] [-s sport] [-m min] [-M max] [-a ahead] [-c scatter ms] [-t timeout ms] [-l min ttl] [-q ISN]
[-D device] [-H ttl] [-i] [-n] [-E] [-N] [-A] [-T] [-S] [-V] [-v] [ <...>] host:dport

A través de esta herramienta puedes detectar problemas de red, pasarelas fallando o tomando demasiado tiempo en la respuesta por ejemplo.

lft significa Layer Four Tracerouter.

Prueba este comando para observar sus resultados

# lft -E -N -V news.google.es

Está es la página del projecto lft

Sintaxis ‘Here documents’

    Una herramienta a utilizar de nuestra shell bash es la heredoc (here document) se trata en realidad de una redirección de la entrada estándar que finaliza con una línea que contiene una palabra específica. Esta palabra ha de indicarse al comienzo utilizando el operador ‘<<'. Vamos a poner un ejemplo que es como mejor se aprenden las cosas:

cat > holaMundo.sh << “EOF”
#!/bin/bash

echo “Hola mundo”
EOF
bash holaMundo.sh

La sintaxis es la siguiente

<<[-] word
    here-document
word

    Si el operador de redicción es <<- entonces en todas las lineas a continuación se eliminarán los tabuladores iniciales. Permitiendo la identación del texto.     word no tendrá expansión de parámetros, sustitución de comandos, expansión aritmética o expansión de nombre de fichero. Si word contine comillas estas serán eliminadas y el here-document no tendrá expansión de parámetros, pero si no contiene comillas la expansión de parámetros ocurrirá en el here-document. Por poner un ejemplo de este comportamiento

cat > test.txt  << EOF
`date`
EOF
cat > test.txt << "EOF"
`date`
EOF

    Se puede ver que el contenido del fichero test.txt es diferente en un ejemplo y en el otro.

Star Wars open source y otros ASCII

    Prueba el siguiente comando:

$ telnet towel.blinkenlights.nl

    Verás una de las películas de Star Wars en ASCII y ¡Hecha a mano!. Aquí tienes una escena de Matrix también hecha en ASCII pero con una librería de codificación de video, vamos que no tiene tanto merito aunque su resultado sea realmente espectacular

Escena matrix

    Aquí tenemos un ejemplo con la librería aalib para autenticos frikis jugando al Quake… ¡por consola!

    Por último otro truco de la vaca mugiente:

$ apt-get install cowsay
$ cowsay “¡Hola mundo!”

egrep y grep

    La utilidad GNU grep desde su versión 2.5 ha añadido nuevas e importantes funcionalidades como son la capacidad de emplear expresiones regulares y volcar sólo las coincidencias obtenidas, salida con color y nuevas opciones para ficheros y directorios.

    Ante todo comentar que egrep en realidad ejecuta un grep -E sobre los argumentos que se le pasen, sin embargo no es un alias como algunos piensan, sino un script bash. Puedes hecharle un vistazo ejecutando:

$ vi `which egrep`

    Lo que hace exactamente la opción -E (–extended-regexp) es evaluar la expresión a buscar con grep como si fuera una expresión regular. Esto permite búsquedas con muchas más posibilidades, buscando emails,telefonos, ips,urls etc en un directorio o fichero.

    Existen más opciones en el comando grep que permiten evaluar expresiones regulares como -e, -G, -P

    Estos son algunos ejemplos de su utilización:

    Buscar las tablas creadas en un fichero volcado por mysqldump y la línea del fichero donde esto ocurre:

$ grep -E -n “CREATE TABLE \`([^\`]+)\`” -o mysql.sql

    Ver los usuarios del sistema que tienen definido el campo de información de usuario (usualmente empleado para introducir información adicional como el nombre completo o alguna descripción de la utilización del usuario)

$ egrep “[a-z]:x:[0-9]+:[0-9]+:[^:]+” /etc/passwd

    Las posibilidades de este comando (unidas a las de las expresiones regulares gracias a estas opciones) son inmensas.

Xgamma, una utilidad poco conocida

    Hay veces que el brillo del monitor no está correctamente ajustado o la iluminación en la habitación donde está tu ordenador es la inadecuada. Entonces debemos ajustar los mandos de brillo o contraste de tu monitor, por medio de las ruedecitas (antes) o de algún menú interno (ahora). ¡Pero quieto! ¡Un autentico friki no hace eso!, es mejor ajustar el brillo modificando la corrección gamma de tu monitor a través del servidor X (bueno, bueno donde va a parar esta solución es mucho mejor ;p)

  Pues para hacer esto utilizamos el poco conocido comando xgamma, esta es su sintaxis

xgamma [-display display] [-screen screen] [-quiet] [-gamma f.f | [[-rgamma f.f] [-ggamma f.f] [-bgamma f.f]]]

  Prueba a ejecutar

$ xgamma -gamma 2

  Obtendrás una salida como esta

-> Red 1.000, Green 1.000, Blue 1.000
<- Red 2.000, Green 2.000, Blue 2.000

  La primera línea indica los valores antiguos rgb y la segunda los nuevos

  Para volver a la situación inicial

$ xgamma -gamma 1

  Y ya está, puedes modificar los componentes rgb de manera individualizada mediante los parámetros rgamma, ggamma y bgamma. Y cuidado no quemes tu monitor.

Ahora puedes hacer que una combinación específica de teclas o los botones multimedia de tu teclado hagan automáticamente esta tarea. Utilizando por ejemplo LinEAK.

Easter Egg en el APT

    APT es el sistema de actualización/instalación de paquetes para sistemas tipo Debian. APT son las siglas de Advanced Package Tool.

Para ver este ‘Easter Egg’ (huevo de pascua) sigue los siguientes pasos:

Inicia sesión como root (bueno en realidad no se precisa ser root para ver este truco, lo puedes hacer con un usuario normal con shell)

Ejecuta:
# apt-get moo

Verás esta obra de arte ASCII

         (__)
         (oo)
   /------\/
  / |    ||
 *  /\---/\
    ~~   ~~
...."Have you mooed today?"...

XD es buenisimo

Prueba ahora a ejecutar

#apt-get

Sin ningún parametro aparece un listado de ayuda con todas las opciones disponibles para el comando apt-get, pero en su última linea a modo de firma se puede leer

This APT has Super Cow Powers

(Este APT tiene Super Poderes Vacunos)

XDDDDDD

Memoria compartida bajo Linux

    La memoria compartida es otro de los métodos utilizados para la comunicación entre procesos (IPC) en donde 2 o más procesos comparten un segmento de memoria. Básicamente existen 2 tipos diferentes disponibles en la mayoría de sistemas GNU/Linux. Los nombres de estas implementaciones son System V IPC y BSD mmap.

La utilización de memoria compartida en ambos sistemas involucra lo siguiente:

La asignación de un nombre único para el segmento
, de manera que otras aplicaciones puedan acceder a él. Al mismo tiempo contienen métodos para producir segmentos anónimos o privados.

Especificación de los permisos de acceso, siguiendo el esquema lectura/escritura/ejecución

Condiciones de carrera (Race conditions), métodos para tratar de evitar estas situaciones.