Recuerdo que durante mi estudio de ingeniería, en mi grupo existía la creencia de que Linux era difícil de usar, inestable y problemático. Era común escuchar entre mis amigos que nunca usarían Linux, pero para mi era algo nuevo y ya estaba cansado de que todo el software que utilizamos era de paga, realmente necesitaba alternativas libres que en windows no siempre se ofrecen.
Me decidí a usar Linux como sistema operativo base y fue la mejor decisión que he tomado, desde que ando en el mundo de la tecnología. Ya a 10 años de este suceso, las distribuciones de Linux no eran lo más fácil de usar, al día de hoy puedo decir lo contrario, cosas como Ubuntu, Fedora, etc. Surgen como una excelente solución para un sistema operativo de uso diario.
De igual manera que mis compañeros en la escuela veo que muchos nuevos programadores temen a esta aventura que se llama Linux, sobre todo he notado que es por usar la terminal o consola y entiendo el miedo yo de igual manera inicie así, cuántas particiones me volé, cuantas reinstalaciones tuve que hacer por que ya se habia cagado todo con un comando mal que hice. Pero es parte del aprendizaje, cometer errores, así que si eres nuevo en esto te invito a cometerlos.
Aquí quise recopilar una lista de comandos del diario, los uso dentro de la terminal o generando scripts para ejecutar ciertas acciones, como entregas continua de código, proceso automatizados, etc.
También quise poner al final una lista de los comandos que NUNCA deberías tocar al menos que quieras, claro.
Comandos que debes aprenderte casi del diario para directorio y archivos
Comando pwd
pwd
El acrónimo de “Print Workspace Directory” te arroja la ruta completa de donde está posicionada actualmente tu terminal.
Comando ls
ls
Este comando lista el contenido del fichero que le indiques, por defecto te manda el contenido de donde se posiciona tu terminal. Recibe algunos parámetros entre ellos.
Imprimir resultado en forma de lista:
ls -l
Mostrar archivos ocultos:
ls -a
Ordenar por fecha modificación descendente:
ls -t
Ordenar por fecha modificación ascendente:
ls -tr
También puedes combinarlos:
ls -latr
También indicarle que fichero quieres que liste:
ls -latr /home/user/directorio-prueba
Solo cambia "/home/user/directorio-prueba" por el directorio que quieras, pero que exista obviamente.
Comando cd
cd /home/user/directorio-prueba
Es un acrónimo de “Change directory” y como lo indica nos posiciona la terminal en el directorio que deseas.
solo cambia el "/home/user/directorio-prueba" por el directorio que quieras, pero que exista obviamente.
Comando mkdir
mkdir /home/user/directorio-prueba2
El comando para generar directorios nuevos. Sustituye "/home/user/directorio-prueba2" por la carpeta que deseas crear.
Comando chmod
Este comando te permite cambiar los permisos de un archivo o directorio, uno de los comandos más utilizados para la seguridad. Básicamente cuenta con tres permisos a limitar:
Código | Permiso | Valor octal |
---|---|---|
r | Lectura | 4 |
w | Escritura | 2 |
x | Ejecución | 1 |
Podemos utilizar el código o el valor octal para indicar un permiso, yo generalmente utilizo el valor octal.
por ejemplo si quieres indicar que algo tenga todos los permisos, tendrías que indicar “rwx” y en numérico solo colocas un “7”, es decir, la suma de los valores.
Existe algo llamado clases para indicar al comando quienes reciben el permiso.
Clase | Descripción |
---|---|
Propietario | Es el usuario que ha creado el archivo o la carpeta. |
Grupo | Es la definición del grupo de usuarios que tienen acceso a el archivo o la carpeta. |
Otros | Está disponible para todo el mundo en pocas palabras. |
Y cada una de estás clases/personas se tiene que indicar que permiso tendrá, por ejemplo en un requerimiento de permiso: el propietario debe tener escritura, lectura y ejecución, el grupo solo lectura y ejecución y otros solo lectura. Sería algo como esto:
Octal:
754
En código:
rwxr-xr--
En lo personal el formato con números es mas sencillo de leer y escribir. Tenemos las combinaciones de permisos siguientes:
Permiso | Valor octal | Código |
---|---|---|
Sin acceso | 0 | --- |
Ejecución | 1 | --x |
Escritura | 2 | -w- |
Escritura y ejecución | 3 | -wx |
Lectura | 4 | r-- |
Lectura y ejecución | 5 | r-x |
Lectura y escritura | 6 | rw- |
Lectura, escritura y ejecución | 7 | rwx |
Como ejemplo de uso práctico tenemos un permiso para un directorio con valores octales:
chmod -R 777 /home/user/directorio-prueba2
De igual manera su versión en código de permiso:
chmod -R rwxrwxrwx /home/user/directorio-prueba2
La bandera -R indica que los permisos se otorgarán de manera recursiva a todos los directorios y archivos dentro de /home/user/directorio-prueba2, en este caso /home/user/directorio-prueba2 es un directorio de prueba y debe ser un directorio real en tu computadora.
Permisos para un archivo simple, en octal:
chmod 755 /home/server/apache/mi-web.php
En código de permiso:
chmod rwxr-xr-x /home/server/apache/mi-web.php
Comando cp
Nos da la posibilidad de copiar un archivo a otra ubicación:
cp file_to_copy.txt /home/user/directorio-prueba2/new_file.txt
También puede copiar directorios enteros utilizando el flag recursivo:
cp -R dir_to_copy/ /home/user/directorio-prueba2/new_dir/
Comando mv
Este comando a diferencia del anterior mueve el archivo o directorio a una nueva dirección, si utilizamos el comando para mover algo dentro de su misma ubicación, en realidad solo habremos cambiado el nombre de ese archivo/directorio.
Para archivos:
mv file_to_copy.txt /home/user/directorio-prueba2/
Para directorios:
mv dir_to_copy/ /home/user/directorio-prueba2/
Comando rm
Este comando nos sirve para poder eliminar un archivo:
rm /home/user/directorio-prueba2/new_file.txt
También puede eliminar directorios completos utilizando el flag recursivo:
rm -R /home/user/directorio-prueba2/new_dir/
* Nunca uses este comando en directorios de sistema.
Comando touch
Es un comando que permite actualizar las fechas de modificación de archivos específicamente. Sin embargo su uso se aplica la mayor parte del tiempo para generar archivos vacíos. Por ejemplo:
touch index.html
En este caso genera un archivo con extensión html vacío, si el archivo existiera anteriormente, sólo altera la fecha de modificación.
Comando cat
De mis comandos favoritos, en su uso más simple imprime el contenido de un archivo en pantalla.
cat index.html
También de varios archivos:
cat index.html index.php index.js
Incluso podemos utilizar el operador de redirección de salida (>) para concatenar el contenido de uno o más archivos dentro de otro archivo:
cat .env.example .env.dev > environment
* Recuerda que los archivos que empiezan con un punto (.) son archivos ocultos.
Utilizando dos operadores de redirección de salida (») se añade el contenido de un archivo(s) a un nuevo archivo, creándolo en caso de no existir.
cat .env.example .env.dev >> nuevo_archivo
Comandos que debes aprenderte casi del diario como utilerías
Comando grep
Este comando realmente debería entrar en la sección anterior, sin embargo la colocó como una utilería por el motivo que es muy potente para realizar ciertas tareas de búsquedas en archivos.
La sintaxis del comando grep al buscar un solo archivo es así:
grep [opciones] patrón [archivo/directorio]
Las opciones disponibles son las siguientes:
- -i. Indiferente entre mayúsculas y minúsculas.
- -c. Muestra el número de palabras que coinciden con el patrón.
- -r/-R. Utilizando el flag recursivo buscará en el directorio indicado.
- -n. Indica el número de línea del archivo que coincida de la búsqueda.
- -v. Se mostrarán las líneas que no coincidan con la búsqueda.
Por ejemplo deseas buscar la frase “System error” en un archivo log:
grep -n "System error" /home/user/http/server/error.log
También podrías aplicar la misma búsqueda a un directorio completo con el flag recursivo.
grep -R "System error" /home/user/http/server/
Existe un operador llamado pipe (|) que puede combinar ciertos comandos, por ejemplo:
ls | grep ".png"
Aquí se combinó un comando que ya se mencionó anteriormente para listar archivos, este imprime en la terminal el listado que le hacemos un pipe para filtrar y solo mostrar solo los que contengan en su nombre “.png”. Grep es es uno de los comandos te recomiendo practiques más.
Comando find
Este comando nos ayuda a encontrar archivos, la diferencia que el anterior busca dentro de los archivos, este en directorios.
Por ejemplo si queremos buscar solo archivos que se llamen “log”:
find /home/user/http/server/ -type f -name "log"
Si queremos buscar solo directorios que se llamen “log”:
find /home/user/http/server/ -type d -name "log"
También podemos buscar por la extensión del archivo “png”:
find /home/user/http/server/ -type f -iname "*.png"
Si observas se añadió -iname (i) para indicar que sea insensible a minúsculas y mayúsculas, es decir buscará archivos “PNG” y “png”. Se debe sustituir "/home/user/http/server/" por un directorio válido.
También podría funcionar hacer un pipe con grep:
find /home/user/http/server/ -type f -iname "*.png" | grep "marvel"
De esta manera, podríamos encontrar en el directorio "/home/user/http/server/" todas los archivos con extensión “*.png” que en su nombre contengan “marvel”.
Comando alias
Alias es un comando que te permite definir como su nombre lo indica, un alias de un comando, suele utilizarse para acortar ciertos comandos muy largos o de mucho uso, por ejemplo si usas mucho git, puedes definir un alias con la letra g para acortar la escritura. Este comando si lo utilizas en una sesión de la terminal, al cerrarla no quedará guardado en ningún lugar, para estos casos lo mejor siempre es definirlo y guardarlo en el archivo ~/.bashrc de la sesión de usuario.
Si ingresas alias en la terminal verás un listado con todos los alias definidos.
alias
Por ejemplo si quieres un alias de git:
alias g="git"
Podriamos poner un alias a la utilización de algún contenedor de docker para la ejecución de ciertas tareas con npm, sin instalación de node:
alias npm2="docker run --rm -i -t --name ho-node -w /usr/app -v $PWD:/usr/app node:14-alpine npm"
Así al ejecutar el comando siguiente arrojará la salida de npm:
npm2 -v
* Para probar esto, requieres tener docker instalado.
Comando ping
De los primeros comandos que aprendí, en el año 2012 el acceso a internet fue más limitado a lo que ahora es, técnicamente lo utilizaba para verificar el acceso a internet, pero obvio tiene más usos como la duración del envío y recepción de información de una red. Por ejemplo si queremos pegarle unos pings a los servidores de google.
ping google.com
Funciona también con direcciones IP:
ping 142.251.34.46
Para detener el proceso debes presionar CTRL + C, en pantalla te arrojará resultados como los siguientes:
44 packets transmitted, 44 received, 0% packet loss, time 43061ms
rtt min/avg/max/mdev = 6.037/8.768/11.833/1.754 ms.
Si todo va bien ningún paquete será perdido. Si alguna vez escuchaste algo del modelo OSI en redes, este comando viaja desde la capa 3 de dicho modelo, hasta la 2, 1 y viceversa (red, enlace y capa física respectivamente), sin tocar las demás capas.
Comando echo
Es el “hello world” de la consola, que seguramente si conoces algo de terminal debes haber visto este comando. Básicamente imprime lo que le pases como parámetro:
echo "hello world"
Puedes desde depurar ciertas cosas, hasta generar juegos en terminal (Claro con lógica) como https://a-nikolaev.github.io/curseofwar/.
Comando which
Este comando te arroja la ubicación de los comandos reconocidos por tu terminal. Por ejemplo:
which git
Te arrojará algo como esto:
/usr/bin/git
Suele pasar que quieres modificar cierta configuración de algún script y necesitas conocer la ruta del ejecutable.
Comando whoami
El acrónimo de “who am i” muestra el nombre de usuario actual en la sesión.
whoami
Comando whatis
Muestra la descripción del comando especificado, es preguntarle a la computadora qué es docker por ejemplo:
whatis docker
Arrojará algo como esto:
docker (1) - Docker image and container command line interface
Comando exit
Este comando se utiliza para finalizar la sesión de la terminal.
exit
Hay más comandos que entran en mi día a día, como nano, vim (que pueden entrar sin problemas en otro tema aparte), ssh, ftp, y bash scripting en general.
Ya que mencioné parte de los comandos más utilizados, arriba dije que iba a colocar los comandos que nunca recomiendo utilizar en computadoras productivas.
Comandos que NUNCA debes utilizar en tu trabajo si no quieres que te corran
$ rm -Rf /
Con esto eliminas todo el sistema en la partición principal. Cuando reinicies no habrá nada que recuperar.
$ mv / /dev/null
Mueve todo el sistema en la partición principal a /dev/null que es como un directorio fantasma que todo lo que se mueve ahí nunca existió.
$ chmod -R 777 /
Este comando da permisos completos a toda la partición principal, algo que sí es un servidor no querrás hacerlo.
$ ls > /dev/sda
La salida del comando ls, sobreescribirá la partición principal, dejando todo inservible.
$ :(){:|:&};:
Este comando llamado “bomba fork” crea procesos recursivos infinitamente hasta agotar los recursos y bloquear el sistema operativo.
Por supuesto que hay más comandos que no debes usar, pero depende de las circunstancias en las que te encuentres usando la terminal. Si no conoces un comando o estás practicando algo, siempre te recomiendo ir a una documentación oficial para que veas la mejor manera de usar cada comando y no cometas un error irreversible. Soy muy consciente que en el camino se cometen cantidad de errores, pero hay de errores a errores y siempre es mejor ser cauteloso.
Sigue tú camino hacia el aprendizaje de la terminal y …
"¡No le tengas miedo al éxito, papi!"