Publi

20 Cosas chulas que se pueden hacer en una terminal de GNU/Linux

Un poco como continuación de un post de hace casi 2 años, en el que comentaba ejemplos de cosas que se pueden hacer con Bash en una o dos líneas de código.

Ahora quiero hacer cosas un poco más complejas (y alguna que otra sencilla, pero curiosa), en una nueva sección de códigos para copiar y pegar en vuestros terminales:

Servidores

Montar un servidor FTP rápido

Ésta es una solución para un apaño, para el caso en que necesitemos activar un servidor FTP para pasar un fichero a alguien, o para que nos pasen algún fichero… o por ejemplo por si queremos instalar un plugin en WordPress rápidamente y somos unos paranoicos de la seguridad (y por tanto no queremos dejar un servidor FTP corriendo siempre).
Dependencias: python y pyftpdlib

1
$ sudo python -m pyftpdlib

Si queremos lanzar el servidor en un puerto diferente al 21:

1
$ sudo python -m pyftpdlib -p2121

Si además queremos dar permisos de escritura en la carpeta actual:

1
$ sudo python -m pyftpdlib -p2121 -w

Sacar listado de las ips que más han visitado una web servida por Apache

Dependencias: Apache
Si queremos conocer las direcciones que más han entrado hoy nuestro servidor.

1
cat /path/to/access.log |awk '{print $1}' |sort |uniq -c |sort -n |tail

Podríamos cambiar el cat por tail -n X, así vemos sólo las últimas visitas.
Fuente: Count IP Addresses in Access Log File

Descargar una URL cambiando el User-agent

Para ver con los ojos de un robot, o para hacer pruebas con nuestros scripts:

1
$ curl -A "Mozilla/5.0 (compatible; bingbot/2.0; +http://www.bing.com/bingbot.htm)" http://mi-web.com

Así me disfrazo del robot de rastreo de Microsoft…

Borrar todas las bases de datos de un servidor MySQL excepto mysql, test e information_schema

A veces, necesitamos limpiar un servidor de base de datos, o quitar todas las tablas menos algunas:
Dependencias: MySQL

1
mysql -uroot -p[password] -e "SHOW DATABASES" grep -v 'Database\|mysql\|test\|information_schema' | awk '{print "DROP DATABASE " $1 ";select sleep(0.1);"}' | mysql -uroot -p[password]

Si no queremos poner el password de la base de datos en la línea de comandos, nos lo pedirá dos veces.

Barra de progreso al importar datos a MySQL

Cuando tenemos gran cantidad de datos para importar, muchas veces nos ponemos de los nervios al ver que no acaba, y como no sabemos cuánto queda, nos frustramos y desesperamos. Para ello, tengo varias soluciones, una sin entorno gráfico (para servidores) y otra con él (para escritorio)

Dependencias: mysql, pv

1
$ pv -n backup.sql | mysql -uroot -ppassword base

Y ahora con entorno gráfico, vamos con barra de progreso y notificación al final:
Dependencias: mysql, pv, zenity, notify-send

1
$ (pv -n backup.sql | mysql -uroot -ppassword base) 2>&1 | zenity --progress --auto-close --title "Importando..." ; notify-send "La importación de base de datos ha terminado"

Adminsitración

Módulos del kernel instalados en el sistema

En muchas instalaciones podemos pedir el listado de módulos instalados en el sistema con:

1
$ modprobe -l

Pero en otros sitios no funciona. De todas formas, es un listado de archivos con extensión .ko a partir de una ruta específica, así que:

1
$ find /lib/modules/$(uname -r)/ -iname "*$1*.ko*" | cut -d/ -f5-

Dibujar un árbol jerárquico de archivos y directorios (tree)

Bueno, el caso es hacer algo parecido al comando tree sin tener el comando tree.

1
$ ls -R | grep ":$" | sed -e 's/:$//' -e 's/[^-][^\/]*\//--/g' -e 's/^/ /' -e 's/-/|/'

