Comandos y trucos de viejo lobo SysAdmin

Empecé a editar este artículo hace varios meses. Finalmente me aburrí de recopilar comandos y lo publico tal como está. Si recuerdo algunos que se me hayan pasado por alto, o descubro nuevos, los iré agregando. Seguramente falten muchos que uso periódicamente y no me dí cuenta de agregar.

Quisiera compartir una lista de comandos útiles que suelo utilizar día a día, sin una organización u orden aparente. Son muchos de los comandos que todo SysAdmin conoce o está familiarizado. Tal vez muchos resulten básicos (por no usar otro adjetivo) para un SysAdmin, sin embargo pueden no serlo para alguien que recién comienza a interactuar con una shell.







Indice

Al grano.

Una forma rápida de vaciar un archivo es redirigir una salida nula:

> archivo

No confundir con ir al directorio padre cd .. . Funciona como la flecha izquierda de los navegadores:

cd -

cd

tail -f /var/log/syslog

netstat -tulpn

netstat -xlpn

Práctico cuando necesitamos incluir una contraseña como parte de un comando, para no divulgarla en el historial. Sólo es necesario dejar un espacio en blanco delante del comando:

COMANDO

apt-get update && apt-get upgrade

Sólo se deben utilizar dos guiones del medio. Por ejemplo quiero buscar dos guiones del medio consecutivos en cierto contenido utilizando grep :

root@debian:~# history | grep '--' Usage: grep [OPTION]... PATTERN [FILE]... Try 'grep --help' for more information.

Aunque utilice comillas, grep interpreta el guión del medio como delimitador de una opción. La forma correcta es:

root@debian:~# history | grep -- -- 167 git commit --amend --reset-author 508 history | grep '--'

En el primer comando, grep interpreta los guiones como opciones, a pesar de que se utilicen comillas, comillas dobles o escapes. En el segundo ejemplo, primero se indica a grep que deje de interpretar opciones y luego se pasa el parámetro sin inconvenientes.

Utilizar al opción -p de mkdir :

mkdir -p /ruta/a/un/directorio/anidado

cat > archivo

Para finalizar, presionar Ctrl+D (atajo de teclado para EOF , End Of File).

Una forma rápida para saber qué archivos de log están siendo utilizados por demonios o servicios:

lsof | grep "\.log"

En el artículo Tip: cómo ocultar el proceso grep en la salida de ps compartí este ingenioso truco.

root@hal9000:/usr/home/emi # ps x | grep "ntpd" 1620 - Ss 0:00.07 /usr/sbin/ntpd -c /etc/ntp.conf -p /var/run/ntpd.pid -f /var/db/ntpd.drift 1682 2 S+ 0:00.00 grep ntpd

Simplemente se debe encerrar cualquier letra del patrón de búsqueda entre corchetes:

root@hal9000:/usr/home/emi # ps x | grep "[n]tpd" 1620 - Ss 0:00.07 /usr/sbin/ntpd -c /etc/ntp.conf -p /var/run/ntpd.pid -f /var/db/ntpd.drift

Otro interesante comando que compartí previamente en el artículo Listar los archivos modificados en las últimas 24 horas:

find . -type f -mtime -1 -exec ls -gGh --full-time '{}' \; | cut -d ' ' -f 4,5,7

netstat -tupn | grep EST

Información útil que provee netstat :

netstat -tupnee

netstat -s

El utilitario basename remueve el directorio y sufijo en un nombre de archivo. Muy útil al momento de crear scripts:

root@linuxito:/usr/local/nginx# pwd /usr/local/nginx

root@linuxito:/usr/local/nginx# basename $(pwd) nginx

Si hemos lanzado un proceso largo en primer plano, y deseamos que continúe ejecutando en segundo plano (como si lo hubiésemos lanzado con & ), sólo es necesario presionar Ctrl+Z para suspenderlo y luego bg para que continúe en background.

emi@hal9000:~ % ping 8.8.8.8 >/dev/null ^Z Suspended emi@hal9000:~ % jobs [1] + Suspended ping 8.8.8.8 > /dev/null emi@hal9000:~ % bg 1 [1] ping 8.8.8.8 > /dev/null & emi@hal9000:~ % jobs [1] Running ping 8.8.8.8 > /dev/null

Si hemos lanzado un proceso en segundo plano y deseamos terminarlo abruptamente (kill), no es necesario conocer su PID. Es posible matarlo indicando su número de trabajo:

emi@hal9000:~ % jobs [1] Running ping 8.8.8.8 > /dev/null emi@hal9000:~ % kill %1 emi@hal9000:~ % jobs [1] Terminated ping 8.8.8.8 > /dev/null

En Bash, la variable $ expande al PID de la sesión actual (instancia de Bash en ejecución):

echo $$

Algo como lo que haría un administrador de bases de datos al usar COUNT(*) en conjunto con GROUP BY . Contar la cantidad de repeticiones de una misma fila utilizando sort y uniq :

[COMANDO] | sort | uniq -c | sort -nr

Una vez más grep al rescate, por lejos mi comando favorito:

grep -r 'ssl' /etc/apache2/*

Este comando busca recursivamente la palabra "ssl" dentro del contenido de todos los archivos dentro del directorio /etc/apache2/ .

Con la opción -iname se ignoran mayúsculas/minúsculas (case) en los nombres de archivo. Utilizar asteriscos para buscar patrones:

find /etc/apache2/ -iname "*.conf"

Pasar el nombre de dispositivo como parámetro a file :

root@devuan:~# file -s /dev/sda1 /dev/sda1: Linux rev 1.0 ext4 filesystem data, UUID=bed6a1f2-ec59-4913-9af6-0e2f66ac2954, volume name "ROOT" (needs journal recovery) (extents) (large files) (huge files)

El comando tac es cat pero concatena e imprime en orden reverso:

tac ARCHIVO

root@devuan:~# cat /etc/shells # /etc/shells: valid login shells /bin/sh /bin/dash /bin/bash /bin/rbash root@devuan:~# tac /etc/shells /bin/rbash /bin/bash /bin/dash /bin/sh # /etc/shells: valid login shells

El comando rev permite invertir un string (transformar "hola" en "aloh"). Opera sobre cada línea de un archivo de manera individual:

root@devuan:~# rev /etc/shells sllehs nigol dilav :sllehs/cte/ # hs/nib/ hsad/nib/ hsab/nib/ hsabr/nib/

Para buscar ayuda en páginas de manual (por ejemplo, si no conocemos la página de manual que debemos consultar) recurrir a apropos :

apropos PALABRA_CLAVE

Hay varias formas de hacerlo:

tree ps -ejH ps axjf

hexdump -C ARCHIVO

Trivial:

yes | COMANDO

Yes imprime el caracter 'y' forever, no como el pájaro de Homero.

La herramienta bc se puede utilizar como calculadora de línea de comandos:

emi@hal9000:~ % echo "1024*1024" | bc 1048576

Y de todos los grupos a los que pertenecemos:

emi@hal9000:~ % id uid=1001(emi) gid=0(wheel) groups=0(wheel),44(video),920(vboxusers)

Matar o enviar cualquier señal por nombre de ejecutable en vez de PID:

pkill PROGRAMA

Si necesitamos conectar tanto la salida estandar (stdout) como la salida de errores (stderr) de un proceso, a la entrada estandar (stdin) de otro, debemos agregar ampersand luego del pipe:

COMANDO1 |& COMANDO2

Actualizado: noviembre de 2017.



Tal vez pueda interesarte

