Archivo de la etiqueta: script

Autotexto en GNU/Linux (III)

En los dos anteriores artículos vimos cómo mejorar nuestra productividad a la hora de escribir textos repetitivos.

El primer método lo hacía con combinaciones de teclas. El segundo mejoraba éste ya que simplemente poniendo una sencilla abreviatura, ésta se expandía al texto que queríamos mostrar. Sin embargo, este último método era válido sólo para el editor emacs. En este artículo vamos a ver cómo hacer esto último pero ya siendo válido para cualquier aplicación de GNU/Linux que usemos.

Existe una aplicación fantástica en Linux que permite hace estas cosas de forma muy sencilla llamada Autokey.

En la propia web oficial del proyecto podéis ver cómo instalarlo desde repositorios para Debian/Ubuntu.

En mi caso (openSUSE 13.1) me he descargado los fuentes y lo he instalado así:

python setup.py install

Hay que ejecutarlo como root (o usar sudo) para que puedan copiarse los ejecutables en los directorios correspondientes.

Para ejecutarlo tenéis dos posibilidades: autokey-gtk y atuokey-qt. Como yo uso KDE he optado por la segunda opción. Para que ésta funcione hay que instalar las siguientes dependencias:

python-xlib
python-pyinotify
python-qscintilla

Para la de gtk no he probado así que no os puedo decir qué dependencias tiene exactamente. Al final, es lo mismo, porque simplemente se trata de un interfaz (gtk o bien qt) que usan la misma configuraicón (almacenada en $HOME/.config/autokey).

En esta interfaz podéis definir los textos e incluso ejecutar scripts. Por ejemplo, además de textos «estáticos» podéis hacer que cuando pulséis una abreviatura se inserte la hora actual. Tenéis ya definidos algunos ejemplos que os valdrán para probar la aplicación. Crear vuestras propias frases es bien sencillo:

  1. Pulsamos en File–> New –> Phrase (*)
  2. En el cuadro de texto escribís la frase que os interesa (puede ser una frase, un párrafo -con intros-… lo que queráis)
  3. Luego pulsáis en la parte inferior donde «Abbreviations», en concreto, en el botón de la derecha llamado «set». Ahí se os abre una ventanita para meter las distintas abreviaturas que queréis que «disparen» el texto.

Es muy completa la aplicación. Entre otras cosas, podéis:

  • Insertar un párrafo usando distintas abreviaturas
  • Especificar si queréis que haya que pulsar espacio tras la abreviatura o no
  • Ignorar mayúsculs/minúsculas a la hora de escribir las abreviaturas
  • Asignar combinaciones de teclas
  • Restringir la abreviatura para que sólo funcione en ciertas aplicaciones (opción «Window filter»)
  • Lo mejor: podéis crear scripts en python para hacer cualquier cosa que queráis que se inserte automáticamente. En la aplicación vienen varios ejemplos, pero las posibilidades son infinitas.

Esto último (creación de scripts) es una parte muy potente que os permitirá conseguir casi cualquier dato para insertarlo en vuestros documentos. Por ejemplo, esto sería para introducir la fecha (viene por defecto ya definida en los scripts de python):

output = system.exec_command("date")
keyboard.send_keys(output)

De esta forma, se puede ejecutar cualquier comando que queráis. Por ejemplo:

output = system.exec_command("ls $HOME")
keyboard.send_keys(output)

Obviamente, el script puede ser tan complejo como queráis. Se pueden hacer cosas interesantes como ésta (viene en los ejemplos de la aplicación):

choices = ["This is the option 1", "This is the option 2", "This is the option 3"]

retCode, choice = dialog.list_menu(choices)
if retCode == 0:
   keyboard.send_keys("You chose " + choice)

En este caso, se muestra una lista donde podemos elegir la frase a insertar. Podéis modificarla y personalizarla con tantas opciones como queráis.

Aquí os dejo una captura de pantalla (usando la interfaz Qt):

Autokey

Autokey

Es una de las aplicaciones más útiles para GNU/Linux que he encontrado desde que lo uso (hace casi 15 años, allá por el 99 con RedHat Linux 6 -cuando aún no era Enterprise, ni existía Fedora, ni mucho menos Ubuntu…-).

