Modo 256 colores para la terminal de Linux Debian

He estado haciendo algunos experimentos con la librería ncurses (pronto habrá más noticias sobre estos experimentos). Mientras experimentaba, noté que algunas de las opciones avanzadas de color de ncurses no estaban disponibles en mi terminal de Linux (LXTerminal). Tras investigar un poco encontré que era necesario que la terminal estuviera en modo de 256 colores mientras que de forma predeterminada LXTerminal estaba en el modo de 8 colores como lo indica el siguiente comando:

monstruosoft@monstruosoft-PC:~$ tput colors
8

Buscando cómo activar el modo de 256 colores, visité varias páginas, todas indicaban que las terminales de Linux en general soportan modo de 256 pero también todas las páginas eran crípticas al respecto de cómo activar ese modo, eso sin mencionar que ningún resultado era específico para Debian.

Era obvio que la solución requería asignar a la variable de entorno TERM el valor xterm-256color. Al final la solución resultó ser justamente esa a pesar de lo crípticas que pudieran resultar las instrucciones en internet que, supongo, se refieren al procedimiento para que al abrir una ventana de terminal ésta inicie en modo de 256 colores. En mi caso, iniciar la terminal en modo de 8 colores y después cambiarme a modo de 256 colores era perfectamente válido.

monstruosoft@monstruosoft-PC:~$ tput colors
8
monstruosoft@monstruosoft-PC:~$ echo $TERM
xterm
monstruosoft@monstruosoft-PC:~$ export TERM=xterm-256color
monstruosoft@monstruosoft-PC:~$ echo $TERM
xterm-256color
monstruosoft@monstruosoft-PC:~$ tput colors
256

Estas simples instrucciones son suficientes para poner la terminal en modo de 256 colores y permite utilizar las opciones de personalización de color de ncurses.

[Nota:] Algunas aplicaciones pueden aprovechar las capacidades de la terminal y usar 256 sin necesidad de hacer el procedimiento anterior pero al menos para ncurses es necesario para poder usar algunas de las opciones avanzadas de color.

Escritorio remoto Linux-Windows

Para hacer la prueba de conectarme con una PC con Windows tenía disponible una vieja PC con Windows XP SP2 pero los pasos deberían ser básicamente los mismos en versiones más recientes de Windows. Antes de continuar es necesario configurar primero la PC con Windows XP para que permita el escritorio remoto. Para hacerlo hay que llevar a cabo algunos pasos:

Read More

Escritorio remoto Linux-Linux

En Linux las conexiones de escritorio remoto usan VNC (Virtual Network Computing) que viene instalado de forma predeterminada prácticamente en todas las distros de Linux, por lo que habilitar la opción de escritorio remoto es tan sencillo como verificar que el servidor de escritorio remoto vncserver esté activado en la PC a la que te quieres conectar remotamente y tener instalado un cliente VNC en la PC que usarás para conectarte al escritorio remoto.

Read More

Desaventuras en la tierra de Linux, parte 8

Hace poco instalé una nueva impresora en mi PC, se trata de una impresora HP LaserJet Pro M402n. Sin imaginarlo, tratar de instalarla revelaría nuevo material para escribir un post más en esta serie de Desaventuras en la que escribo acerca de todos esos detalles que hacen que Linux no sea aún apto para usuarios comunes y corrientes. Por lo regular, es perfectamente comprensible que Linux tenga sus detalles siendo un esfuerzo de colaboración open source realizado por miles de voluntarios dispersos por todo el mundo. Pero a veces me topo con algunos detalles que, desde mi punto de vista, son imperdonables, esos son el tipo de detalles que alimentan esta serie de posts.

Read More

Programar tareas con anacron

Linux cuenta con la utilidad cron para programar tareas. cron puede usarse incluso por usuarios normales (no administradores) mediante el comando crontab. Sin embargo, las tareas programadas con cron requieren que la PC esté encendida las 24 horas, es decir, si una tarea está programada para ejecutarse a las 12:00 a.m. pero la PC no está encendida en ese momento, entonces la tarea no se ejecutará. Para este tipo de casos existe anacron, un comando de Linux que permite programar tareas que se ejecutarán cuando sea posible mientras la PC esté encendida y no necesariamente a una hora específica. Es decir, anacron no funciona para tareas que deben ejecutarse a una hora exacta (para eso debe usarse cron), sino para tareas que deben ejecutarse diariamente, semanalmente o mensualmente independientemente del tiempo que pase encendida la PC (anacron ejecutará las tareas tan pronto como sea posible cuando detecte que éstas deben ejecutarse).

