Category Archives: bash

How to upload to e-qsl from Linux shell

So, for example: you are using WSJT-X and would like to automatically upload your new contacts from your Linux to EQSL.

WSJT-X store its logs in ~/.local/share/WSJT-X/wsjtx_log.adi

I have created a small script to check if wsjtx_log.adi has been modified, extract the last 2 QSO from the file to a temporary file and upload that file to eQSL, here is how:

git clone https://github.com/hc6pe/adifupload.git
cd adifupload
chmod +x adifupload.sh

Edif adifupload.sh and change ADIFILE, EQSLUSER and EQSLPASS to suit your needs:

vi ~/adifupload/adifupload.sh
....
#Where is your .adi file located? 
#Specify the full path (change YOURUSERNAME):
ADIFILE="/home/YOURUSERNAME/.local/share/WSJT-X/wsjtx_log.adi"
#your eQSL username. Use CAPS altough I think
# lowercase will work as well
EQSLUSER="N0CALL"
#your EQSL password.
EQSLPASS="not-my-pass"
...

And add a crontab task to start adifupload.sh on every reboot (change YOURUSERNAME to your user’s home dir):

crontab -e
@reboot /home/YOURUSERNAME/adifupload/adifupload.sh

Now, the script will start on your next reboot. And keep started checking if your ADIFILE has changed, if it notice it has changed, then it will upload the last 2 lines of the files (just in case it missed the previous upload).

Of course, if you have “massaged” the logfile, for example updating some QSO info (date, time, band, etc), this script will not upload the changed QSOs unless it is one of the last 2 lines.

So I suggest, from time to time, to do a full upload of your adif file by signing into eQSL.cc and do a manual upload. This way you may catch any missing to upload QSO.

¿Cuáles son algunas historias locas de “rm -rf” de las que has oído hablar?

oído? Vivido!

Te cuento dos que me acuerdo, no, mejor 3., es que seguramente me acordaré de muchas más.

Soy usuario de Linux desde 1995, y conocía de unix desde un año antes, y le uso desde entonces.

Historia 1: “Esta babosada no funciona”. (no es “babosada” pero realmente no puedo poner la palabra aqui por respeto). Es un usuario muy amigo mío que al día de hoy pasa como un experto en temas de seguridad y demás. Pero en aquellos remotos tiempos, 2003–2004 era un novato en Linux. Le habíamos instalado un sistema X para su organización y él un día nos llama y nos dice que ese sistema no sirve, que no levanta, que le vayamos a arreglar esa babosada inmediatamente porque estaba toda su organización sin el servicio.

Llegamos y efectivamente estaba nuestro servidor totalmente sin funcionar y todos mirándonos con cara de sorna, mofándose de nosotros. Pedía que le dijéramos en qué runlevel le queríamos arrancar. Qué raro! Le puse 3 y nada, emitió miles de mensajes. Al entrar en modo de rescate notamos que faltaba TOTALMENTE el directorio /etc, no existía /etc pero para NADA!

Inmediatamente hice lo que se debía hacer. Mirar .bash_history del usuario /root/ y decía algo así:

1001 cd /

1002 cd tmp

1003 cp -R /etc .

1004 ls etc/

1005 cd ..

1006 rm -rf etc

me viré para el técnico, mi amigo, y estaba como congelado, frío, seco, tieso, quieto, asustado, pálido, sin pestañear. Le pregunté: y esto? Me dijo: “yo quería borrar el directorio etc que estaba dentro de tmp”. “Sí, pero borraste el de la raíz.” — le contesté. “Es que me llamaron cuando puse cd .. (el 1005) y se me olvidó lo había puesto y borré etc de la raíz”.

Bueno, esta gracia les costó caro.

Sugerencia: mientras eres novato trabaja siempre con rutas absolutas. Al borrar mejor hubiera puesto rm -rf /tmp/etc y con CERTEZA se refería al etc que había copiado dentro de /tmp/