Si sois desarrolladores podéis usarla para insertar code snippets, es decir, trozos de código que repetitivo que siempre tenéis que estar tecleando cada vez (por ejemplo, los includes típicos de una aplicación, la plantilla para empezar una función en un lenguaje determinado, definición de clases, …).

Si queréis más info, además de la web oficial (donde hay una wiki con ejemplos, manuales, FAQ…), os recomiendo que echéis un vistazo aquí, donde tenéis una descripción muy completa de la aplicación.

NOTA: en las primeras pruebas he detectado que si metéis un espacio en una abreviatura al programa no le sienta muy bien, así que cuando pongáis una abreviatura tecleadla y seguidamente pulsad intro. Ya está ;-).

 

(*) Sí, el programa está entero en inglés, pero es bastante intuitivo.

Ejecutando comandos como root dentro de un script

A veces, dentro de un script, se necesita ejecutar un comando como superusuario. Una posibilidad es usando el comando sudo, por ejemplo:

sudo ls /root

Si lo ejecutáis sin el sudo (es decir, como vuestro usuario normal del sistema) no os va a dejar porque no tenéis permiso para ver el contenido del directorio /root. Si lo ejecutáis con sudo sí que podréis. Eso sí, os pide vuestro password -para comprobar que no es cualquiera que se ha sentado un momento en vuestro PC y os quiere fastidiar el equipo-.

Para que esto funcione, vuestro usuario tiene que tener permisos de sudo. Esto se hace automáticamente para el usuario que se define en la instalación de sistemas operativos como Ubuntu y derivados.

En cualquier caso, aquí tenéis más información sobre sudo y cómo configurarlo para un usuario.

Así, si en un script necesitáis ejecutar algo con permisos de root podéis usar sudo. Ahora bien, tended en cuenta que os va a pedir el password, por lo que no podéis lanzarlo y marcharos, ya que se quedará esperando que pongáis el password de vuestro usuario. Imaginad que lanzáis un script que hace mogollón de cosas -en las que tarda un tiempo- y luego, al rato, en uno de los comandos que hay en el script, usa sudo para ejecutarse como root. Tendréis que estar sentados todo el rato hasta que os la pida.

Para salvar esto podéis usar la opción -S, que permite que se le pase el password en la línea de comandos. Se usaría así:

echo PASSWORD | sudo -S ls /root

Evidentemente, el comando que ejecutaréis en el sudo, normalmente será algo más complicado que éste ;-P (y más útil).

Por tanto, con sudo -S podemos, bien pedir el password al principio del script (con read) o bien cogerlo de algún sitio. En este último caso hay que tener presente que el password estaría almacenado en claro en ese «sitio», por lo que conviene que tenga permisos de lectura sólo para el propio usuairo (algo como «chmod 600 fichero«, por ejemplo).

Espero que os resulte útil.

Hacer copias de seguridad usando gmail II

En el anterior artículo vimos que podemos exprimir un poco más nuestra cuenta de correo en la nube (gmail en este caso) y aprovechar los muchos megas que nos ofrecen gratis para salvaguardar no sólo mails sino también archivos.

Ahora vamos un paso más allá para agilizar este proceso. Con lo visto hasta ahora, si queremos hacer un backup de un archivo usando gmail tenenos que abrir gmail en el navegador, darle a «Redactar», crear el mensaje, rellenarlo, incluir el adjunto y enviar… Esto es sencillo pero lo cierto es que nos quita tiempo, ese recurso tan importante y escaso. Podemos hacerlo más rápido con un script. Veamos cómo.

En un artículo anterior vimos cómo enviar mails desde nuestra cuenta de gmail usando la línea de comandos. Vamos a hacer uso de esto para agilizar la copia de seguridad de archivos. Os muestro un ejemplo de script que realizaría esta tarea:

#!/bin/bash

echo -n "Subject: "
read SUBJECT
SUBJECT="-backup- $SUBJECT"

echo -n "Body: "
read BODY

echo -n "Enviando mail..."
echo $SUBJECT > /tmp/subject
echo $BODY > /tmp/body
/usr/local/bin/send_gmail /tmp/subject /tmp/body $1
echo "OK"