Por razones obvias, anacron es ideal para PCs de escritorio que no están encendidas las 24 horas. Sin embargo, a diferencia de cron, la configuración predeterminada de anacron no puede ser modificada por usuarios normales. Si puedes modificar la configuración como root, entonces no hay mayor problema y puedes usar el archivo predeterminado de anacron localizado en /etc/anacrontab (aunque debes notar que las tareas programadas se ejecutarán también como root). Para usuarios normales también es posible configurar anacron siguiendo algunos pasos descritos a continuación.

Read More

Operaciones aritméticas en la línea de comandos de Linux

Es posible hacer operaciones aritméticas sencillas usando la línea de comandos de Linux que permite hacer operaciones con números enteros usando la forma $((expresión)), como se muestra a continuación:

monstruosoft@monstruosoft-PC:~$ echo $((320 * 240))
76800
monstruosoft@monstruosoft-PC:~$ echo $((320 * 200))
64000
monstruosoft@monstruosoft-PC:~$ MINUTOS=$((60 * 24 * 365))
monstruosoft@monstruosoft-PC:~$ echo $MINUTOS
525600
monstruosoft@monstruosoft-PC:~$ SEGUNDOS=$(($MINUTOS * 60))
monstruosoft@monstruosoft-PC:~$ echo $SEGUNDOS
31536000

Las operaciones de punto flotante no se pueden realizar de esta manera pero pueden hacerse usando el comando bc de la siguiente manera:

monstruosoft@monstruosoft-PC:~$ echo '164.78 * 52.93' 
164.78 * 52.93
monstruosoft@monstruosoft-PC:~$ echo '164.78 * 52.93' | bc
8721.80

Este tipo de instrucciones pueden ser útiles cuando necesitamos hacer operaciones aritméticas en la línea de comandos. Por ejemplo, si tenemos un video y hemos anotado el timestamp del cuadro inicial y final de una escena que queremos recortar, podemos hacerlo con FFmpeg pero los argumentos para recortar un video son el punto de inicio -ss, y la duración a partir de ese punto -t. En este caso podemos usar alguna de las formas descritas anteriormente para hacer operaciones aritméticas para calcular la duración, por ejemplo, de la siguiente manera:

monstruosoft@monstruosoft-PC:~$ INICIO=456.81
monstruosoft@monstruosoft-PC:~$ FIN=1776.39
monstruosoft@monstruosoft-PC:~$ DURACION=$(echo "$FIN - $INICIO" | bc)
monstruosoft@monstruosoft-PC:~$ echo $DURACION
1319.58
monstruosoft@monstruosoft-PC:~$ ffmpeg -i mi_video.avi -ss $INICIO -t $DURACION escena.mp4

Sumas, restas y multiplicaciones son sólo algunas de las operaciones que se pueden realizar con el comando bc. Para más detalles puedes revisar la documentación.

Enviar notificaciones al escritorio

La mayoría de las distros de Linux tienen un conveniente sistema para enviar notificaciones al escritorio usando el paquete libnotify. La forma en que los mensajes son desplegados depende del sistema de notificación instalado en tu distro pero con toda seguridad ya viene uno instalado de forma predeterminada por lo que se puede usar el comando notify-send para enviar notificaciones al escritorio. Esto es útil, por ejemplo, dentro de scripts para notificar al usuario de las acciones que se están realizando. Para enviar una notificación al escritorio sólo tenemos que ejecutar el siguiente comando:

monstruosoft@monstruosoft-PC:~$ notify-send 'Hola mundo!' 'Este es un ejemplo.' --icon=dialog-information

Para enviar una notificación que desaparezca automáticamente después de unos segundos, se puede usar la opción transient:

monstruosoft@monstruosoft-PC:~$ notify-send 'Hola mundo!' 'Este es un ejemplo.' --icon=dialog-information --hint=int:transient:1

Para más información sobre el tipo de notificaciones que se pueden usar, no olvides leer la documentación de notify-send.

Generar imagen ISO