Sugerencia: posicionarse en la raíz (/) es como hacer el amor sin preservativo. Es agradable, se siente rico, es hasta cómodo. Pero es un tanto peligroso. JAMÁS te posiciones en /). El comando 1005 y el 1001, nada más de pensarlos me tiemblan las manos, nunca nunca nunca nunca JAMÁS te pongas en la raíz, porque suceden cosas… raras.

A mis estudiantes cuando les veo cambiándose a la / me da un ataquito, con pataleta y todo…

Historia 2: “La institución importante”. Era el 24 de diciembre de noséquéaño, todos listos para irnos fuera de la ciudad, el carro lleno de cosas, los niños subidos al carro (se imaginan lograr vestir, hacer pipi y caca a 2 niños de unos 2 y 4 años?). El carro encendido y … riiiing… “Ernesto, como sea, te pagamos lo que sea pero ayúdanos urgentemente: Una máquina virtual no arranca y eso es por culpa del servidor de virtualización que nos dijiste que pusiéramos”

Cada vez que alguien ya culpa a “algo” o a “alguien”… yo me pongo sospechoso. Es como cuando uno llega al médico y le dice: Estoy tosiendo mucho, tengo tuberculosis. Por favor! No te diagnostiques, solamente dime lo que pasa y yo intento averiguarlo.

En fin, me tocó bajar a los niños (gritería incluída de los 3, la madre y ellos) y sentarme a ver por qué no arrancaba la máquina, abrir el disco duro de la máquina virtual… qué raro, los directorios de / estaban ahí! … cuando veo en .bash_history (ohhhh gran amigo .bash_history) me doy cuenta de esto:

rm -f //

Qué Diablos es esto? Era algo así como borra lo que hay dentro de los directorios que están en la raíz. Pero no los directorios. Es por eso que yo seguía viendo /bin, /sbin, /etc, todo todo todo. Pero cuando miro, dentro de /bin no había ningún archivo, dentro de /sbin/ no había ningún archivo y así… todo limpio, vacío pero los directorios sí existían.

Nada, reportarles lo que hicieron y solicitarles recuperaran todo de respaldos. Y bonito hachazo.. feliz navidad y próspero año nuevo con lo cobrado!

Historia 3: Copiar de la web y pegar en el shell. Esto sí es duuuuro. Es un amigo que recién comenzaba en Linux pero quedó de responsable de todo un negocio, un día me llama y me dice que estaba copiando una receta (un paso a paso) de un sitio web y le desapareció TODO de un servidor. Cuando entro al sitio web del que copiaba noté algo, no me pregunten por qué, pero algunos sitios te ponen espacios cuando se formatea de forma especial algún texto. Ejemplo le decían( por favor no probar en sus servidores ni equipos de escritorio):

cp -r / etc .

rm -rf / etc / passwd

toch / etc / passwd

No sé por qué pero los caminos los separaba.. el más peligroso era el segundo.. querían decirte que borraras /etc/passwd pero al poner el formato un espacio entre cada /… realmente la órden era que borrara 4 directorios o archivos: /, etc, / y passwd… y claro, suficiente con /… se llevó en limpio todo el sistema.

Bonus (similar a rm -rf):

Historia 4: userdel -r. “Ingeniero”, me llaman, “quise borrar por seguridad el usuario nobody y me desapareció el sistema. Puse userdel -r nobody y se borró todo!!”

Efectivamente userdel -r borra el usuario y el directorio $HOME definido dentro de /etc/passwd y el usuario nobody tiene como $HOME a…….. / !!! A la raíz… se lo voló en claro.. qué duro tenerle que decir al usuario que ya nada, no había mucho más por hacer. (realmente no recuerdo si era nobody u otro, pero el tema es que el $HOME era /)

Tengo otras historias, pero bueno, espero las hayan disfrutado.

bash script for consulting QRZ.com via XML