Fuente: Tree

Borrar una estructura de archivos y directorios en una carpeta a parte

No sé cómo explicar esto, es un poco difícil, imaginemos que estamos dentro de un directorio X que tiene unos archivos y unos directorios dentro, luego tenemos un directorio Y que tiene lo mismo que X junto con más cosas.
El caso típico es la instalación a mano de plugins en ciertos programas. El plugin tiene muchos archivos que se copian junto con otros archivos del programa, por lo que tendremos los archivos del programa y el plugin mezclados.
Lo que queremos hacer es borrar el plugin:

1
function deltwin() { FILE=${1:2}; DPATH=$3; COMMAND=$2; $COMMAND $DPATH$FILE; }; find . | while read file; do deltwin "$file" rm "/directorio/de/programa"; done

Para usar esto, nos ponemos en el directorio que contiene la estructura que queremos borrar (pero la queremos borrar de /directorio/de/programa).

Cambiar stack size sin ser root (o cualquier cosa de ulimit)

Tal vez queremos cambiar algún parámetro de ulimit dentro del usuario actual y nos deniega el permiso. Puesto que ulimit no tiene ejecutable asociado, no podemos usarlo directamente con sudo. Y si nos hacemos root, no somos el usuario que queremos ser…

Dependencias: sudo configurado y usuario en sudoers.

1
$ sudo sh -c "ulimit -s 8192000 && exec su user"

Sacar un listado de directorios ordenados por tamaño

Muy útil cuando nos estamos quedando sin sitio en el disco y no sabemos dónde se nos ha ido. Aunque tarda un montón si nuestro disco es grande.

1
du -kx | egrep -v "\./.+/" | sort -n

Listar los archivos más grandes dentro de todas las carpetas

Encuentra todos los archivos a partir de la ruta actual y los ordena por tamaño. Alguna vez he encontrado un .iso perdido en mi hdd que no hacía más que comer espacio.

1
find ~ -type f -exec ls -s {} \; | sort -n

Reiniciar un dispositivo de entrada en Linux

En ocasiones, puede que un ratón / touchpad u otro dispositivo de entrada deje de funcionar correctamente en nuestro servidor X. Para ello, primero averiguamos el ID del dispositivo con:

1
$ xinput

Luego hacemos:

1
2
$ xinput disable ID
$ xinput enable ID

Nos podemos ahorrar muchos reinicios innecesarios con esto.

Cambiar el título de una ventana bajo el ratón

Escribimos el nombre, hacemos click en la ventana y tendrá otro nombre. Muy útil para organizar nuestro escritorio.
Dependencias: zenity, wmctrl

1
$ zenity --entry "Titulo de la ventana" | xargs -i /usr/bin/wmctrl -r :SELECT: -N "{}"

Comprimir un tar.gz en multi-hilo

Cuando creamos un archivo tar.gz con

1
$ tar cvzf archivo.tar.gz archivo_a_comprimir1 archivo_a_comprimir1 ...

la compresión se realiza en un sólo núcleo del procesador por lo que, cuando hay gran cantidad de datos, la compresión puede ser muy lenta. Pero podemos utilizar pigz para comprimir, si tenemos varios procesadores o varios núcleos, podremos aprovecharlos todos para realizar la compresión. Y es tan fácil como:

1
$ tar -I pigz -vcf archivo.tar.gz [archivos a comprimir]

Es lo mismo pero sustituyendo el argumento z por el comando que queremos utilizar para realizar la compresión. Si por ejemplo quiero comprimir mi carpeta de documentos y descargas:

1
$ tar -I pigz -vcf documentos_y_descargas.tar.gz Documentos/ Descargas/

Para descomprimir, como siempre, en lugar de usar c, usamos x:

1
$ tar -I pigz -vxf documentos_y_descargas.tar.gz

Cifras y letras

Búsquedas en un archivo con contexto

Con la siguiente instrucción podemos buscar un patrón dentro de un fichero y veremos 3 líneas por arriba y 3 líneas por abajo. Muy útil para no perdernos cuando buscamos en textos muy extensos.

