Archivo

Entradas Etiquetadas ‘terminal’

Terminal transparente para visualizar logs

Jueves, 5 de Agosto de 2010 Gaspar Fernández Sin comentarios

screenshot-01-08-2010-140805Es muy de 2002/2003, aunque todavía a muchos les gusta tener un pequeño terminal transparente en el fondo para ejecutar comandos o mostrar logs u otra información importante.

Aquí comentaré algunas soluciones que he encontrado y cómo obtenerlas.

xrootconsole

Es muy ligero y rápido. Y vale para mostrar logs en xroot; el fondo es supuestamente transparente, aunque si cambiamos el fondo veremos que no, ya que en la ventana de xrootconsole se mantendrá el fondo anterior. Está bien para hacer el apaño, pero no lo recomiendo. La forma de ejecutar xrootconsole es:

$ xrootconsole [fichero]

donde fichero es el que vamos a vigilar, la visualización se actualiza automáticamente con cada cambio que se observa en el archivo. Es ideal para ver /var/log/messages.

aterm

Muestra un terminal transparente, con muchas opciones, y que podemos ejecutar de la siguiente manera para mostrar las últimas líneas de dmesg en el escritorio:

$ aterm -fg black -geometry 100×10+0+0 -e watch –no-title -n10 -d ‘dmesg | tail’

donde:

