20 comandos de Linux que todo administrador de sistemas debe conocer

En un mundo lleno de nuevas herramientas y entornos de desarrollo diversos, es prácticamente necesario que cualquier desarrollador o ingeniero aprenda algunos comandos básicos.

Los comandos y paquetes específicos pueden ayudar a los desarrolladores a organizar, solucionar problemas y optimizar sus aplicaciones. Así, cuando las cosas salen mal, pueden proporcionar información valiosa a los operadores y administradores de sistemas.

Si eres un desarrollador nuevo o deseas administrar tu propia aplicación, los siguientes comandos básicos de sysadmin pueden ayudarte a comprender mejor tus aplicaciones.

También pueden ayudarte a describir dificultades para la solución de problemas de los administradores de sistemas. Por ejemplo, por qué una aplicación podría funcionar localmente pero no en un host remoto. Estos comandos se aplican a entornos de desarrollo de Linux, contenedores, máquinas virtuales (VM) y servidores dedicados.

Comandos que todo sysadmin debe conocer

1. curl

curl transfiere una URL. Utiliza este comando para probar el punto final de una aplicación o la conectividad a un punto final de servicio upstreamcurl puede ser útil para determinar si tu aplicación puede llegar a otro servicio, como una base de datos, o verificar si tu servicio está en buen estado.

Como ejemplo, imagina que tu aplicación muestra un error HTTP 500 que indica que no puede encontrar una base de datos MongoDB:

La opción -I muestra la información del encabezado y la opción -s silencia el cuerpo de la respuesta. Verificación del punto final de tu base de datos desde tu escritorio local:

Entonces, ¿Cuál podría ser el problema? Comprueba si tu aplicación puede llegar a otros lugares además de la base de datos desde el host de la aplicación:

Eso parece estar bien. Ahora intenta llegar a la base de datos desde el host de la aplicación. Tu aplicación está usando el nombre de host de la base de datos, así que intenta eso primero:

Esto indica que tu aplicación no puede resolver la base de datos porque la URL de la base de datos no está disponible o el host (contenedor o VM) no tiene un servidor de nombres que pueda usar para resolver el nombre de host.

2. python -m json.tool / jq

Después de emitir curl, la salida de la llamada API puede ser difícil de leer. A veces, deseas usar pretty-print para JSON para encontrar una entrada específica. Python tiene una biblioteca JSON incorporada que puede ayudar con esto.

Debes utilizar python -m json.tool para indentar y organizar JSON. Para usar el módulo JSON de Python, debes usar tuberías para la salida de un archivo JSON en el comando python -m json.tool.

Si deseas usar la biblioteca Python, debes canalizar la salida a Python con la opción -m (módulo).

Para un análisis de JSON más avanzado, puedes instalar jqjq proporciona algunas opciones que extraen valores específicos de la entrada JSON. Para imprimir como el módulo Python anterior, simplemente aplica jq a la salida.

3. ls

Ls te permite listar los archivos en un directorio. Los administradores de sistemas y los desarrolladores usan este comando con bastante frecuencia. En el espacio del contenedor, este comando puede ayudar a determinar el directorio y los archivos de la imagen del contenedor.

Además de buscar tus archivos, ls puede ayudarte a examinar tus permisos. En el siguiente ejemplo, no puedes ejecutar myapp debido a un problema de permisos. Cuando verificas los permisos usando ls -l, te das cuenta de que los permisos no tienen una “x” en -rw-r-r–, que son de solo lectura y escritura.

4. tail

tail muestra la última parte de un archivo. Por lo general, no necesitas todas las líneas de registro para solucionar problemas. En cambio, deseas verificar lo que dicen tus registros sobre la solicitud más reciente a tu aplicación. Por ejemplo, puedes usar tail para verificar lo que sucede en los registros cuando realizas una solicitud a tu servidor HTTP Apache.

Utiliza tail -f para seguir los registros HTTP de Apache y ver las solicitudes a medida que ocurren.

