Algo de Linux

viernes, 4 de septiembre de 2015

Instalación fácil de impresoras HP en Debian utilizando hp-setup

Es muy sencillo instalar impresoras HP en Debian si utilizamos la herramienta hp-setup, que viene en el paquete hplip

Si no habéis instalado anteriormente en vuestro sistema el paquete hplip, no tenéis más que instalarlo desde los repositorios:
# apt-get install hplip

Una vez instalado, ejecutáis la herramienta:


Y se os abrirá la aplicación:


Como podéis observar, esta herramienta nos va a permitir instalar impresoras USB, inalámbricas y de puerto paralelo simplemente siguiendo el asistente.

A modo de ejemplo, vamos a ver cómo instalar una impresora de puerto paralelo. Así que seleccionamos la última opción (Parallel Port (LPT)):

A continuación pulsamos el botón "Next". Como podéis ver en la siguiente imagen, he conectado una impresora HP LaserJet 6L al puerto paralelo de mi ordenador y me la ha detectado:


Si no la detectara, comprobamos las conexiones y pulsamos el botón "Refresh". Una vez detectada, hacemos clic el botón "Next". El asistente nos mostrará el nombre que le da a la impresora. Si queréis, podéis cambiarlo y rellenar los campos Descripción y Localización. Además, podéis cambiar el driver a utilizar:


Una vez completada la configuración, hacemos clic en el botón "Add Printer" y habremos terminado de configura nuestra impresora.

Si queréis ver si vuestra impresora está soportada por HPLIP, no tenéis más que consultar la siguiente página:
http://hplipopensource.com/hplip-web/supported_devices/index.html



Publicado por primera vez en http://enavas.blogspot.com.es

viernes, 7 de agosto de 2015

sed: Reemplazar valores de variables en un archivo

En ocasiones, cuando trabajamos con scripts, nos interesa asignar valores a variables en archivos de configuración, reemplazando los valores que ya hubiera definidos. Esto es algo que podemos hacer fácilmente utilizando el comando sed. Así que vamos a verlo con un ejemplo.

Supongamos que queremos asignar valores a las variables definidas en el archivo /etc/wicd/wired-settings.conf:
[wired-default]
ip = None         
broadcast = None          
netmask = None
gateway = None
search_domain = None
dns_domain = None
dns1 = None
dns2 = None
dns3 = None
beforescript = None
afterscript = None
predisconnectscript = None
postdisconnectscript = None
encryption_enabled = None
default = True
dhcphostname = debian
lastused = True
Como podéis observar, en este archivo se separa cada variable de su valor mediante espacios y un símbolo =
Así que, para asegurarnos de que estamos sustituyendo exactamente lo que queremos, utilizaremos una expresión regular que identifique esta estructura.

Siguiendo con el ejemplo, supongamos que en el fichero anterior queremos sustituir el valor de la variable "ip" y el valor de la variable "gateway". Podríamos hacerlo fácilmente utilizando el siguiente script en el que empleamos sed:
#!/bin/bash
myip="172.19.144.12"
gatewayip="172.19.144.1"
sed -i "s|ip\ \=\ .*|ip = $myip|" wired-settings.conf 
sed -i "s|gateway\ \=\ .*|gateway = $gatewayip|" wired-settings.conf 
Como el quid de la cuestión está en el comando sed, vamos a analizar la estructura del primer comando sed, puesto que el segundo es exactamente igual:
sed -i "s|ip\ \=\ .*|ip = $myip|" wired-settings.conf 
Le estamos diciendo a sed que reemplace el patrón de búsqueda "ip\ \=\ .*" por la expresión "ip = $myip" y que lo haga inline, es decir, directamente en el archivo de configuración wired-settings.conf

El patrón "ip\ \=\ .*" 'buscará' una expresión de la forma "ip = loquesea".

Al ejecutar el comando, el patrón de búsqueda será sustituido por otra expresión "ip = $myip" en la que estamos insertando el valor de una variable, que en este caso es $myip.

De este modo,  podríamos ir sustituyendo todas las variables que queramos.