1
$ grep -C3 patron fichero

Por cierto, el patrón puede ser un texto sencillo o una expresión regular.

Sacar N dígitos del número PI

Una frikada en toda regla…

1
$ echo "scale=N; a(1)*4" | bc -l

Donde N=10, 100, 1000, 12345… no lo hagáis muy grande porque puede tardar mucho tiempo…

Obtener un número aleatorio

Es nuestro dado para la terminal:

1
head -c 1 /dev/random | od -An -td | sed 's/\s*\(.*\)\s/\1/g'

Ya que sólo sacamos un byte, el número más grande será 255, pero podemos sacar números más grandes aumentando el valor. Si pedimos más de 4 bytes, el resultado se dividirá en dos números.
Fuente: Código para llevar

Extraer una cadena de texto aleatoria

1
$ echo "$(dd if=/dev/urandom bs=30 count=1 2> /dev/null)"

Si te parece demasiado aleatoria, démosle caracteres más normales…

1
$ echo "$(dd if=/dev/urandom bs=64 count=1 2> /dev/null)" | tr -dc 'a-zA-Z0-9'

También lo podemos hacer con openssl:

1
$ openssl rand -base64 32

Esta forma puede dar el siguiente error: unable to write ‘random state’, normalmente se debe a que el archivo $HOME/.rnd es propiedad de otro usuario, como puede ser root.

Crear un comando rot13 para consola

Diversión sin límites codificando mensajes con el algoritmo rot13:

1
alias rot13="tr a-zA-Z n-za-mN-ZA-M"

Así podremos hacer lo siguiente:

$ echo «Hola mundo!» | rot13
Ubyn zhaqb!
$ echo «Ubyn zhaqb!» | rot13
Hola mundo!

¿Quieres hacer un rot47? Puedes hacer (ten cuidado, tienes que escapar los !):

1
alias rot47="tr '\!-~' 'P-~\!-O'"

Y la cosa quedará así:

$ echo «Hola Mundo!» | rot47
w@=2 |F?5@P
$ echo «w@=2 |F?5@P» | rot47
Hola Mundo!

Reemplazar espacios por guiones bajos sólo en el texto entrecomillado

1
$ echo "<a href="http://miweb.com/una">Una ruta con espacios</a>" | awk 'BEGIN { FS = """; OFS=""" } { gsub(" ","_",$2); print }'

En el ejemplo se ve muy claro, sólo cambiamos los espacios de la URL que está entre comillas.

¿ Alguna curiosidad interesante o algún mini-script que te haya salvado la vida ? Me encantaría leer vuestros comentarios.

Actualización 16-02-2015 : Añadido un truco más para que quede un número redondo.
Actualización 16-11-2016 : Un par de correcciones de caracteres que no se veían bien
Actualización 09-02-2017 : Añado rot47 junto con rot13 (Gracias a Romualdo Soler por Facebook).

Foto: Robert Couse-Baker (Flickr CC-by)

También podría interesarte....

There are 5 comments left Ir a comentario

  1. Pingback: 20 Cosas chulas que se pueden hacer en una terminal de Linux | PlanetaLibre /

  2. Eduardo Magrané /
    Usando Mozilla Firefox Mozilla Firefox 35.0 en Ubuntu Linux Ubuntu Linux

    Ver los archivos modificados en las últimas 24 horas.

    find ./ -type f -mtime 0

  3. jebe /
    Usando Mozilla Firefox Mozilla Firefox 49.0 en Ubuntu Linux Ubuntu Linux

    cal 2 1700
    ncal -b 2 1700

    pista:
    ncal -p

    1. Gaspar Fernández / Post Author
      Usando Mozilla Firefox Mozilla Firefox 48.0 en Ubuntu Linux Ubuntu Linux

      Muy interesante 🙂 Gracias por tu comentario!

Leave a Reply to Anónimo Cancle Reply