well, here is a simple shell script I use to query callsigns’ information from QRZ.com. You had to have the XML Logbook data plan from QRZ.com in order to use it.

Simply change the first two lines to use your username/password and voilá..

#!/bin/bash
username=”hc6pe”
password=”mypassword”

rm -f /tmp/login

xml2=`which xml2 2> /dev/null`
[ $? -ne 0 ] && { echo “missing xml2, please install it”; exit 1; };
wwget=`which wget 2> /dev/null
[ $? -ne 0 ] && { echo “missing wget, please install it”; exit 1; };

$wwget -q -O – “http://xmldata.qrz.com/xml/current/?username=$username&password=$password”|egrep “<Key>”|awk -F”>” ‘{print $2}’|awk -F”<” {‘print $1’} > /tmp/login

$wwget -q -O – “http://xmldata.qrz.com/xml/current/?s=`cat /tmp/login`;callsign=$1″|$xml2 > /tmp/lookup
fname=`cat /tmp/lookup|egrep “/fname” |cut -f2 -d ‘=’`
name=`cat /tmp/lookup|egrep “/name”|cut -f2 -d ‘=’`
addr1=`cat /tmp/lookup|egrep “/addr1″|cut -f2 -d ‘=’`
addr2=`cat /tmp/lookup|egrep “/addr2″|cut -f2 -d ‘=’`
zip=`cat /tmp/lookup|egrep “/zip”|cut -f2 -d ‘=’`
country=`cat /tmp/lookup|egrep “/country”|cut -f2 -d ‘=’`
state=`cat /tmp/lookup|egrep “/state”|cut -f2 -d ‘=’`

echo $fname $name
echo $addr1
[ -z “$addr2” ] || { echo $addr2; };
echo $state $zip
echo $country

I put the script under ~/bin/xmlretriever.sh (the bin under my home) and chmodded +x, then query for my own callsign here is the result:

[eperez@laptop ~]$ xmlretriever.sh hc6pe
Ernesto (EPE) Perez Estevez
Las Toronjas 02-45 y Mandarinas
Ficoa, Ambato
TU EC180102
Ecuador

Activando guardar históricos al syslog del bash en CentOS

Ando probando una que otra cosa, pero esta me parece fundamental, hace días que vengo con la idea de que bash guarde todos los comandos que los usuarios emiten hacia syslog.

Esto con la finalidad incluso de llevar un mucho más largo history de los comandos que los usuarios escriban. Incluso poder enviarlos hacia otro servidor para almacenarlos.

Me guié por este documento, que sirven muchas cosas. Pero otras cambié por el bien de tener un ambiente aislado para pruebas y para que funcionara en CentOS-6

Comencemos:

Instalación de mock:

Instalé el paquete mock en un servidor virtual que uso para compilar paquetes de prueba en la ESPOCH.

Este servidor virtual es CentOS-6 de 64bits. Debe ser de 64bits para que pueda compilar paquetes de 64bits y de 32bits. De lo contrario no podrá compilarse paquetes de 64bits sino solamente de 32bits.

yum install mock

Creé un usuario para realizar las compilaciones:

useradd eperez

passwd eperez

Y entonces agregué el usuario eperez al grupo mock, este grupo, en el archivo /etc/group queda así:

mock:x:135:eperez

De no hacer al usuario parte del grupo mock, este usuario no podrá usar mock.

A partir de ahora todo trabajo con mock lo hago con mi usuario eperez. No se hace ningún trabajo como root, sólo mock.

su – eperez

Compilación de bash (todo esto lo haré dentro del usuario eperez):

Me bajé el último paquete de bash que existe al día de hoy (este podrá variar a futuro, hay que estar alerta de las versiones más modernas) y le instalé:

wget http://vault.centos.org/6.5/os/Source/SPackages/bash-4.1.2-15.el6_4.src.rpm

rpm -Uvh bash-4.1.2-15.el6_4.src.rpm

Ahora viene lo más duro, que es generar un diff con los cambios que se harán. Para ello abriré el tar.gz del bash, haré una copia de este directorio, cambiaré un par de archivos, y luego de esto generaré un diff entre el directorio de la copia y el directorio del original.

cd rpmbuild/SOURCES

tar zxf bash-4.1.tar.gz

cp -r bash-4.1 bash-4.1.orig

cd bash-4.1

Edito entonces el archivo config-top.h y sobre la línea 104 descomento la línea (está comentada con /* */ no quito el signo de # delante, es un .h de C, los # son parte del comando. Entonces termino dejando la línea solamente así:

#define SYSLOG_HISTORY

Y cambio las dos siguientes líneas que definen SYSLOG_FACILITY y SYSLOG_LEVEL para que tengan los valores LOG_LOCAL1 y LOG_DEBUG respectivamente, ambas líneas quedarían así (marco en negritas los dos cambios):

#  define SYSLOG_FACILITY LOG_LOCAL1
#  define SYSLOG_LEVEL LOG_DEBUG

Ahora edito bashhist.c y modifico las líneas 708 y 713 para que queden así (en negritas marco precisamente todo lo que cambié):

Línea 708

syslog (SYSLOG_FACILITY|SYSLOG_LEVEL, “HISTORY: PPID=%d PID=%d SID=%d UID=%d User=%s %s”, getppid(), getpid(), getsid(getpid()), current_user.uid, current_user.user_name, line);

Línea 713:

syslog (SYSLOG_FACILITY|SYSLOG_LEVEL, “HISTORY (TRUNCATED): PPID=%d PID=%d SID=%d UID=%d User=%s %s”, getppid(), getpid(), getsid(getpid()), current_user.uid, current_user.user_name, trunc);

Estamos listos para preparar el diff, salgamos al directorio SOURCES y creemos el diff:

cd ..

pwd

[eperez@mock bash-4.1]$ cd ..
[eperez@mock SOURCES]$ pwd
/home/eperez/rpmbuild/SOURCES

diff -Npur bash-4.1.orig bash-4.1 > bash_history_syslog.patch

 

Ahh, para esto es que habíamos hecho una copia del directorio bash, llamada bash-4.1.orig, es para que el diff pueda comparar y guardar los cambios. Al final estos cambios los guardé en bash_history_syslog.patch el puedes bajar de http://www.ecualinux.com/bash_history_syslog.patch para el que quiera ahorrarse todo el anterior proceso: este archivo debe ponerse en rpmbuild/SOURCES/ .

Ahora me cambio al directorio SPECS/ para editar el archivo bash.spec, cambiaré las siguientes líneas:

cd

cd rpmbuild/SPECS

vi bash.spec

# agrego _99 en la línea 8

Release: 15_99%{?dist}

# luego de la línea 41 agrego toda esta línea:

Patch999: bash_history_syslog.patch

# y luego de la línea 124 agrego toda esta línea:

%patch999 -p1 -b .history_syslog

Lo que hice fue cambiar la numeración del bash, ahora se llamaría -15_99.el6 (aparecerá un _99) esto es para evitar que luego un yum update me vuelva a instalar el viejo bash sin syslog.

Pero eso sí! hay que tener en mente que si mañana llega otro bash, el Release -16 por ejemplo, tendré que rehacer un nuevo rpm -16_99 por ejemplo.

Agregué además un nuevo parche, el 999 (puse un número alto para evitar que tropiece con futuros números de parches). Este parche se aplicará cada vez que compile el src.rpm, incorporando el envío de los comandos a syslog como deseo.

Ahora crearé el src.rpm del nuevo bash, lo guardaré hacia un directorio seguro (porque del directorio result/ le borra tan pronto compilo otra cosa), y le compilo al nuevo src.rpm para obtener el nuevo rpm:

cd

mock -r epel-6-x86_64 –sources=rpmbuild/SOURCES/ –spec=rpmbuild/SPECS/bash.spec –buildsrpm

mv /var/lib/mock/epel-6-x86_64/result/bash-4.1.2-15_99.el6.src.rpm .

mock -r epel-6-x86_64 bash-4.1.2-15_99.el6.src.rpm

mv /var/lib/mock/epel-6-x86_64/result/bash* .

como resultado tendré mi nuevo rpm!

[eperez@mock ~]$ ls
bash-4.1.2-15_99.el6.src.rpm
bash-4.1.2-15_99.el6.x86_64.rpm

ok, habrán más archivos, pero son los que ahora me interesan.

Si quisiera compilar el bash para 32bits, de una ejecuto:

mock -r epel-6-i386 bash-4.1.2-15_99.el6.src.rpm

mv /var/lib/mock/epel-6-i386/result/bash* .

Pues el mismo src.rpm me sirve para crear el de 32bits.

Instalando el nuevo bash (como root):

Me llevo este nuevo rpm hacia otro servidor, y le instalo:

rpm -Uvh bash-4.1.2-15_99.el6.x86_64.rpm

Entonces salgo y entro de nuevo, ya el nuevo bash estará activo.

Configurando rsyslog para recibir eventos de logs (como root):

Ahora edito /etc/rsyslog.conf y luego de una línea que comienza “local7.*”, agrego lo siguiente:

#bash
local1.debug                        /var/log/bash.log

Y reinicio rsyslog:

service rsyslog restart

Ahora disfruta, mira bash.log y verás que todo comando ahi aparecerá:

Dec 19 07:40:40 mock -bash: HISTORY: PPID=27954 PID=27955 SID=27937 UID=500 User=eperez vi bash.spec
Dec 19 07:44:54 mock -bash: HISTORY: PPID=27954 PID=27955 SID=27937 UID=500 User=eperez history |less
Dec 19 07:46:47 mock -bash: HISTORY: PPID=27954 PID=27955 SID=27937 UID=500 User=eperez cd
Dec 19 07:46:48 mock -bash: HISTORY: PPID=27954 PID=27955 SID=27937 UID=500 User=eperez mv /var/lib/mock/epel-6-x86_64/result/bash* .
Dec 19 07:46:49 mock -bash: HISTORY: PPID=27954 PID=27955 SID=27937 UID=500 User=eperez ls
Dec 19 07:48:13 mock -bash: HISTORY: PPID=27954 PID=27955 SID=27937 UID=500 User=eperez mock -r epel-6-i386 bash-4.1.2-15_99.el6.src.rpm
Dec 19 07:51:12 mock -bash: HISTORY: PPID=4187 PID=4511 SID=4511 UID=0 User=root cat /etc/rsyslog.conf
Dec 19 07:52:22 mock -bash: HISTORY: PPID=4187 PID=4511 SID=4511 UID=0 User=root tai /var/log/messages
Dec 19 07:52:25 mock -bash: HISTORY: PPID=4187 PID=4511 SID=4511 UID=0 User=root tail -f /var/log/messages
Dec 19 07:52:28 mock -bash: HISTORY: PPID=4187 PID=4511 SID=4511 UID=0 User=root tail -f /var/log/bash.log
Dec 19 08:01:13 mock -bash: HISTORY: PPID=27954 PID=27955 SID=27937 UID=500 User=eperez mv /var/lib/mock/epel-6-i386/result/bash-* .

Disfruten!

La forma fácil:

Si no tenemos tiempo para crear el rpm comento que estos rpm para CentOS-6 les he puesto  en el repo anku de EcuaLinux que es publico y que da bastante trabajo echar a andar un nuevo repo sólo por escasos paquetes, le instalo al repo:

wget -O /etc/yum.repos.d/anku.repo http://centos6.ecualinux.com/centosec.repo

Y ya luego:

yum update bash