En otros ficheros de configuración, las variables se definen sin espacios antes y después del símbolo "=" y los valores van entrecomillados. En ese caso, tan sólo tenemos que quitar los espacios que he introducido a propósito en el patrón de búsqueda y añadir las comillas. Veámoslo con otro otro ejemplo:
#!/bin/bash
idiomateclado="es_ES.UTF-8"
sed -i "s|LANG=.*|LANG=\"$idiomateclado\"|" /etc/default/locale
Publicado por primera vez en http://enavas.blogspot.com.es

jueves, 25 de junio de 2015

Debian Jessie con cinnamon

En un post anterior os mostré cómo instalar cinnamon en una Debian Jessie ya instalada. Instalarlo desde el DVD es trivial porque tan sólo tendréis que elegir el escritorio que queréis usar en una lista:
  • Gnome 3.14 
  • KDE 4.11 
  • Xfce 4.10 
  • LXDE 
  • Cinnamon 
  • Mate 
Para máquinas antiguas con recursos muy limitados sería conveniente usar Xfce o LXDE, pero si tenemos un equipo actual con un hardware más o menos reciente y ram, me gusta mucho Debian Jessie con cinnamon. No quiero hacer especificaciones concretas porque todo es muy relativo, pero os puedo decir que en un amd de 64 bits con 2 gb de ram me funciona muy bien. Ahora lo he subido a 8 gb porque necesito ram para trabajar con máquinas virtuales, pero para un uso habitual del escritorio con 2 gb me era más que suficiente.

Os muestro una imagen de mi escritorio con el menú de aplicaciones abierto:


Para los que usamos mucho más el teclado que el ratón, es bastante cómodo abrir el menú pulsando una tecla y comenzar a escribir el nombre de una aplicación para lanzarla inmediatamente pulsando enter.

Además en cinnamon se puede cambiar muy fácilmente el aspecto del escritorio añadiendo extensiones, desklets y applets, algo de agradecer después de lo complicado que nos ha sido hacer esto mismo en Debian Wheezy con gnome-fallback.



Otra cosa que me ha sorprendido gratamente de Debian Jessie ha sido el tiempo de arranque y apagado del sistema operativo, éste último prácticamente instantáneo.

Ahora bien, ¿seguiremos utilizando Debian en educación? ¿O cambiaremos a Ubuntu+Windows como alguien ya ha decidido sin estudiar debidamente el tema y consultarlo con los administradores?
Publicado por primera vez en http://enavas.blogspot.com.es

jueves, 18 de junio de 2015

sed: Insertar una línea después de un patrón determinado

En un post anterior mostrábamos un ejemplo en el que insertábamos una línea antes de un patrón determinado en el fichero /etc/rc.local para añadir la llamada a un script que debe ejecutarse en un momento determinado.

En este post, vamos a mostrar como insertar la llamada a un script en el fichero /etc/rc.local después de un patrón determinado:
# sed -i '/# By default this script does nothing./a \/usr\/local\/bin\/ConectaWifi' /etc/rc.local

Si os dáis cuenta, lo que estoy haciendo es insertar la llamada al script utilizando el parámetro /a para insertar justo después del último comentario que viene por defecto en el fichero. Con ésto consigo que la llamada al script se realice antes que cualquier otro script.
Publicado por primera vez en http://enavas.blogspot.com.es

miércoles, 17 de junio de 2015

Obtener las direcciones MAC de las tarjetas inalámbricas de portátiles usando el inventario de puppet

Vamos a ver un ejemplo de combinación de comandos para obtener las direcciones MAC de las tarjetas inalámbricas de portátiles usando el inventario de puppet y de paso, utilizamos el comando sed como explicamos en el post anterior para quitar las comillas entre las que viene la dirección MAC. 

Para empezar, debemos saber que el servidor puppet guarda un inventario de los facts con un fichero por máquina en el directorio /var/lib/puppet/yaml/facts/.

