# rm-rf.es | Administración de sistemas

Bitácora personal de un SysAdmin Gnu/Linux, Windows, BSD...

Laboratorios online de Alteon, Cisco, Juniper…

De casualidad me he encontrado con un sitio web que ofrece una serie de laboratorios Online extremadamente útiles e interesantes si necesitamos hacer pruebas con estos dispositivos de red y no disponemos de uno. En Sharontools permiten la conexión directa a todos estos dispositivos:

  • 2 Cisco nexus1000v-3 4.2(1)
  • 4 Cisco 7200
  • 2 Cisco 3640
  • 3 Juniper Router 10.4R1.9
  • Linux debian64 6.0.6
  • Alteon 27.0.0.0

Esta es la topología de red que os encontraréis, los dispositivos se resetean cada 24 horas así que se puede hacer lo que se desee con ellos, la conexión es gratuita a todos los dispositivos ;)

SharonTools network LAB

yum-autoupdate activado en Scientific Linux 6 por defecto

Para quienes no lo sepan (yo no lo sabía), Scientific Linux 6 trae activado por defecto yum-autoupdate para instalar regularmente y de forma automatizada actualizaciones de sistema. Por defecto, toda la configuración se establece en el fichero de configuración /etc/sysconfig/yum-autoupdate.

Si queremos desactivarlo, podemos simplemente desinstalarlo o deshabilitarlo desde dicho fichero. Para ello marcamos la variable ENABLED como false:

ENABLED=false

Si queremos tenerlo activo pero necesitamos bloquear la actualización de ciertos paquetes, podemos hacerlo modificando la variable EXCLUDE, la cual ya debería estar excluyendo paquetes críticos como el kernel:

EXCLUDE="kernel*"

Concatenar líneas con Perl

Os dejo un comando rápido por si necesitáis concatenar líneas de un fichero con Perl. Se puede hacer con sed o awk pero este método es sencillo y funciona bien:

perl -pe 'chomp;$i++;unless($i%2){$_.="\n"};' <fichero>

En este caso concatena cada dos líneas del fichero, podemos cambiar ese parámetro donde véis ($i%2), simplemente especificad otro número y lo utilizará para la concatenación, vamos a ver un ejemplo:

foo.txt:

1 
2 
3 
4  
5

Vamos a concatenar cada dos líneas:

$ perl -pe 'chomp;$i++;unless($i%2){$_.="\n"};' foo.txt 
1 2 
3 4 
5

Y si cambiamos el parámetro a 3:

$ perl -pe 'chomp;$i++;unless($i%3){$_.="\n"};' foo.txt 
1 2 3 
4 5