La opción -f indica la opción “follow”, que genera las líneas de registro a medida que se escriben en el archivo. El ejemplo tiene un script en segundo plano que accede al punto final cada pocos segundos y el registro guarda la solicitud. En lugar de seguir el registro en tiempo real, también puedes usar tail para ver las últimas 100 líneas del archivo con la opción –n.

5. cat

cat concatena e imprime archivos. Puedes emitir cat para verificar el contenido de tu archivo de dependencias o para confirmar la versión de la aplicación que ya has creado localmente.

El ejemplo anterior verifica si tu aplicación Python Flask tiene Flask listado como una dependencia.

6. grep

grep busca patrones de archivos. Si estás buscando un patrón específico en la salida de otro comando, grep resalta las líneas relevantes. Puedes utilizar este comando para buscar archivos de registro, procesos específicos y más. Si deseas ver si Apache Tomcat se inició, puedes verte abrumado por la cantidad de líneas. Al canalizar esa salida al comando grep, aíslas las líneas que indican el inicio del servidor.

7. ps

ps muestra el estado del proceso. Usa este comando para determinar una aplicación en ejecución o confirmar un proceso esperado. Por ejemplo, si deseas verificar si hay un servidor web Tomcat en ejecución, utiliza ps con sus opciones para obtener el ID de proceso de Tomcat.

Para una mayor legibilidad, debes usar ps y canalizarlo para grep.

8. env

env te permite configurar o imprimir las variables de entorno. Durante la resolución de problemas, puede resultarte útil verificar si la variable de entorno incorrecta impide que tu aplicación se inicie. En el siguiente ejemplo, este comando se utiliza para verificar las variables de entorno establecidas en el host de tu aplicación.

Tenga en cuenta que la aplicación está utilizando Python3 y tiene variables de entorno para conectarse a una base de datos MongoDB.

9. top

top muestra y actualiza la información del proceso ordenado. Aprovecha esta herramienta para determinar qué procesos se están ejecutando y cuánta memoria y CPU consumen. Un caso común ocurre cuando ejecutas una aplicación y deja de funcionar un minuto después. Primero, verifica el error de retorno de la aplicación, que es un error de memoria.

¿Tu aplicación está realmente sin memoria? Para confirmar, usa top para determinar cuánta CPU y memoria consume tu aplicación. Al emitir top, observas una aplicación de Python que utiliza la mayor parte de la CPU, con un aumento en el uso de memoria, y sospechas que es tu aplicación.

Mientras se ejecuta, presiona la tecla “C” para ver el comando completo y realizar ingeniería inversa si el proceso es tu aplicación. Resulta ser su aplicación de memoria intensiva (memeater.py). Cuando tu aplicación se ha quedado sin memoria, el sistema la elimina con un error de falta de memoria (OOM).

El uso de la memoria y el CPU de la aplicación aumenta, y finalmente OOM la elimina.

Al presionar la tecla “C”, puedes ver el comando completo que inició la aplicación.

Además de verificar tu propia aplicación, puedes aprovechar top para depurar otros procesos que utilizan CPU o memoria.

10. netstat

netstat muestra el estado de la red. Este comando muestra los puertos de red en uso y tus conexiones entrantes. Sin embargo, netstat no viene listo para usar en Linux.

Si necesitas instalarlo, puedes encontrarlo en el paquete net-tools. Como desarrollador que experimenta localmente o envía una aplicación a un host, puedes ver un error de que un puerto ya está asignado o una dirección ya está en uso. Usando netstat con protocolo, proceso y opciones de puerto demuestra que el servidor HTTP Apache ya usa el puerto 80 en el siguiente host.

Al usar netstat -tulpn muestra que Apache ya usa el puerto 80 en esta máquina.

11. ip address

Si ip address no funciona en tu host, debes instalarlo con el paquete iproute2. ip address muestra las interfaces y las direcciones IP del host de tu aplicación. Puedes usar ip address para verificar tu contenedor o la dirección IP del host.

Por ejemplo, cuando tu contenedor está conectado a dos redes, ip address puede mostrar qué interfaz se conecta a qué red. Para una verificación simple, siempre puedes usar el comando ip address para obtener la dirección IP del host. El siguiente ejemplo muestra que el contenedor de nivel web tiene la dirección IP 172.17.0.2 en la interfaz eth0.