Si hacéis un ls, podréis comprobarlo:
# ls /var/lib/puppet/yaml/facts/
Con ésto, obtendréis un listado de todos los ficheros de inventario de cada equipo. Los nombres de estos ficheros tendrán la siguiente forma:

nombre.dominio.yaml 

En mi centro tengo nombrados los portátiles de alumnos de la misma manera que nombramos terminales: a01-o01, a01-o02, etc... De este modo, si quiero listar los ficheros de portátiles del aula a01, no tengo más que ejecutar el comando de forma que liste tan sólo los archivos que comienzan por "a01-":
# ls /var/lib/puppet/yaml/facts/a01-*
Bien. Si ahora combinamos nuestro comando con un grep que busque dentro de cada fichero la cadena "macaddress_wlan0":
# ls /var/lib/puppet/yaml/facts/a01-* | xargs grep "macaddress_wlan0"
Obtendremos un listado con el nombre de cada fichero y la MAC:
a01-o01.valledeljerte3.yaml:    macaddress_wlan0: "74:2f:68:94:3c:5b"
a01-o02.valledeljerte3.yaml:    macaddress_wlan0: "74:2f:68:94:3b:0f"
a01-o03.valledeljerte3.yaml:    macaddress_wlan0: "74:2f:68:94:39:2f"
a01-o04.valledeljerte3.yaml:    macaddress_wlan0: "74:2f:68:94:3e:cb"
a01-o05.valledeljerte3.yaml:    macaddress_wlan0: "74:2f:68:94:2c:2d"
a01-o06.valledeljerte3.yaml:    macaddress_wlan0: "74:2f:68:94:2b:e0"
a01-o07.valledeljerte3.yaml:    macaddress_wlan0: "74:2f:68:94:43:97"
a01-o08.valledeljerte3.yaml:    macaddress_wlan0: "74:2f:68:94:1e:4f"
a01-o09.valledeljerte3.yaml:    macaddress_wlan0: "74:2f:68:94:1c:e2"
a01-o10.valledeljerte3.yaml:    macaddress_wlan0: "74:2f:68:94:37:37"
a01-o11.valledeljerte3.yaml:    macaddress_wlan0: "74:2f:68:94:2b:93"
a01-o12.valledeljerte3.yaml:    macaddress_wlan0: "74:2f:68:94:37:b7"
a01-o13.valledeljerte3.yaml:    macaddress_wlan0: "74:2f:68:94:3b:9a"
a01-o14.valledeljerte3.yaml:    macaddress_wlan0: "74:2f:68:94:38:41"
a01-o15.valledeljerte3.yaml:    macaddress_wlan0: "74:2f:68:94:29:6c"
a01-o16.valledeljerte3.yaml:    macaddress_wlan0: "74:2f:68:94:21:34"
a01-o17.valledeljerte3.yaml:    macaddress_wlan0: "74:2f:68:94:46:69"
a01-o18.valledeljerte3.yaml:    macaddress_wlan0: "74:2f:68:94:21:9f"
a01-o19.valledeljerte3.yaml:    macaddress_wlan0: "74:2f:68:94:3b:01"
a01-o20.valledeljerte3.yaml:    macaddress_wlan0: "74:2f:68:94:1e:42"
Como lo que me interesa del listado anterior es quedarme tan sólo con la dirección MAC, puedo hacer lo siguiente:
# ls /var/lib/puppet/yaml/facts/a01-* | xargs grep "macaddress_wlan0" | awk '{print $3}'
Con lo que me quedaría tan sólo con las direcciones MAC:
"74:2f:68:94:3c:5b"
"74:2f:68:94:3b:0f"
"74:2f:68:94:39:2f"
"74:2f:68:94:3e:cb"
"74:2f:68:94:2c:2d"
"74:2f:68:94:2b:e0"
"74:2f:68:94:43:97"
"74:2f:68:94:1e:4f"
"74:2f:68:94:1c:e2"
"74:2f:68:94:37:37"
"74:2f:68:94:2b:93"
"74:2f:68:94:37:b7"
"74:2f:68:94:3b:9a"
"74:2f:68:94:38:41"
"74:2f:68:94:29:6c"
"74:2f:68:94:21:34"
"74:2f:68:94:46:69"
"74:2f:68:94:21:9f"
"74:2f:68:94:3b:01"
"74:2f:68:94:1e:42"
Si os dáis cuenta, tan sólo hay un pequeño problemilla fácil de resolver: Que las direcciones MAC se encuentran entre comillas. Para quitarlas, tan sólo tenemos que aplicar el comando sed como os mostré en el post anterior:
# ls /var/lib/puppet/yaml/facts/a01-* | xargs grep "macaddress_wlan0"| awk '{print $3}' | sed 's/^.\|.$//g'
Y listo. Ya tenemos lo que queríamos: El listado de direcciones MAC de los portátiles del aula a01:
74:2f:68:94:3c:5b
74:2f:68:94:3b:0f
74:2f:68:94:39:2f
74:2f:68:94:3e:cb
74:2f:68:94:2c:2d
74:2f:68:94:2b:e0
74:2f:68:94:43:97
74:2f:68:94:1e:4f
74:2f:68:94:1c:e2
74:2f:68:94:37:37
74:2f:68:94:2b:93
74:2f:68:94:37:b7
74:2f:68:94:3b:9a
74:2f:68:94:38:41
74:2f:68:94:29:6c
74:2f:68:94:21:34
74:2f:68:94:46:69
74:2f:68:94:21:9f
74:2f:68:94:3b:01
74:2f:68:94:1e:42
Una vez visto ésto, es muy fácil retocar la combinación de comandos para obtener cualquier otro dato de los equipos.
Publicado por primera vez en http://enavas.blogspot.com.es