Si revisáis bien el comando veréis que también podéis modificar el comportamiento para que en lugar de un salto de línea ({$_.=”\n”}) utilice otro delimitador, como tabulación por ejemplo ({$_.=”\t”}:

$ perl -pe 'chomp;$i++;unless($i%3){$_.="\t"};' foo.txt 
1 2 3 	4 5

OpenDJ: deshabilitar Schema Checking para importar datos

Si estamos importando datos a OpenDJ desde otro servicio de directorio es muy probable que nos encontremos con problemas a la hora de hacerlo (véase esta entrada por ejemplo: OpenDJ, import-ldif y PosixGroup: All entries must contain a structural objectclass). Por defecto, OpenDJ revisa la sintaxis de los atributos, la validación contra las definiciones de schema y estándares LDAP y que la utilización de object classes sea la correcta. Por ejemplo, en el caso anterior no podíamos importar los datos por no disponer de una structural objectclass, pasaría lo mismo si hay múltiples structural objectclass definidas por entrada.

En estos casos, si no tenemos tiempo para revisar la estructura del ldif o de importar los schemas del antiguo servidor LDAP a OpenDJ, podemos “relajar” estos chequeos o deshabilitarlos para evitar tener problemas con la importación. Lo recomendable es no hacerlo, pero si estamos haciendo pruebas o no es un servidor LDAP productivo podemos hacerlo para ahorrarnos un tiempo valioso.

Entrando en materia, hay tres posibilidades. Lo primero es si queremos deshabilitar la comprobación y schema checking cuando tenemos múltiples structural object classes por entrada. Todas estas opciones las podemos cambiar con el comando dsconfig de OpenDJ. En este caso configuramos como “warn” para que nos indique estos problemas pero no afecte al import del LDIF:

# dsconfig \
 set-global-configuration-prop \
 --hostname ldap-server \
 --port 4444 \
 --bindDN "cn=Directory Manager"
 --bindPassword mypassword \
 --set single-structural-objectclass-behavior:warn \
 --trustAll \
 --no-prompt \

También podemos deshabilitar el chequeo de sintaxis de los valores de los atributos:

# dsconfig \
 set-global-configuration-prop \
 --hostname ldap-server \
 --port 4444 \
 --bindDN "cn=Directory Manager"
 --bindPassword mypassword \
 --set invalid-attribute-syntax-behavior:warn \
 --trustAll \
 --no-prompt \

Y finalmente podemos desactivar completamente el schema checking:

# dsconfig \
 set-global-configuration-prop \
 --hostname ldap-server \
 --port 4444 \
 --bindDN "cn=Directory Manager"
 --bindPassword mypassword \
 --set check-schema:false \
 --trustAll \
 --no-prompt \

Poner un proceso en segundo plano y desasociarlo de la shell

La situación es la siguiente, tenemos una shell bash ejecutando un proceso cuyo tiempo de ejecución va a ser muy largo y necesitamos cerrar la shell, por supuesto no podemos parar el proceso y arrancarlo de nuevo. Para solucionar este problema podemos hacer uso de los comandos bg (recordad el artículo sobre gestión de trabajos en BASH (jobs, fg, bg, &… que escribí hace un tiempo) y disown.

Por ejemplo, tenemos este comando en ejecución que simplemente escribe algo en un fichero de texto cada dos segundos. Lo tenemos en primer plano (fg):

Nota: los paréntesis son porque ejecuto una sub-shell para que interprete todos los comandos (separados por “;” como un único comando.

$ (while true; do echo "prueba - `date`" >> test.txt; sleep 2; done)

Puedo ver que efectivamente escribe cada dos segundos ejecutando un tail al fichero:

$ tail -f test.txt 
prueba - Thu Apr 11 21:11:56 CEST 2013
prueba - Thu Apr 11 21:11:58 CEST 2013
prueba - Thu Apr 11 21:12:00 CEST 2013
prueba - Thu Apr 11 21:12:02 CEST 2013
prueba - Thu Apr 11 21:12:04 CEST 2013

Ahora le vamos a mandar una señal SIGSTOP al proceso. Esto lo detendrá temporalmente. Para ello usamos Ctrl + z “^z”. En la misma shell de bash desde la que lo hemos parado vemos con el comando jobs que el proceso está parado:

$ jobs
[1]+  Stopped                 ( while true; do
    echo "prueba - `date`" >> test.txt; sleep 2;
done )

Ahora lo vamos a pasar a segundo plano (background) con el comando bg:

$ bg
[1]+ ( while true; do
    echo "prueba - `date`" >> test.txt; sleep 2;
done ) &

Y automáticamente el proceso seguirá funcionando, pero ahora ya en segundo plano:

$ tail -f test.txt
prueba - Thu Apr 11 21:17:34 CEST 2013
prueba - Thu Apr 11 21:17:36 CEST 2013
prueba - Thu Apr 11 21:17:38 CEST 2013
prueba - Thu Apr 11 21:17:40 CEST 2013
prueba - Thu Apr 11 21:17:42 CEST 2013

Finalmente ejecutamos el comando disown para desasociar el comando a la shell en la que nos encontramos, ya podremos entonces cerrar con tranquilidad la terminal. Básicamente lo que hace este comando es evitar que se mande una señal SIGHUP al proceso cuando cerramos la shell:

$ disown

Pseudo-terminal will not be allocated because stdin is not a terminal

Este error se nos puede presentar cuando tratamos de ejecutar comandos ssh de forma desatendida, por ejemplo en scripts, crontab o a través de nohup/segundo plano.

En mi caso efectivamente era por ejecutar un tunel SSH con nohup y en background. Al intentar ejecutarlo recibía el siguiente error:

Pseudo-terminal will not be allocated because stdin is not a terminal.

La solución es sencilla, tenemos que indicar al comando SSH que lo queremos ejecutar sin tty, para ello le pasamos los parámetros “-t -t”:

$ ssh -t -t foo@bar -L 123:bar:124

Cuidando la vista con f.lux

Creo que no soy el único que pasa cerca de 11 horas al día frente a la pantalla del ordenador. Nuestro trabajo nos lo exige y además somos “masocas” y al llegar a casa más de lo mismo. Como todos sabemos esto no es bueno para la vista y todo lo que pueda ayudarnos a cuidarla y tener mejores hábitos bienvenido sea.

Ahora mismo estoy probando el software f.lux que está disponible para GNU/Linux, Windows, Mac, iPad/iPhone. Básicamente lo que hace es regular el calor y tono de luz de la pantalla según la hora del día en la que nos encontremos (lo detecta por coordenadas) o según el tipo de iluminación que tengamos en la habitación.

El cambio es progresivo, si estamos muchas horas frente al ordenador no notaremos cambios bruscos de color y brillo sino algo gradual. Yo de momento lo estoy probando a ver si noto algo, según opiniones por Internet sí que se nota y no se fuerza tanto la vista, sobre todo cuando estamos por la noche en el PC.

Para instalarlo con APT:

$ sudo add-apt-repository ppa:kilian/f.lux
$ sudo apt-get update
$ sudo apt-get install fluxgui
f.lux

¿Cómo escapar caracteres dentro de una variable en sed?

Hace un tiempo os expliqué la forma de utilizar variables dentro de sed, ¿pero como hacemos si dentro del contenido de la variable hay caracteres que tienen que ser “escapados”? Por ejemplo:

#!/bin/bash
VARIABLE="/foo/bar/test"
sed "s/${VARIABLE}/foo/" fichero

Si lo ejecutamos:

sed: -e expression #1, char 8: unknown option to `s'

Lo que pasa es que como la variable tiene el carácter “/”, deberíamos escaparlo “\/” para que no interfiriera en la sintaxis de sed. Para no complicarnos la vida, hay una forma más sencilla. Sed permite elegir el delimitador de los parámetros del comando, no tiene que ser “/” sino que puede ser otro (,=…). Para evitar el problema entonces podemos cambiar la ejecución de sed tal que así:

#!/bin/bash
VARIABLE="/foo/bar/test"
sed "s,${VARIABLE},foo," fichero

He elegido la “,” como delimitador de los parámetros, pero podríamos elegir otro, por ejemplo “#”. La idea es utilizar un carácter que no esté dentro de la variable y que no interfiera con los caracteres especiales del comando:

sed "s#${VARIABLE}#foo#" fichero
Ver el perfil de Alejandro García García en LinkedIn