Aunque el uso de CDs y DVDs es cada vez más escaso, generar una imagen ISO a partir de archivos o carpetas en nuestro disco duro puede ser de utilidad, por ejemplo, para montar la imagen en una máquina virtual o quemarla para llevar los archivos a otra PC cuando no hay puertos USB disponibles. En Linux, se puede crear fácilmente una imagen ISO desde la línea de comandos usando el comando genisoimage:

monstruosoft@monstruosoft-PC:~$ genisoimage -J -o imagen.iso *.jpg
Warning: creating filesystem with Joliet extensions but without Rock Ridge
         extensions. It is highly recommended to add Rock Ridge.
I: -input-charset not specified, using utf-8 (detected in locale settings)
 95.07% done, estimate finish Fri Jan 27 15:38:05 2017
Total translation table size: 0
Total rockridge attributes bytes: 0
Total directory bytes: 0
Path table size(bytes): 10
Max brk space used 0
5275 extents written (10 MB)

En este ejemplo estamos indicando que queremos usar la extensión Joliet para nombres de archivo largos, a continuación especificamos el nombre del archivo ISO y finalmente escribimos el nombre del archivo o archivos que queremos agregar a la imagen ISO.

De forma predeterminada, todos los archivos indicados en la línea de comandos serán puestos en el directorio raíz del CD/DVD. Para agregar carpetas a la imagen ISO podemos usar la opción -graft-points que permite especificar la forma en que aparecerán los archivos y carpetas en la imagen ISO. Por ejemplo:

monstruosoft@monstruosoft-PC:~$ genisoimage -J -graft-points -o imagen.iso carpeta-destino/=carpeta-local/ *.jpg

Por supuesto, este es solamente un ejemplo sencillo que nos permite crear rápidamente una imagen de CD/DVD. Para ver una lista completa de las opciones que soporta genisoimage, no olvides revisar su manual:

monstruosoft@monstruosoft-PC:~$ man genisoimage

Ejecutar programas GUI como otro usuario en Linux

A veces es útil ejecutar un programa como otro usuario sin tener que cambiar la sesión de escritorio. Para los programas de línea de comandos es fácil ya que podemos simplemente usar el comando su:

monstruosoft@monstruosoft-PC:~$ su - invitado 
Contraseña: 
invitado@monstruosoft-PC:~$ whoami 
invitado
invitado@monstruosoft-PC:~$ exit
logout
monstruosoft@monstruosoft-PC:~$ whoami 
monstruosoft

Pero sin intentamos ejecutar una aplicación con interfaz gráfica (GUI), recibimos un error:

monstruosoft@monstruosoft-PC:~$ su - invitado 
Contraseña: 
invitado@monstruosoft-PC:~$  xeyes 
No protocol specified
Error: Can't open display: :0

Esto se debe a que el display fue creado por el usuario que inició la sesión y, de forma predeterminada, el servidor X no permite que otros usuarios puedan usarlo. Sin embargo, siendo que el servidor X usa un modelo servidor-cliente, no es sorpresa que pueda fácilmente aceptar conexiones de otros usuarios si se configura para ello. Por suerte contamos con el comando xhost que nos permite hacer justamente eso e indicar al servidor X el tipo de conexiones que debe aceptar. De forma predetermiada, el servidor X sólo acepta conexiones del usuario que inició la sesión:

monstruosoft@monstruosoft-PC:~$ xhost 
access control enabled, only authorized clients can connect
SI:localuser:monstruosoft

Podemos usar el comando xhost para permitir el acceso al servidor X a otros usuarios locales usando el siguiente comando:

monstruosoft@monstruosoft-PC:~$ xhost +local:
non-network local connections being added to access control list
monstruosoft@monstruosoft-PC:~$ xhost 
access control enabled, only authorized clients can connect
LOCAL:
SI:localuser:monstruosoft

Ahora todos los usuarios locales pueder tener acceso al servidor X:

monstruosoft@monstruosoft-PC:~$ su - invitado 
Contraseña: 
invitado@monstruosoft-PC:~$ xeyes 
invitado@monstruosoft-PC:~$

Cuando ya no necesites acceso al servidor X desde otro usuario puedes revocar los accesos:

monstruosoft@monstruosoft-PC:~$ xhost -local:
non-network local connections being removed from access control list

Para más información sobre el comando xhost puedes consultar su manual:

monstruosoft@monstruosoft-PC:~$ man  xhost