sed: Eliminar caracteres al principio y al final de una línea

Supongamos que queremos eliminar el primer caracter de una expresión o cada línea de un archivo, sea cual sea. Podemos hacerlo fácilmente utilizando sed:
sed 's/^.//g'
Ahora bien, si lo que queremos es eliminar el último caracter de una expresión o cada línea de un archivo, utilizaríamos sed de la siguiente manera:
sed 's/.$//g'
Y si lo que queremos es eliminar tanto el primer como el último caracter de cada línea:
sed 's/^.\|.$//g'
Este último caso lo he utilizado para quitar las comillas de uno de los campos de un fichero.
Publicado por primera vez en http://enavas.blogspot.com.es

martes, 16 de junio de 2015

Copiar ficheros de configuración a /etc/skel y replicar en directorios home mediante puppet

Es interesante poder añadir ficheros de configuración para nuevos usuarios mediante puppet en /etc/skel, para que cuando se cree un nuevo usuario, se le apliquen las nuevas configuraciones, pero tan importante como ésto es aplicar también las nuevas configuraciones a los usuarios ya creados.

Del mismo modo que en el post anterior, la parte de añadir ficheros de configuración en /etc/skel es trivial:
file { "/etc/skel/.config/plank/dock1/settings":
       source => "puppet:///puppet-plank-sync-portatiles/settings",
       owner => root, group => root, mode => 644,
}
Lo que no resulta tan trivial es colocar la misma configuración en los directorios home de los usuarios. No obstante, si utilizamos el comando find en un recurso exec y lo relacionamos con el recurso file, la cosa no resulta tan complicada:
file { "/etc/skel/.config/plank/dock1/settings":
       source => "puppet:///puppet-plank-sync-portatiles/settings",
       owner => root, group => root, mode => 644,
       notify => Exec['sincroniza-ajustes-plank-user']
}

exec { 'sincroniza-ajustes-plank-user':
       command => '/usr/bin/find /home/ -type d -path "*.config/plank/dock1" -exec cp /etc/skel/.config/plank/dock1/settings {} \;',
       subscribe => File ['/etc/skel/.config/plank/dock1/settings'],
       refreshonly => true
}
De este modo, estamos colocando el fichero settings en el directorio /etc/skel/.config/plank/dock1, y, siempre que se modifique, lo copiamos a los directorios home de los usuarios.
Publicado por primera vez en http://enavas.blogspot.com.es