Este script hace uso del script que vimos en dicho artículo (send_gmai), script que hemos dejado en /usr/local/bin para poder ejecutarlo desde la línea de comandos de forma habitual sin necesidad de incluir la ruta (aunque en el script de arriba sí que lo hacemos para asegurarnos de que funciona siempre independientemente del valor de la variable de entorno PATH).

Lo que hace es pedirnos el subject y meterle luego la cadena -backup- para que no tengamos de preocuparnos de meterla nosotros manualmente. Esta palabra es la que, como dijimos en el artículo anterior, usamos para hacer el filtro. Podríamos crearnos distintos scripts para distintos tipos de backups si quisiéramos y cambiar aquí -backup- por otra cosa en cada uno. Posibilidades hay mil.

También nos pide el cuerpo del mensaje. Si no lo necesitáis podéis obviar esto y meter siempre algo como «backup» y váis más rápidos.

Para finalizar, llama al script send_gmail, el cuál envía el correo electrónico con el adjunto que pasamos como único parámetro al script en cuestión, el cuál llamaremos, por ejemplo, backup_file. Así pues, suponiendo que queremos hacer un backup de un archivo llamado proyecto.odt que tenemos en el directorio actual, lo llamaríamos así:

backup_file proyecto.odt

Como digo, las posibilidades son muchas. Podéis automatizar el backup de un directorio entero, por ejemplo. Podéis añadir también automáticamente la fecha en el subject o el cuerpo del mensaje para tenerlo mejor clasificado (aunque esto ya se ve en la fecha y hora del propio mail). Podéis quitar los read y meter algo estático y luego meter el script en el crontab para que haga backup de cierto archivo o directorio cada hora, por ejemplo…

Alguien dirá que para esto ya está Dropbox, Google Drive, etc. Sí, pero a mí me gusta usar este método también porque estos archivos de backup son versiones de un fichero y, una vez finalizado, ya no las necesitaré aunque no viene de más tenerlas en una especie de cajón desastre que puedo consultar el día de mañana. Digamos que no quiero ver esos ficheros «temporales» en mis directorios de Dropbox ni GDrive, sino que prefiero almacenarlos en algún lugar que, aunque seguro, es menos accesible (*), porque además, el hecho de tener muchas versiones de un archivo en un directorio y no tener un control luego puede ser un caos.

(*) Lo cuál es cómodo desde un punto de vista organizativo.

Ejecutar scripts al inicio de Linux

A veces es interesante que al arrancar nuestro equipo se ejecuten ciertos scripts.

Si tenemos una distro Ubuntu o basada en ella, podemos usar /etc/rc.local, es decir, meter la llamada a dicho script dentro de este fichero (antes del «exit 0», lógicamente).

Sin embargo, desde que Ubuntu usa Upstart como sistema de arranque no tengo claro que sea una buena forma de iniciar los scripts ya que es posible que no se ejecute correctamente si depende de otros servicios, como podría ser el de red. En otras palabras, que puede que metas un script que haga algo como enviar un mail (en otro artículo veremos este caso) pero que no esté iniciado el servicio de red y no se ejecute. A mí me ha pasado.

Por eso, para estos casos recomiendo que metáis el script dentro de /etc/network/if-up.d. Los scripts que se encuentren en dicho directorio se ejecutarán sí o sí cuando el servicio de red esté operativo.

En openSUSE el directorio es /etc/sysconfig/network/if-up.d.

OJO: los scripts deben ser ejecutables (algo lógico) y no pueden tener extensión, es decir, si tenéis algo como enviar_mail.sh cambiadlo a enviar_mail (me costó un rato de «googleo» para descubrirlo).

En otro artículo veremos cómo enviar precisamente un mail desde un script (usando nuestra cuenta de gmail) para notificarnos cualquier cosa.

Yo, en particular, tengo un script que me envía un mail cada vez que enciendo el PC de casa para saber que está encendido. ¿Para qué me puede servir? Por ejemplo: para saber que el PC está ya operativo tras haberlo encendido remotamente (más info aquí) 😉