El uso de ip address muestra que la dirección IP de la interfaz eth0 es 172.17.0.2

12. lsof

lsof enumera los archivos abiertos asociados con tu aplicación. En algunas imágenes de máquinas Linux, debes instalar lsof con el paquete lsof. En Linux, casi cualquier interacción con el sistema se trata como un archivo.

Como resultado, si tu aplicación escribe en un archivo o abre una conexión de red, lsof reflejará esa interacción como un archivo. Similar a netstat, puedes usar lsof para verificar los puertos de escucha.

Por ejemplo, si deseas verificar si el puerto 80 está en uso, debes utilizar lsof para verificar qué proceso lo está usando. A continuación, puedes ver que httpd (Apache) escucha en el puerto 80. También puedes usar lsof para verificar el ID de proceso de httpd, examinando dónde reside el binario del servidor web (/usr/sbin/httpd).

lsof muestra que httpd escucha en el puerto 80. Al examinar el ID de proceso de httpd también se muestran todos los archivos que httpd necesita para ejecutarse.

El nombre del archivo abierto en la lista de archivos abiertos ayuda a determinar el origen del proceso, específicamente Apache.

13. df

Puedes usar df (mostrar espacio libre en disco) para solucionar problemas de espacio en disco. Cuando ejecutas tu aplicación en un orquestador de contenedores, puedes ver un mensaje que indica la falta de espacio libre en el host del contenedor.

Si bien un administrador de sistemas debe administrar y optimizar el espacio en disco, puedes usar df para calcular el espacio existente en un directorio y confirmar si realmente no tiene espacio.

Df muestra el espacio en disco para cada sistema de archivos, su espacio absoluto y disponibilidad.

La opción -h imprime la información en formato legible para humanos. El ejemplo anterior muestra mucho espacio en disco en este host.

14. du

Para recuperar información más detallada sobre qué archivos usan el espacio en disco en un directorio, puedes usar el comando du. Si deseas averiguar qué registro ocupa más espacio en el directorio /var/log, por ejemplo, puedes usar du con la opción -h (legible por humanos) y la opción -s para el tamaño total.

El ejemplo anterior revela que el directorio más grande en /var/log es /var/log/audit. Puedes usar du junto con df para determinar qué utiliza el espacio en disco en el host de tu aplicación.

15. id

Para verificar el usuario que ejecuta la aplicación, puedes emplear el comando id para conocer la identidad del usuario. El siguiente ejemplo utiliza Vagrant para probar la aplicación y aislar su entorno de desarrollo.

Después de iniciar sesión en Vagrant, si intentas instalar Apache HTTP Server (una dependencia), el sistema indica que no puede ejecutar el comando como root. Para verificar tu usuario y grupo, debes emitir el comando id y observar que te estás ejecutando como usuario “vagrant” en el grupo “vagrant”.

Para corregir esto, debes ejecutar el comando como superusuario, que proporciona privilegios elevados.

16. chmod

Cuando ejecutas tu aplicación binaria por primera vez en tu host, puedes ver el mensaje de error “permiso denegado”. Como se ve en el ejemplo de ls, puedes verificar los permisos de tu aplicación binaria.

Esto muestra que no tienes derechos de ejecución (no hay “x”) para ejecutar el binario. chmod puede corregir los permisos para permitir que tu usuario ejecute el binario.

Como lo demostramos en el ejemplo, esto actualiza los permisos con derechos de ejecución. Ahora, cuando intentas ejecutar tu binario, la aplicación no muestra un error de permiso denegado.

Chmod también puede ser útil cuando cargas un binario en un contenedor. Asegura que tu contenedor tenga los permisos correctos para ejecutar tu binario.

17. dig/nslookup

Un servidor de nombres de dominio (DNS) ayuda a resolver una URL a un conjunto de servidores de aplicaciones. Sin embargo, es posible que una URL no se resuelva, lo que causa un problema de conectividad para tu aplicación.

