Línea de comandos de Línux
La línea de comandos de linux es todo un mundo de poder, precisión y flexibilidad que no se iguala con nada. Quien aprende a trabajar con ella pronto estará alcanzando un nivel de workflow increíble, además de todo el verdadero potencial de su computador o servidor.
A través del tiempo de los sistemas operativos como Linux, Windows y Macs han estado en constante desarrollo ya que gracias a estas los usuarios normales de los OS pueden ver de forma amigable lo que hacen frente a su pantalla. Sin embargo estas interfaces se dedican a cubrir sólo una parte muy ínfima de poder y funcionalidad, sea el SO (Sistema Operativo) que sea.
Cuando se trata de aprovechar al máximo los niveles de instrucción en una máquina o servidor, es vital incorporar conocimientos a tus skills sobre la línea de comandos. En éste artículo me dedique a realizar un compendio de los comandos y wildcards (opciones que te regalan mayor performance y precisión) más complicados y difíciles de recordar con lo cual puedas ensayar un breve experimento que conocí.
El siguiente experimento y compendio está basado en la línea de comandos de Linux, y más específicamente inspirado en el libro The Linux Command Line (en inglés).
Experimento
Resulta que cuando aprendes algo nuevo sea por un tutorial, lectura o enseñanza prática en el momento puedes retener según el estimado de profesionales sólo un 20–30% de lo que aprendes hasta el día siguiente. Y que pasa con el resto? Pues, si no lo practicas, se olvida.
Así que quisiera que siguieras ésta secuencia de aprendizaje con éste artículo a ver como te va. Me cuentas en los comentarios si efectivamente te funciona:
El experimento se trata de luego de leer esta guía con el compendio de comandos, se supone que retenerás el 20% de lo que hay acá. Entonces, que tal si seguimos una secuencia de lectura de la siguiente forma: primera lectura, segunda lectura en 24 horas, 3era lectura en 7 días y 4ta lectura en 1 mes.
Esta secuencia incrementa las posibilidades de alojar en memoria al menos el 90% de lo que estás leyendo sin ningún esfuerzo ni práctica, sólo leyendo con ese período. Intento garantizar con esto que no olvidarás ninguno de los comandos listados en la guía.
Todo este compendio fué hecho de leer completamente el libro de linuxcommand.org, el cual puedes descargar en ese enlace o acá. Me he leído el libro entero en un fin de semana eh? Así que pude retener bastante de lo que leí porque ya conozco algo sobre la línea de comandos de linux. Sin embargo los comandos listados abajo son los que consideré necesarios para realizar el experimento del que te hablo.
Compendio de comandos
Algunos comandos básicos de navegación en el sistema de archivos:
- Usando el comando ls -la — color podemos listar todos los archivos (incluido ocultos), los permisos, el grupo y el usuario al que pertenecen en forma de columna y colorida.
- Si se usa ls -lt se listarán todos los archivos incluyendo la fecha de creación/modificación respectiva.
- -rw-r — r — — Derechos de acceso al archivo correspondiente. El primer caracter indica el tipo de elemento. Cuando aparece un guión o una `f`, indica que es un archivo, cuando es una `l` indica un link simbólico o comunmente conocido acceso directo y cuando es una `d` indica un elemento de tipo directorio. Los siguientes 3 caracteres son los permisos de acceso para el dueño del archivo, los siguientes tres son para los permisos que tienen los miembros del grupo al que pertenece el dueño del archivo, y los últimos 3 corresponden para los permisos de todo el resto de los usuarios que puedan tener acceso al archivo.
- Cuando es usado el comando less, existen ciertas funciones que podemos usar en el archivo una vez abierto. Importante, solo podemos usar el comando less en archivos donde su contenido es de tipo ASCII…
- Para anidar comandos compatibles con la navegación y listados de archivos puedes usar los operadores $(…), por ejemplo cuando deseas listar el contenido del directorio de un programa sin necesidad de conocer su ruta absoluta: ls -l $(which cp).
- Si deseas encontrar, listar, ver o buscar archivos que contengan espacios en sus nombres largos, es preciso usar `”comillas dobles”` para escribir el nombre entero incluyendo la extensión. Ejemplo: ls -l “two words.txt”
- Para encontrar comandos usados anteriormente en la consola podemos ejecutar el siguiente ejemplo: history | grep palabra_clave_o_termino, en el resultado se nos mostrarán los resultados junto al número de línea en el que se encuentra en el historial. Al identificar la línea del comando que necesitamos sólo necesitamos introducir: !nro_de_linea_a_elegir y luego enter, se ejecutará la seleccionada automáticamente.
Algunos directorios encontrados en el sistema de archivos de Linux:
- /bin: Contiene los archivos de programa vitales para que linux pueda funcionar. Incluye los normalmente usados por el sysadmin o los usarios durante la sesión.
- /boot: Contiene el Kernel de Linux y el boot loader.
- /dev: Contiene todos los dispositivos reconocidos y activos por el sistema en la sesión.
- /etc: Contiene todos los archivos de configuración del sistema. Archivos importantes como passwd (con las configuraciones de los usuarios disponibles en el sistema), crontab para automatización de tareas y fstab entre otros.
- /home: Directorio por defecto en el cual todos los usuarios comunes pueden escribir archivos y manejarlos. Este tipo de seguridad en Linux evita que ocurran desastres con permisos no adecuados de usuarios en otras partes vitales del sistema.
- /lib: Este directorio contiene los archivos compartidos usados por el core del sistema. Los archivos contenidos acá son similares a los .DLL de windows.
- /media: Contiene en forma de archivos los dispositivos desmontables como CD, USB y Floppy (si es que aún existen).
- /opt: Similar a bin que almacena archivos de tipo programa del sistema, éste lo hace para archivos comerciales o no pertenecientes al core de linux directamente y pueden ser instalados manualmente.
- /root: Este es el directorio de tipo home para el usuario de tipo root por defecto.
- /sbin: Contiene programas vitales para el sistema que ademas solo pueden ser ejecutados por el root del sistema.
- /tmp: Directorio donde se almacenan los archivos temporales que son creados por programas en el siistema durante la ejecución del mismo. Este directorio se vacia cuando el sistema es reiniciado.
- /usr/share/doc: La mayoría de los paquetes y programas instalados en el sistema incluyen algún tipo de documentación. Acá encontraremos toda esa documentación organizada por el tipo de paquete al que representa.
- /var/log: Contiene los archivos de log des sistema. Son muy importantes y deberían ser monitoreados de vez en cuando. Los más útiles están almacenados en /var/log/messages y/o /var/log/syslog. Por razones de seguridad, algunas distribuciones sólo permiten visualizar estos archivos al superusuario.
Los Wildcards y la manipulación de archivos con mv, cp, rm, ln:
Cuando se está usando alguno de los comandos frecuentes para manipulación de archivos suelen usarse herramientas conocidas como las wildcards. Éstas nos permiten tener una precisión increible al momento de copiar, pegar o mover archivos porque con ellos podemos hacer selecciones totalmente exactas. Las principales y más interesantes son:
Los Wildcards pueden ser usados con cualquier comando que acepte archivos o nombres de archivo como argumento.
Trabajando con comandos:
- type command — Indica como es interpretado un comando.
- which command — Usado para determinar la ubicación exacta de un programa ejecutable dado. Sólo funciona para programas, no en shell builtins y alias.
- apropos — Hasta el momento creo que permite hacer una búsqueda de comandos que coincidan con el termino expresado despues de apropos.
- whatis command — Muestra breve descripción del comando.
- alias ele=”funcion o comando” — Crea un alias o acceso directo conteniendo la función pasada como parámetro. Para remover un alias, debe usarse unalias nombre_de_alias.
- info — Muestra información más detallada incluso que man, ya que puede obtener en formato pdf la información y mostrarla en el bash. Abajo se muestra una serie de comandos usados para controlar el lector durante la visualización del pdf en pantalla:
I/O Redirections — Manejando input/outputs en la línea de comandos:
● cat — Concatenar archivos. Puede ser usado para crear notas de texto rápidas usandolo de la siguiente manera: cat > file.txt, escribiendo el texto deseado y al terminar presionar ctrl+D para finalizar la escritura en el archivo.
● sort — Lista líneas de texto
● uniq — Reporta u omite lineas repetidas de texto
● grep — Este comando se puede usar para encontrar coincidencias en el nombre de un archivo. El método para usarlo es grep palabra, el cual buscará coincidencias en todo el sistema de archivos actual y debajo que contenga en su nombre “palabra”.
● wc — Muestra el nro de líneas, palabras, y bytes del archivo seleccionado
● head — Muestra la primera parte de un archivo
● tail — Muestra la última parte de un archivo
● tee — Lee y escribe entrada/salida de texto estandar y archivos
En los comandos usados para generar salidas a través del Standar Ouput (Stdout) se puede usar un tipo de wildcard especial que nos permite redirigir la salida a un archivo espefico. El mejor ejemplo de esto es usandolo con el comando ls: ls -l > ls-ouput.txt. Como observación, usar sólo el wildcard `>` sobreescribe el archivo por completo, si lo que queremos es agregar al final cada salida al archivo al que apuntamos debemos usar `>>`.
Las salidas se pueden redireccionar identificandolas en base al número identificador anteponiendolas al `>`. 0 = input, 1 = output y 2 = errores. Para redirigirlos todos sin tener que identificar cada tipo de salida, simplemente puedes usar `&>`.
El concatenador de redirección debe ser tratado con respeto ya que el mismo de manera silenciosa escribe o SOBREESCRIBE cualquier archivo que encuentre, por lo que preferiblemente no debe ser usado nunca en modo root o en zonas críticas del sistema.
Permisos y sistema de seguridad:
● id — Muestra la identidad del usuario
● chmod — Cambia el modo de un archivo. El modo de usarlo es chmod notacion archivo
● umask — Da permisos por defecto a un usuario
● su — Ejecuta un nuevo shell bajo otro usuario
● sudo — Ejecuta un comando como usuario root momentaneamente
● chown — Cambia el dueño de un archivo. El modo de hacerlo es ejemplo: chown new_user:new_group archivo
● chgrp — Cambia el grupo de dueño de archivo. Funciona de forma similar a `chown` pero con algunas limitaiciones
● passwd — Cambia la contraseña de los usuarios. Se usa de la siguiente manera: passwd permite cambiar la contraseña del usuario loggeado en el momento. Si este comando es usado de la siguiente forma siendo superadmin: passwd username, podrá cambiar la contraseña de dicho usuario en el sistema.
** Trabajar en la consola en modo root debería ser lo menos frecuente posible, ya que trabajar bajo este usuario permitirá la ejecución de scripts saltando por completo la seguridad impuesta en el sistema Linux. En lugar de esto, cuando se requiera ejecutar comandos o ver archivos que requieren proivilegios de superadmin, preferiblemente usar el prefijo `sudo` antes del comando en cuestión.
Procesos y su funcionamiento en Linux:
● ps — Muestra los procesos en ejecución al momento de hacer el comando. Los estados o status que pueden mostrar los procesos en ejecución son los siguientes:
● top — Muestra tareas en ejecución. Muestra de forma continua cada 3 segundos los procesos activos en la sesión por tipo de proceso y ejecución.
● jobs — Lista trabajos/jobs activos
● bg — Ubica un trabajo/job en segundo plano o background
● fg — Ubica un trabajo/job en primer plano, dando prioridad
● kill — Envía una señal a un proceso determinado
● killall — Destruye procesos identificados por nombre
● shutdown — Apaga o reinicia el sistema
Examinando y administrando redes:
- netstat — Este programa es usado para examinar la configuración y estadísticas de la red del sistema. Podemos ver con el una variedad de características en la configuración de nuestra red. Usando la opción “-ie” podemos examinar las interfaces de nuestra red:
- ftp fileserver — Permite una conexión ftp con un servidor remoto el cual nos permite obtener archivos en consola tal como lo haríamos con Filezilla o similares. La desventaja es que envia datos de autenticación de forma plana.
- wget — Usado para descargar archivos directamente desde internet o servidores remotos que contengan un enlace al cual poder descargar.
- sftp fileserver — Como su nombre lo indica, es una mejora en seguridad del programa ftp. Funciona de lla misma forma que el programa ftp mencionado anteriormente pero en lugar de enviar los datos de autenticación en texto plano, usa un tunel SSH encriptado.
Si consideras que puedes agregar más comandos complicados que debamos recordar en el experimento, agregalos en el evernote público o en los comentarios.