Comandos interesantes
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.
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
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 [1] [2] [3] [4] 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)
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 este peculiar comando 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
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 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.
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.
$PS1
Variable encargada del aspecto y la información del prompt.
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.
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
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