Por ejemplo, supongamos que intentas acceder a tu base de datos en la URL de mydatabase desde el host de tu aplicación. En su lugar, verás un error “no se puede resolver”.

Para solucionar el problema, intenta usar dig (utilidad de búsqueda DNS) o nslookup (consultar servidores de nombres de Internet) para descubrir por qué la aplicación parece no poder resolver la base de datos.

El uso de nslookup muestra que mydatabase no se puede resolver. Ahora intentamos resolver con dig y produce el mismo resultado.

Estos errores pueden ser causados ​​por muchos problemas diferentes. Si no puedes depurar la causa raíz, comunícate con tu administrador de sistemas para obtener más información.

Para las pruebas locales, este problema puede indicar que los servidores de nombres de tu host no están configurados adecuadamente. Para usar estos comandos, necesitarás instalar el paquete BIND Utilities.

18. iptables

iptables bloquea o permite el tráfico en un host Linux, similar a un firewall de red. Esta herramienta puede evitar que ciertas aplicaciones reciban o transmitan solicitudes.

Más específicamente, si tu aplicación tiene dificultades para llegar a otro punto final, iptables puede estar negando el tráfico al punto final. Por ejemplo, imagina que el host de tu aplicación no puede  ir a Binaria.uno. Debes utilizar curl para probar la conexión.

La conexión agotó el tiempo de espera. Sospechamos que algo podría estar bloqueando el tráfico, por lo que veremos las reglas de iptables con la opción -S.

Las primeras tres reglas muestran que el tráfico pasa por defecto. Las reglas restantes permiten el tráfico SSH y DNS. En este caso, debes realizar un seguimiento con tu administrador del sistema si necesitas una regla para permitir el tráfico a puntos finales externos.

Si este es un host que usas para desarrollo local o pruebas, puedes usar el comando iptables para permitir el tráfico correcto. Ten cuidado al agregar reglas que permitan el tráfico a tu host.

19. sestatus

Por lo general, encuentras que SELinux (un módulo de seguridad de Linux) se utiliza en un host de aplicaciones administrado por una empresa. SELinux proporciona acceso con privilegios mínimos a los procesos que se ejecutan en el host, evitando que procesos potencialmente maliciosos accedan a archivos importantes en el sistema.

En algunas situaciones, una aplicación necesita acceder a un archivo específico, pero puede generar un error. Para verificar si SELinux bloquea la aplicación, utiliza tail y grep para buscar un mensaje de “denegado” en el registro /var/log/ audit. De lo contrario, puedes verificar si la casilla tiene habilitado SELinux utilizando sestatus.

El resultado anterior indica que el host de la aplicación tiene SELinux habilitado. En tu entorno de desarrollo local. Puedes actualizar SELinux para que sea más permisivo. Si necesitas ayuda con un host remoto, tu administrador de sistemas (o tú) puede ayudarte a determinar la mejor práctica para permitir que tu aplicación acceda al archivo que necesitas.

20. history

Cuando emites tantos comandos para probar y depurar, ¡puedes olvidar los útiles! Cada shell tiene una variante del comando de history. Este muestra el historial de comandos que has emitido desde el inicio de la sesión. Puede usar history para ver qué comandos utilizaste para solucionar problemas de tu aplicación. Por ejemplo, si usas history durante el desarrollo de este artículo, mostrará los diversos comandos con los que experimentaste y aprendiste.

¿Qué sucede si deseas ejecutar un comando en tu historial anterior, pero no deseas volver a escribirlo? Solo debes usar antes del número de comando para volver a ejecutar.

Agregando ! antes del número de comando que deseas ejecutar emite el comando nuevamente.

Conclusión

Los comandos básicos pueden mejorar tu experiencia en resolución de problemas. Te permiten determinar por qué tu aplicación funciona en un entorno de desarrollo, pero quizás no en otro.

Muchos administradores de sistemas aprovechan estos comandos para depurar problemas con los sistemas. Comprender algunos de estos comandos útiles de solución de problemas puede ayudar a comunicarte con administradores de sistemas y resolver problemas con tu aplicación.