-fg Indica el color de las letras
-geometry Indica la posición y dimensiones de la ventana: ancho x alto + x + y
-e Ejecuta el comando que especificamos a continuación (La referencia del comando watch la incluyo al final del post

Por supuesto podemos sustituir el comando que esta en negrita por lo que queramos mostrar.
Aún así, de esta forma aterm nos muestra decoración de ventana, barra de scroll y no es transparente. Esto lo podemos solucionar ejecutando aterm de la siguiente manera:

$ aterm -tr -bl -sb -fg black -geometry 100×10+0+0 -e watch –no-title -n10 -d ‘dmesg | tail’

-tr Ventana transparente
-bl Ventana sin borde
-sb Ventana sin barra de desplazamiento (scrollbar)

O, editando el archivo $HOME/.Xdefaults y añadiendo estas líneas

aterm*transparent:true
aterm*borderLess:true
aterm*scrollBar:false

El problema de aterm es que no admite sombra en las letras, por lo que la lectura sobre algunos fondos es algo complicada.

Eterm

Este emulador de terminal es el más completo y tiene más opciones, y por lo menos es el que soporta poner sombra en las letras, lo que proporciona una mejor visibilidad, y es el que aparece en la captura de pantalla que hay arriba. Para ello, lo podemos ejecutar de la siguiente forma:

Eterm –buttonbar 0 –scrollbar off -f white -n dmessenger -g 211×10+0+0 -O -0 -e watch –no-title -n10 -d ‘dmesg | tail’

–buttonbar 0 Elimina la barra de menú y botones superior
–scrollbar off Elimina la barra de desplazamiento.
-f white Especifica el color de las letras (blanco en este caso)
-n dmessenger Especificamos el nombre de la aplicación, la llamamos dmessenger. Será útil más adelante.
–O (letra o) Hace la ventana transparente
-0 (cero) Activa algunas optimizaciones de transparencia (sobre todo para ventanas que no se moverán demasiado), desactivar esta opción si no funciona correctamente o hay fallos en la ventana.
-x La pondré más adelante, elimina la decoración de la ventana y oculta el terminal de la barra de aplicaciones.
-g Indica la posición y dimensiones de la ventana: ancho x alto + x + y
-e Ejecuta el comando que especificamos a continuación (La referencia del comando watch la incluyo al final del post

Aunque veremos un problema, la decoración de la ventana, para ello hay varias soluciones, dependiendo del sistema en el que trabajemos, para muchos, la solución será incluir el parámetro -x:

$ Eterm -x –buttonbar 0 –scrollbar off -f white -n dmessenger -g 211×10+0+0 -O -0 -e watch –no-title -n10 -d ‘dmesg | tail’

(en negrita aparece el comando, en cursiva un comando opcional), aunque a veces el entorno de ventanas, entre ellos Fluxbox, el que uso actualmente, no se lleva muy bien con ese modo sin decoración de ventanas, y aunque se muestra bien, la ventana aparece sobre todas las demás (on top).
Para solucionar eso, nos vamos a complicar un poco la vida. Para ello, editamos el archivo $HOME/.fluxbox/apps y añadimos las siguientes líneas:

[app] (name=dmessenger)
[Deco] {NONE}
[Sticky] {yes}
[Layer] {10}
[end]

Y a la hora de ejecutar Eterm lo hacemos de la siguiente manera:

Eterm –buttonbar 0 –scrollbar off -f white -n dmessenger -g 211×10+0+0 -O -0 -e watch –no-title -n10 -d ‘dmesg | tail’ & sleep 2 && wmctrl -r dmessenger -b add,skip_taskbar

donde ejecutamos Eterm en segundo plano (al terminar el comando con &) y ejecutamos un sleep 2 (para esperar 2 segundos antes de ejecutar el siguiente comando), a continuación ejecutamos wmctrl donde,

-r dmessenger Especificamos el nombre de la ventana a ocultar; en este caso dmessenger
-b add,skip_taskbar Eliminamos la aplicación Eterm de la barra de aplicaciones, si queremos que la ventana aparezca también por debajo de las demás ventanas, podemos añadir la opción below de la siguiente forma: -b add,skip_taskbar,below

dmesg

En el ejemplo estamos ejecutando dmesg de la siguiente forma (con la ayuda de watch):

watch –no-title -n10 -d ‘dmesg | tail’

donde,

–no-title watch introduce un título donde indica el periodo de actualización, con este modificador lo eliminamos.
-n10 dmesg no está cambiando continuamente, por lo que escogemos un periodo de actualización de 10segundos (podemos modificar este parámetro como queramos)
-d ‘dmesg | tail’ Obtenemos los últimos 10 mensajes del kernel, podemos incluir un modificador -n4 a tail para obtener sólo las últimas 4.

Búsquedas rápidas en el historial de BASH

Jueves, 6 de Mayo de 2010 Gaspar Fernández Sin comentarios

2683642114_bba3d6383e
Cuando pasamos mucho tiempo en escribiendo en terminal, a veces tenemos la necesidad de repetir algo que escribimos en el pasado. Puede que estemos compilando algún programa, o haciendo un ./configure e instalando dependencias de un programa…
Muchas distribuciones lo tienen por defecto (por ejemplo Gentoo), pero otras muchas (Ubuntu, Mandriva, ArchLinux…) no lo tienen; se trata de activar las teclas de Avance y Retroceso de página para hacer búsquedas en nuestro historial.
Esto sirve, por ejemplo para que, si escribimos algunas letras de una orden que enviamos en el pasado, y pulsemos RePag nos encuentre aquellas órdenes que enviamos en el pasado y nos ahorre unas cuantas pulsaciones de teclado.

Lo que debemos hacer es editar el archivo /etc/inputrc, muchas distribuciones traen ciertas líneas parecidas, por lo que si vemos alguna línea que empiece por “\e[5~” o “\e[6~” deberíamos comentarla (con #) o borrarla; y tras ello introducir lo siguiente:

“\e[5~”: history-search-backward
“\e[6~”: history-search-forward

Para mí, es la forma más cómoda de trabajar.

Foto: Liamdunn (Flickr)

Graba lo que haces en la consola

Miércoles, 31 de Marzo de 2010 Gaspar Fernández Sin comentarios

cinta Estoy de vacaciones, pero tuve que usar este comando en un pequeño proyecto y me pareció buena idea publicarlo en el blog.

A veces tenemos la necesidad de guardar lo que estamos haciendo en consola (sería como un screencast pero para la línea de comandos). Tenemos que guardar los comandos que escribimos y las diferentes salidas en un archivo de texto.
Podemos hacer lo siguiente:

$ script test
Script iniciado; el fichero es test
$ echo “Hola mundo”
Hola mundo
$ exit

Se grabará todo lo que hemos hecho y la salida de los comandos ejecutados en el fichero test. Eso sí, se grabarán todo tipo de caracteres (retornos de carro, retroceso, códigos ANSI…), por lo que al ver el fichero podremos ver los colores representados e incluso veremos parpadeo al hacer limpiezas de pantalla.

Por otra parte es muy útil para guardar el trabajo de consola que vamos haciendo, o cuando estamos investigando, poder saber cómo hemos hecho las cosas.

Foto: Matti Mattila (Flickr)

Categories: Bash, Linux Tags: , ,

Club2020 de Vodafone… enviar SMS desde la consola

Miércoles, 16 de Diciembre de 2009 Gaspar Fernández Sin comentarios

club2020No vengo a hablaros de la empresa Vodafone, ni del concurso (que podéis entrar desde este enlace y no tenéis que ser de Vodafone). Es un concurso rasca y gana (aunque cada cierto tiempo hay concursos parecidos; en el que uno de los premios son SMS gratis.

Hasta ahí bien, el problema viene a la hora de gastar los SMS, y es que mientras entro en la web (todo hecho en flash), se carga la intro, me la salto, se carga la web, me identifico, pulso en enviar mensajes, escribo el número, el mensaje y envío echo unos 3 minutos, y para el SMS tardo menos desde el móvil.

He hecho un pequeño script para consola que lo hace todo solo, y además en unos 10 segundos (como mucho) está mandado el mensaje… esto también nos permitirá enviar muchos mensajes seguidos (y si queremos usarlo para felicitar las fiestas, nos vendrá genial).

Nota: Antes de postear el código, quiero decir una cosa (NO hago comprobación de las letras de los mensajes, que son algo menos de 160 caracteres), ni de los parámetros (explicados al final) devuelvo el texto de enviado y no enviado, aunque eso no significa que se haga de verdad (ya sabéis cómo andan los SMS incluso en este 2009); por otra parte, si Vodafone corta el servicio o introduce alguna modificación en la página… ¡mala suerte! se nos acabó esto, pero quise compartir este código (y tal vez podamos hacer más cosa en el futuro con él).

Nota 2: Requiere cURL (sin él habría sido una matanza de código)

Nota 3: No está muy comentado, pero si hay alguna duda, siempre tendremos los manuales de cURL, de bash, y los comentarios en este post :)

Ahí va:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
#!/bin/bash

MOVIL_USR={mi movil}
CLAVE_USR={mi clave club2020}

function strpos()
{
str=${1/$2*/}
if [[ -z "$1" ]]; then
cad1l=0
else
cad1l=`expr length "$1"`
fi

if [[ -z "$str" ]]; then
donde=0;
else
donde=`expr length "$str"`
fi
if (( $donde < $cad1l )); then
echo $donde
else
echo -1
fi
}

echo "Identificándonse en el sistema..."
#Envio de datos
login="accion=login&clave%5Fusr="$CLAVE_USR"&movil%5Fusr="$MOVIL_USR
data=`curl -s -L -b cookies.txt -c cookies.txt "http://club2020.mi.vodafone.es/rascaygana/actuar.php?"$login`

# Usé esto para obtener los datos a mano hace un rato
#echo $data>tmp
#data=`cat tmp`

# Almacenamos en un array  los datos que nos ha mandado la web
i=1
datos[${i}]=`echo $data | cut -d"&" -f $i`;

while [[ -n ${datos[${i}]} ]]; do let i=$i+1; datos[$i]=`echo $data | cut -d"&" -f $i`; done
#Recorremos el array para mirar las opciones recibidas
datosrecibidos=${#datos[*]}

for ((i=0;i<$datosrecibidos;i++)); do
if (( `strpos ${datos[${i}]} =` > -1 )); then
combo=${datos[${i}]}
clave=`echo $combo | cut -d"=" -f1`
valor=`echo $combo | cut -d"=" -f2`
if [[ $clave == "usuario" ]]; then
usuario=$valor;
elif [[ $clave == "nombre" ]]; then
nombre=$valor;
elif [[ $clave == "tarjetas" ]]; then
tarjetas=$valor;
elif [[ $clave == "mensajes" ]]; then
mensajes=$valor;
fi
fi
done

echo "Hola "$nombre" te quedan "$mensajes" mensajes y tienes "$tarjetas" por rascar"
mensaje=$2
destinatario=$1
echo "Enviando mensaje: "$mensaje" a "$destinatario"..."
postdata="accion=mandarSms&mensaje="$mensaje"&destinatario="$destinatario"&firma="$usuario

#Envio de datos
result=`curl -s -L -b cookies.txt -c cookies.txt -d "$postdata" 'http://club2020.mi.vodafone.es/rascaygana/actuar.php'`

#echo $result > tmp2
result="retorno"`cat tmp2`
i=1
resdata[${i}]=`echo $result | cut -d"&" -f $i`;

while [[ -n ${resdata[${i}]} ]]; do let i=$i+1; resdata[$i]=`echo $result | cut -d"&" -f $i`; done
#Recorremos el array para mirar las opciones recibidas
resdatarecibidos=${#resdata[*]}

for ((i=0;i<$resdatarecibidos;i++)); do
if (( `strpos "${resdata[${i}]}" =` > -1 )); then
combo=${resdata[${i}]}
clave=`echo $combo | cut -d"=" -f1`
valor=`echo $combo | cut -d"=" -f2`
if [[ $clave == "error" ]]; then
error=$valor;
elif [[ $clave == "mensajes" ]]; then
mensajes=$valor;
fi

fi

done

echo "Resultado de la operación: "$error" Quedan "$mensajes" mensajes"
echo "Cerrando sesión..."

#Envio de datos
curl -s -L -b cookies.txt -c cookies.txt 'http://club2020.mi.vodafone.es/rascaygana/actuar.php?accion=logout' >/dev/null

Si guardamos este archivo como sms2020 y le damos permiso de ejecución, el primer parámetro es el móvil del destinatario, y el segundo el mensaje (entrecomilladlo si tiene espacios). Además, en la parte de arriba del archivo encontramos MOVIL_USR y CLAVE_USR, tendréis que poner vuestro número de móvil y vuestra clave del club2020 (para poder identificaros en el sistema).
Nota 4: Pude optimizar un poco el código, pero como había prisa y no sé lo que durará esto, no quise calentarme mucho el coco.
Nota 5: Para registrase: seguid este link (así me dais sms gratis a mí también, porque los demás premios nunca tocan).

Colores y posicionamiento en terminales Linux (como conio.h en DOS)

Viernes, 29 de Mayo de 2009 blakeyed 2 comentarios

A veces, es un poco difícil que alguien que sólo conoce conio.h se pase a Linux, más que nada, porque se puede utilizar ncurses, pero hay que cambiar un poco de mentalidad para poder trabajar con la nueva biblioteca.

Por eso, hace unos meses creé unas cuantas funciones que se podían utilizar para ir reemplazándolas poco a poco. Funcionan de forma muy parecida a conio.h (en los colores). Se basan en códigos ANSI, y las podemos utilizar para cualquier programa rápido en que necesitemos utilizar colores en terminal. ncurses es muy potente y si vamos a complicarnos un poco más la vida, mejor utilizar esta segunda.

Cuando estuve implementando estas funciones, tuve un problema, a la hora de leer información del terminal sin mostrarla por pantalla, me basé en: wsize.c de Stephen J. Friedl. También podéis encontrar información sobre los códigos ANSI aquí.

He incluído la opción subrayado (UNDERLINE) y un par de funciones que nos calculan las dimensiones de la pantalla (ya que los terminales pueden ser redimensionados y ser enormes).

Descargar stermp - Simple Terminal Play (stermp.c, stermp.h)

Os pongo aquí el código del ejemplo (conio.c)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <stdio.h>
#include "stermp.h"

int main()
{
    int pp, fn;
    clrscr();
    for (pp=BLACK; pp<=WHITE; pp++)
        {
            gotoxy(5, 20+pp);
            for (fn=BLACK; fn<DARKGRAY; fn++)
                {
                    textcolor(pp);
                    textbackground(fn);
                    printf("COLOR\t");
                }
        }
    restore_color();
    textcolor(RED+UNDERLINE);
    gotoxy(51, 5);
    printf("Posición X: %d\n", wherex());
    printf("Posición Y: %d\n", wherey());
    printf("Pantalla %dx%d", screenwidth(), screenheight());

}

Visita otras webs de la red