Comandos interesantes

De Jose Castillo Aliaga
Ir a la navegación Ir a la búsqueda

Esta página contiene comandos curiosos y didácticos. Están ordenados alfabéticamente según el nombre del comando o variable más relevante.

base64

Codifica o decodifica archivos binarios en base64. Esto permite guardar en ficheros o bases de datos ASCII cualquier dato binario, como imágenes.

$ base64 imagen.jpg

Un ejemplo curioso para mostrar un banner ASCII art muy grande comprimiendolo antes:

$ base64 -d <<<"H4sIAJM2MVYAA1NQgAEDIIhHBsgCBmgAU8TAQJsL2SgU41AFiDALYRhUF8I0NAEUCbBZUB7MBGRrUXX
g8DC6CagORwkYtDCDcw3IMwDdOBL1IyRRwpBI7cihTlSYkRRNUHcRnUZgXIQGIlOoOQC/4ufk0gIAAA==" | gunzip

# Previamente comprimido así:
$ echo $string | gzip | base64

bc

bc es una calculadora para la terminal. Es muy potente y puede hacer la mayoría de los cálculos que necesitamos en el dia a dia.

Aquí tenemos un ejemplo de transformar de hexadecimal a binario.

for j in C4 97 91 8C 85 87 C4 90 8C 8D 9A 83 81
do
       BIN=$(echo "obase=2; ibase=16; $j" | bc )
       echo $BIN
done

cat

En linux, todo es un fichero. Incluso los periféricos son un fichero. Un ejemplo puede ser el siguiente comando que muestra, en hexadecimal, lo que tecleamos en un teclado.

sudo cat /dev/input/event3 | od -x

chroot

Este comando permite cambiar el directorio raíz de un proceso y todos sus hijos. En principio los programas que se ejecuten dentro de este entorno no pueden salir de él, por lo que se denomina habitualmente un entorno “enjaulado” chroot. Para que este procedimiento funcione, es necesario que el directorio destino sea el directorio raíz de un sistema con los mínimos elementos para funcionar, ya que una vez dentro de la jaula chroot no podemos utilizar ningún recurso de fuera de ella.

root@equipo:~# mount /dev/sdb7 /mnt
root@equipo:~# chroot /mnt /bin/sh
# pwd
/

Como se puede ver, el /mnt del equipo se convierte en / al hacer chroot en esa terminal.

Si queremos acceder a los dispositivos del sistema debemos montarlos en los directorios correspondientes del sistema de dentro:

root@equipo:~# mount /dev/sdb7 /mnt
root@equipo:~# mount --bind /dev/ /mnt/dev
root@equipo:~# mount --bind /dev/pts /mnt/dev/pts
root@equipo:~# mount --bind /proc /mnt/proc
root@equipo:~# mount --bind /sys /mnt/sys
root@equipo:~# chroot /mnt /bin/sh
#

Una utilidad muy típica que se le da al chroot es reinstalar el Grub:

# grub-install /dev/sda


Fuente

Otros usos : [1]

column

Muestra los datos de entrada en columnas más fáciles de leer.

$ mount | column -t

Este ejemplo facilita mucho la lectura del resultado del comando mount. Utilitza la opción -t para convertir los espacios en los separadores de las columnas.

convert

Se trata de una herramienta de la suite imagemagick que transforma imágenes entre formatos y permite añadir cosas como texto o redimensionar entre otras muchas opciones

 $ convert -background yellow -fill red -gravity center -pointsize 200 label:'castillo' newname.gif

Crea un gif con una palabra.

Una forma divertida de ver este gif es con la herramienta cacaview del paquete caca-utils:

 $ cacaview newname.gif

Utilizar convert para hacer gifs animados con capturas de pantalla. [2]

 $  ls | convert label:@- ficheros.png

Guardar el resultado de un comando en una imagen

https://askubuntu.com/questions/818593/how-can-i-change-a-pictures-file-size

Redimensionar y cortar con un tamaño fijo sin deformar unn grupo de imágenes:

for i in *.jpg; do convert $i -resize 400x200 -gravity Center -crop 400x200 small/$i; done

dmidecode

Comando para dar información del hardware del equipo.

Ejemplos:

$ dmidecode  # información de los mensajes del sistema en el arranque y detección de nuevos dispositivos
$ sudo dmidecode -t 16 # Información sobre la RAM, para saber los módulos que puedes instalar.
$ sudo dmidecode -t 17 # Información de los módulos instalados

Double Dash (--)

Permite indicar el fin de las opciones y indica que a partir de ahí sólo se aceptan parámetros posicionales. Ejemplos:

$ grep -- -v file  # Busca la cadena -v en el fichero
$ lxc exec container -- lxc exec subcontainer -- ls -la .*  # Ejecuta en el subcontenedor de un contenedor el comando ls -la .*

echo

El comando echo tiene muchas utilidades. Si jugamos con -n (para no saltar de línea) y -e (para interpretar carácteres especiales) se puede obtener resultados sorprendentes como este comando:

$ while true; do echo -ne "\e[s\e[0;$((COLUMNS-27))H$(date)\e[u"; sleep 1; done &

Muestra un reloj en lo alto de la terminal. Para entender qué pasa con los \e podemos ir a estas páginas [3] [4] [5] [6] Pero en este caso concreto podemos decir que con \e[s guarda la posición actual, con \e[u la restaura y con \e[<fila>;<columna>H mueve el cursor para luego escribir el resultado de $(date).

Dentro del mismo tema de los códigos de escape de ANSI, observemos este complejo comando que imprime todos los posibles colores de la terminal:

$ for i in $(seq 0 10 256); do for j in $(seq 0 1 9); do n=$(expr $i + $j); [ $n -gt 256 ] && break 
|| echo -ne "\t\033[38;5;${n}m${n}\033[0m"; done; echo; done 
# (Hacer todo en una sóla línea)
# \033 es el código de escape en Octal
# \e es la forma cómoda en echo o printf de representar el caracter escape.
# \x1b es el código en hexadecimal
# En muchos editores se puede poner ^[ directamente con las teclas ctrl+v+[

Los for sirven para dibujar los números como una tabla, pero lo interesante está en el echo. Gracias a -e y \033[ (que es lo mismo que poner \e[) se indica los siguiente \t para el tabulador \033[38;5;${n},m${n} que imprime la variable $n con el color de su valor numérico. El 38 sirve para indicar que se usan 256 colores, el 5 es necesario para esta expresión y luego el color puede ir de 1 a 256. El \033[0m resetea el color.

Dentro de la misma línea, tenemos estos peculiares comandos que muestra una salida "tipo matrix" por la terminal:

$ while true; do echo -ne "\e[32m$((RANDOM%2))\e[0m"; for ((i=0; i<$((RANDOM%128)); i++)) do echo -n " "; done; done
$ echo -ne "\e[32m" ; while true ; do echo -ne "\e[$(($RANDOM % 2 + 1))m" ; tr -c "[:print:]" " " < /dev/urandom | dd count=1 bs=50 2> /dev/null ; done


Podemos ver de nuevo el \e[32m para dar color verde y el \e[0m para volver a la normalidad.

Con este comando podemos ver las ~50 Shades of grey en la terminal:

$ yes "$(seq 232 255;seq 254 -1 233)" | while read i; do printf "\e[48;5;${i}m\n"; sleep .01; done

Que, por cierto, usa el comando yes que muestra un texto hasta que se termina a la fuerza con control-c.

Otra alternativa con azules:

$ yes "$(seq 19 21; seq 21 -1 18)" |while read i; do printf "\x1b[48;5;${i}m\n"; sleep .1; done 

Script interesante sobre esto

El siguiente script pinta de colores aleatorios posiciones aleatorias de la terminal:

$ while :;do printf "\e[%d;%dH\e[48;5;%dm \e[0m" $(($RANDOM%$LINES)) $(($RANDOM%$COLUMNS)) $(($RANDOM%216 )); done  # https://twitter.com/climagic/status/596734639894568960
$ P=(' ' █ ░ ▒ ▓);while :;do printf "\e[$[RANDOM%LINES+1];$[RANDOM%COLUMNS+1]f${P[$RANDOM%5]}";done

Otros ejemplos [7][8][9] [10]

Utiliza printf para no mezclar los cálculos con el formato. Los primeros \e son para la posición en filas y columnas y el otro para pintar el fondo del caracter espacio de un color aleatorio.

Este pinta puntos de colores en la terminal:

$ while true; do printf "\e[38;5;$(($(od -d -N 2 -A n /dev/urandom)%$(tput colors)))m.\e[0m"; done

Mejorado para mostrar caracteres braile, así los puntos parecen más aleatorios:

$ l=$(for i in {10240..10495}; do echo -en \\U$(echo "obase=16;$i"|bc)" "; done); while true; do L=$(echo $l | cut -d" " -f$((RANDOM%255+1))); printf "\e[38;5;$(($(od -d -N 2 -A n /dev/urandom)%$(tput colors)))m$L\e[0m"; done


Con esto de los colores no solo se puede hacer efectos curiosos. El siguiente comando:

$ tail -F /var/log/syslog |while read -r line;do printf "\033[38;5;%dm%s\033[0m\n" $(($RANDOM%255)) "$line";done

Muestra el fichero syslog con cada línea de un color aleatorio. De esta manera puede ser más fácil de leer.

algo similar

Otra utilidad curiosa de echo es la posibilidad de imprimir caracteres UTF

$ for i in $(seq 30 2500);do printf "%03d " $i ; echo "obase=2; $i" | bc |xargs printf "%010d " ; \ 
printf "%02X " $i;echo -e \\u$(echo "obase=16;$i"|bc); done

El for va de 30 a 2500 imprimiendo primero el número en decimal con 3 dígitos, luego en binario escribiendo primero la orden obase=2; $i que recoge el bc para calcular el número en base 2. Mediante xargs se transforma el resultado en un argumento para printf que lo escribe con 10 dígitos. El siguiente printf lo transforma a hexadecimal y a continuación, \\u sirve para interpretar el número en hexadecimal al UTF.

Este comando:

$ for i in $(seq 1 65536);do printf "%02X " $i;echo -n -e \\u$(echo "obase=16;$i"|bc)"\t"; done

Muestra una tabla con los caracteres Unicode del base multilingual plane.

Esto no funciona para Unicode de más de 16 bits. Para ellos se puede usar \U (con mayúsculas). Por ejemplo, este muestra todos los emojis:

$ for i in $(seq 127744 128767);do printf "%02X " $i;echo -n -e \\U$(echo "obase=16;$i"|bc)"\t"; done

Depende del tipo de letra se verán más o menos. Con las fuentes oficiales de Ubuntu 14.04 sólo se ven de U+1F601 al U+1F641. No obstante, si probamos la letra Symbola, dispoble aquí [11] se verán casi todos. No hace falta poner ese tipo de letra en el perfil porque la usará como fallback

exif

Permite ver datos exif de fotografias.

$ for i in *; do if file $i | grep 'JPEG' &> /dev/null; then mv $i $(echo $(exif -t 0x9003 $i| grep Value | cut -d" " -f4)_$i); fi; done 

Este comando renombra todas las fotos de un directorio poniendo la fecha en que se tomó la foto delante del nombre.

expect

Es un lenguaje de scripts que permite usar programas interactivos de manera automática.

geoiplookup

Comando para geolocalizar una IP. Usa una base de datos presente en Linux que se puede actualizar [12]

history

Guardar el historial en un fichero con la fecha y dentro del directorio personal del usuario.

$ history > ~/historyBackup$(date +%d-%m-%y-%T)

Puede ser útil para hacer auditorías o para no olvidarse de cómo se ha hecho algo. Si lo ejecutamos u luego hacemos history -c podemos consultarlo en el fichero generado.

$IFS

OIFS=$IFS;IFS=$'\n\r';for i in *.jpg; do convert $i -density 700 $i; done;IFS=$OIFS 

Ejemplo de cómo puede ser interesante modificar la variable $IFS para simplificar un script. En este caso evita los espacios en los nombres de los ficheros.

ncat

Comando para enviar o escuchar datos a través de la red. Por su potencia tiene sección própia: ncat

od

Comando para ver el contenido de un fichero en octal (por defecto). Se puede hacer que lo muestre en hexadecimal con -x o incluso en coma flotante.

echo -n AB | od -t x4 

Este muestra AB en hexadecimal con palabras de 4 bytes o 32 bits. El -n en el echo es para que no muestre el salto de línea.

Otra opción es usar xxd que sirve para hacer un volcado hexadecimal. Este tiene la posibilidad de mostrarlo en bits.

padsp

Antes de pulseAudio se podía redireccionar directamente un fichero a /dev/dsp o similar. Ahora se trata de un servidor de sonido y se puede invocar de la siguiente manera:

cat /dev/urandom | padsp tee /dev/audio > /dev/null

También funciona:

cat /dev/urandom | pacat

En este post hay una aplicación curiosa.


photorec

Utilidad para recuperar ficheros de particiones estropeadas. Forma parte del paquete testdisk.

$ sudo apt-get install testdisk
$ sudo photorec

Photorec.png

$PS1

Variable encargada del aspecto y la información del prompt.

insteresante

Generador de PS1

$PROMPT_COMMAND

Esta variable guarda el comando que se ejecuta cada vez que sale el prompt.

En este ejemplo, emite un sonido. Puede servir para avisar cuando acaba un programa largo:

$ PROMPT_COMMAND="play -qn synth sin G3 trim 0 0.1"
$ PROMPT_COMMAND='[ "$?" == 0 ] && play -qn synth sin F3 trim 0 0.1 || play -qn synth sin F4 trim 0 0.1'

pv

Este comando sirve para mostrar una barra de progreso. Por ejemplo:

$ pv -tpreb /dev/urandom | dd of=/dev/null bs=16k count=10000

En realidad no hace nada útil porque copia de /dev/urandom a /dev/null, pero es interesante cómo muestra una barra de progreso.

En este caso, puesto que no se pone un proceso delante del pv con un pipe, se comporta similar al comando cat y muestra el contenido del fichero /dev/urandom

Las opciones son las siguientes:

  • -t : muestra el tiempo.
  • -p: Muestra la barra de progreso. Si la entrada no es un fichero o no se indica el tamaño aproximado con -s , la barra de progreso no funcionará con los porcentajes correctos.
  • -r: Muestra la velocidad de la transferencia.
  • -e: Si se puede determinar el tamaño, esta opción intenta calcular el tiempo que queda basándose en transferencias previas y el tamaño total. Si no se sabe el tamaño no funcionará bien.
  • -b: Este muestra el total de datos transmitidos.
  • -n: Muestra un número cada vez con el porcentaje.

Veamos otro ejemplo interesante:

$ (cat /dev/urandom | pv -n > /dev/null) 2>&1 | dialog --gauge "Copiando..." 10 70 0

En este caso sigue siendo un poco absurdo, pero no hace daño a nadie como podría hacerse con comandos como dd. Ahora lo que hace es mostrar un número por linea que indica el porcentaje y luego se lo pasa al dialog para que lo muestre como una barra gráfica. Dialog, por su parte, también es un comando interesante. Útil para mostrar diálogos gráficos. En este caso con --gauge muestra una barra de progreso y con 10 70 0 indicamos la altura, anchura y el porcentaje inicial.

# pv -tpreb /dev/sdc2 | dd of=/dev/sdb2 bs=64K conv=noerror,sync

Este clona una partición con barra de progreso.

pwgen

# apt-get install pwgen
$ pwgen -s -y 10 

El ejemplo genera contraseñas totalmente seguras -s con símbolos -y y de 10 caracteres. Si se desea que sean memorizables se quita el -s

rev

Este comando invierte las líneas de un fichero o lo que se le pase por la entrada estandar

rm

$ alias rrm='/bin/rm -i'; alias rm='trash'

Reemplaza el rm tradicional por el trash, que lo envia a la papelera. Para ello es necesario instalar préviamente el trash-cli

$SECONDS

Se puede usar esta variable para averiguar cuantos segundos ha tardado un script en ejecutarse.

#!/bin/bash
for i in {1..10}; do
       sleep 1
       echo $i
done
echo "Tiempo total del script: $SECONDS"

setleds

Permite modificar los leds del teclado. El de Caps_lock, scroll o el numérico.

shuf

Genera permutaciones aleatorias entre las líneas de un fichero o de la entrada estándar.

$ man $(ls /bin /usr/bin | shuf -n 1) 

Este, si se pone en .bashrc muestra un manual aleatório cada vez que entras en la terminal.

Es muy similar a poner sort -R


stdbuf

http://unix.stackexchange.com/questions/192995/what-are-practical-uses-of-stdbuf-or-nohup

http://www.pixelbeat.org/programming/stdio_buffering/

tc

Sirve para emular latencia o errores en la red. En ocasiones, podemos necesitar probar la tolerancia a fallos de red o a latencias altas de una aplicación. Tambén se puede usar para balancear la carga en un sistema que haga de router.

# tc qdisc add dev eth0 root netem delay 2000ms

Este emula una latencia de 2000ms.

Se puede poner un rango aleatorio de latencias. El siguiente ejemplo lo hace entre 90 y 110:

# tc qdisc change dev eth0 root netem delay 100ms 10ms

Se puede hacer que haya una distribución de manera que el valor dependa en un % del segundo valor. Esto crea una pseudo-distribución estadística

# tc qdisc change dev eth0 root netem delay 100ms 10ms 25%

Se puede, incluso, usar una distribución estadística completa:

# tc qdisc change dev eth0 root netem delay 100ms 20ms distribution normal

Se puede hacer que se pierdan paquetes:

# tc qdisc change dev eth0 root netem loss 0.3% 25%

Resetar:

# tc qdisc del dev eth0 root

Mucha más información: http://www.lartc.org/

timidity

Si instalamos este paquete, podemos reproducir MIDI por la terminal. Se puede pasar el archivo .mid o por la entrada estandar con un guión -:

$ base64 -d<<<TVRoZAAAAAYAAQABAYBNVHJrAAAAOgD/UQOAAAAAkEV/CIBFfwCQRX8IgEV/AJBKfwiASn8AkEx/CIBMfwqQSX8IgEl/AJBKfwiASn//LwA= |timidity - # https://twitter.com/climagic/status/604003268356874240


Este scritp prueba todos los instrumentos del banco de timidity:


#!/bin/bash

printf "\x4D\x54\x68\x64\x00\x00\x00\x06\x00\x01\x00\x01\x01\x80\x4D\x54\x72\x6B\x00\x00\x00\x3A\x00\xFF\x51\x03\x80\x00\x00"

function playnote {

    notes=("4E" "55" "56")
    printf "\x00\x90\x${notes[$1]}\x7F\x08\x80\x${notes[$1]}\x7F"

}

for i in {0..127}; do
	hex=$(printf "%x" "$i")
	printf "\x00\xC0\x$hex"

         echo -n 1001001020 | while read -n1 i; do
	       playnote $i
        done
done

printf "\xFF\x2F\x00"

O este otro que toca notas aleatorias:

#!/bin/bash

printf "\x4D\x54\x68\x64\x00\x00\x00\x06\x00\x01\x00\x01\x01\x80\x4D\x54\x72\x6B\x00\x00\x00\x3A\x00\xFF\x51\x03\x80\x00\x00"

function playnote {

	hex=$(printf "%x" $1)
	printf "\x00\x90\x$hex\x7F\x08\x80\x$hex\x7F"

}

for i in {0..127}; do
	hex=$(printf "%x" "$i")
	printf "\x00\xC0\x$hex"

	playnote $((RANDOM % 64 + 32))
done

printf "\xFF\x2F\x00"

Fuente: https://www.youtube.com/watch?v=zRF1S-8P6_k

Tal vez tengas que instalar esta fuente de sonidos:

sudo apt-get install fluid-soundfont-gm

Y luego editar el fichero /etc/timidity/timidity.cfg para cambiarlo.

wall

Comando para enviar mensajes a todos los usuarios con terminal del sistema. Símplemente se pone lo que quieres y se cierra con control+D

Si quieremos enviar a uno sólo se puede averiguar cual es su terminal com el comando:

$ w

Y luego enviarle en mensaje:

$ echo "Hola" > /dev/pts/2

Probar, ya que estamos:

$ sudo cat /dev/sda1 > /dev/pts/2

xxd

Volcado hexadecimal.

bits=$(echo -n $1 | xxd -b | cut -d" " -f2- | sed -e 's/[^01]//g' -e 's/\(.\)/ \1/g' | \
tr -d "\n" | tr "01" "-+") 
for t in $bits
do
 setleds -D ${t}caps < /dev/tty7
sleep "0.01"
done

Este script transforma el argumento pasado en binario para apagar o encender el led de mayúsculas con el comando setleds. De esta manera, crea un curioso y primitivo mecanismo de visualización de los bits.


Fuente de algunos de los comandos: Commandlinefu