Saltar al contenido principal

Comandos básicos:

Para trabajar con el sistema de archivos en los servidores desde una terminal utilizamos comandos.

Un comando no es más que un programa que invocamos. Este programa puede ser tanto un fichero localizado en el sistema de archivos como un built in command. Para ejecutar un comando en la terminal tenemos que escribir el nombre del comando, seguido opcionalmente por una serie de argumentos separados por espacios.

Los siguientes ejemplos vienen prefijados con un $. Históricamente una terminal de comandos mostraba este símbolo al usuario para indicar que estaba preparada para interpretar y ejecutar los comandos escritos con el teclado.

man

El comando man se utiliza para mostrar la ayuda del comando que le pasemos como argumento.

$ man echo

pwd

El comando pwd significa print working directory y se utiliza para mostrar la ruta absoluta al directorio donde nos encontramos.

$ pwd
/root

cd

El comando cd también conocido como chdir se utiliza para cambiar el directorio actual donde nos encontramos. El nombre proviene de change directory.

$ pwd
/root
$ cd /etc
$ pwd
/etc

ls

El comando ls se utiliza para listar el contenido de un directorio. El nombre del comando ls proviene de list directory.

$ ls /usr
bin games include lib lib32 lib64 libx32 local sbin share src

Podemos combinar múltiples flags para mostrar información adicional:

  • -l: Muestra permisos, propietario, grupo y fecha de modificación del fichero o directorio.
  • -p: Añade un / al final del nombre de los directorios.
  • -a: Muestra directorios y archivos ocultos.
  • -h: Muestra el tamaño humanamente legible (KB, MB, GB..)

mkdir

El comando mkdir se utiliza para crear directorios. El nombre del comando mkdir proviene de make directory

$ mkdir myfolder
$ ls
myfolder

Se pueden crear directorios anidados utilizando el flag -p:

$ mkdir -p myfolder/level2/level3
$ ls
myfolder
$ ls myfolder
level2
$ ls myfolder/level2
level3

rmdir

El comando rmdir se utiliza para eliminar directorios vacíos. El nombre del comando rmdir proviene de remove directory.

$ rmdir myfolder/level2/level3

Podemos utilizar el flag -p para eliminar de forma recursiva directorios vacíos:

$ rmdir -p myfolder/level2
$ ls

touch

El comando touch originalmente se utiliza para cambiar las fechas de modificación de un fichero a la fecha actual, aunque un uso muy común es para crear ficheos vacíos:

$ touch file.txt
$ ls
file.txt

Otra forma de generar archivos vacío consiste en utilizar el operador de redirección y el nombre del fichero:

$ > file1.txt
$ ls
file.txt file1.txt

cp

El comando cp se utiliza para copiar archivos y/o directorios de una ruta origen a una ruta destino. El nombre viene de copy.

$ cp /var/log/syslog ./
$ ls
file.txt file1.txt syslog

Podemos indicar otro nombre del fichero destino:

$ cp /var/log/syslog ./other-log
$ ls
file.txt file1.txt other-log syslog

Si queremos copiar directorios tenemos que indicar el flag -r para copiar de forma recursiva, de otra forma se copiará el directorio pero no su contenido:

$ mkdir folder1
$ touch folder1/file1.txt folder1/file2.txt folder1/file3.txt
$ ls
file.txt file1.txt folder1 other-log syslog
$ ls folder1
file1.txt file2.txt file3.txt
$ cp folder1 folder2
cp: -r not specified; omitting directory 'folder1'
$ ls
file.txt file1.txt folder1 other-log syslog
$ cp -r folder1 folder2
$ ls
file.txt file1.txt folder1 folder2 other-log syslog
$ ls folder2
file1.txt file2.txt file3.txt

Flags interesantes de mencionar:

  • -p: Preservar propietarios, permisos y fechas de acceso
  • -v: Mostrar listado de archivos copiados

mv

El comando mv se utiliza para mover y/o renombrar archivos y directorios. Su uso es muy similar al comando cp. El nombre viene de move.

$ ls
file.txt file1.txt folder1 folder2 other-log syslog
$ mv file.txt file0.txt
$ ls
file0.txt file1.txt folder1 folder2 other-log syslog

Podemos también renombrar directorios:

$ mv folder2 folder0
$ ls
file0.txt file1.txt folder0 folder1 other-log syslog

A diferencia de cp al utilizar mv sobre directorios no hace falta aplicar flags de recursive:

$ ls
file0.txt file1.txt folder0 folder1 other-log syslog
$ mv folder1 subfolder
$ ls
file0.txt file1.txt folder0 other-log subfolder syslog

Si utilizamos un nombre de directorio existente como destino moveremos todo el directorio al directorio destino en vez de renombrarlo:

$ ls
file0.txt file1.txt folder0 other-log subfolder syslog
$ mv subfolder folder0
$ ls
file0.txt file1.txt folder0 other-log syslog
$ ls folder0
file1.txt file2.txt file3.txt subfolder

rm

El comando rm se utiliza para eliminar archivos o directorios. El nombre proviene de remove.

$ ls
file0.txt file1.txt folder0 other-log syslog
$ rm syslog
$ ls
file0.txt file1.txt folder0 other-log

El comando rm se utiliza mucho con el flag -r para borrar directorios junto con sus archivos:

$ ls folder0
file1.txt file2.txt file3.txt subfolder
$ ls folder0/subfolder/
file1.txt file2.txt file3.txt
$ rm -r folder0/subfolder/
$ ls folder0/
file1.txt file2.txt file3.txt

Flags a destacar:

  • -f: Eliminación a la fuerza sin confirmación previa.
  • -i: Muestra el fichero o directorio a borrar y pide confirmación

echo

El comando echo se utiliza para mostrar una línea de texto.

$ echo Hello world!
Hello world!

cat

El comando cat se utiliza para volcar el contenido de uno o más archivos pasados como argumentos a la salida estandar. El nombre viene de concatenate.

$ cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=20.04
DISTRIB_CODENAME=focal
DISTRIB_DESCRIPTION="Ubuntu 20.04.1 LTS"

find

El comando find se utiliza para buscar archivos o directorios atendiendo a los criterios que nosotros especifiquemos.

$ ls
file0.txt file1.txt folder0 other-log
$ find . -name "file1.txt"
./folder0/file1.txt
./file1.txt

Podemos buscar archivos o directorios especificando -type d o type f:

$ find . -type d
.
./folder0
./.ssh
./.cache

También podemos buscar en el nombre por patrones:

$ find . -name "file*"
./file0.txt
./folder0/file2.txt
./folder0/file3.txt
./folder0/file1.txt
./file1.txt

Podemos excluir directorios utilizando -path <folder> -prune -false:

$ find . -path ./folder0 -prune -false -o -name "file*"
./file0.txt
./file1.txt

Podemos añadir el flag -exec para poder ejecutar un comando con cada patrón encontrado:

$ find . -name "file*" -exec echo "File found: {}" \;
File found: ./file0.txt
File found: ./folder0/file2.txt
File found: ./folder0/file3.txt
File found: ./folder0/file1.txt
File found: ./file1.txt

grep

El comando grep se utiliza para buscar ocurrencias de cadenas de texto en uno o más archivos. En este ejemplo vamos a buscar el modelo de CPU del sistema.

$ grep "model name" /proc/cpuinfo
model name : Intel(R) Core(TM) i9-8950HK CPU @ 2.90GHz

Con el flag -E podemos indicar varios patrones. En este ejemplo vamos a buscar las líneas relacionadas con la memoria y swap de /proc/meminfo:

$ grep -E "^(Mem|Swap)" /proc/meminfo
MemTotal: 2035504 kB
MemFree: 1475044 kB
MemAvailable: 1780960 kB
SwapCached: 0 kB
SwapTotal: 1003516 kB
SwapFree: 1003516 kB
$

Con el flag -v podemos excluir patrones en los resultados. En este caso vamos a buscar todos a los usuarios que inicien con la terminal bash pero excluyendo al usuario vagrant.

$ grep "/bin/bash" /etc/passwd
root:x:0:0:root:/root:/bin/bash
vagrant:x:1000:1000:vagrant,,,:/home/vagrant:/bin/bash
user1:x:1001:1001::/home/user1:/bin/bash
$ grep "/bin/bash" /etc/passwd | grep -v vagrant
root:x:0:0:root:/root:/bin/bash
user1:x:1001:1001::/home/user1:/bin/bash

Podemos combinar múltiples flags. En este caso vamos a buscar todas las opciones de configuración del servidor SSH pero excluyendo comentarios y líneas vacías:

$ grep -vE "^#|^$" /etc/ssh/sshd_config
Include /etc/ssh/sshd_config.d/*.conf
ChallengeResponseAuthentication no
UsePAM yes
X11Forwarding yes
PrintMotd no
AcceptEnv LANG LC_*
Subsystem sftp /usr/lib/openssh/sftp-server
UseDNS no
GSSAPIAuthentication no

El flag -i se utiliza para ignorar casing y poder obtener resultados tanto en mayúscula como minúscula:

$ grep -i "ubuntu" /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_DESCRIPTION="Ubuntu 20.04.1 LTS"

Con el flag -n mostramos el número de línea de la coincidencia encontrada:

$ grep -n "Ubuntu" /etc/lsb-release
1:DISTRIB_ID=Ubuntu
4:DISTRIB_DESCRIPTION="Ubuntu 20.04.1 LTS"

Con el flag -H mostramos el nombre del fichero de la coincidencia encontrada:

$ grep -H "Ubuntu" /etc/lsb-release
/etc/lsb-release:DISTRIB_ID=Ubuntu
/etc/lsb-release:DISTRIB_DESCRIPTION="Ubuntu 20.04.1 LTS"

El flag -R nos permite buscar sobre directorios de forma recursiva:

$ grep -R "^Aug 20 15:17" /var/log/
/var/log/syslog:Aug 20 15:17:01 vagrant CRON[14602]: (root) CMD ( cd / && run-parts --report /etc/cron.hourly)
/var/log/auth.log:Aug 20 15:17:01 vagrant CRON[14601]: pam_unix(cron:session): session opened for user root by (uid=0)
/var/log/auth.log:Aug 20 15:17:01 vagrant CRON[14601]: pam_unix(cron:session): session closed for user root

El comando grep acepta diferentes tipos de tokens para utilizar expresiones regulares. Aquí se recopilan varios ejemplos sobre expresiones regulares.

El comando head se utiliza para mostrar líneas del principio de un fichero. Por defecto muestra las 10 primeras líneas, pero podemos especificar cuántas utilizando el flag -n <number> o -<number>:

$ head /etc/passwd
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/usr/sbin/nologin
man:x:6:12:man:/var/cache/man:/usr/sbin/nologin
lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin
mail:x:8:8:mail:/var/mail:/usr/sbin/nologin
news:x:9:9:news:/var/spool/news:/usr/sbin/nologin
$ head -n 3 /etc/passwd
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
$ head -3 /etc/passwd
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin

tail

El comando tail se utiliza para mostrar las últimas líneas de un fichero. Por defecto muestra las últimas 10 líneas pero podemos especificar cuántas utilizando el flag -n <number> o -<number>:

$ tail /etc/passwd
tcpdump:x:108:114::/nonexistent:/usr/sbin/nologin
landscape:x:109:116::/var/lib/landscape:/usr/sbin/nologin
pollinate:x:110:1::/var/cache/pollinate:/bin/false
sshd:x:111:65534::/run/sshd:/usr/sbin/nologin
_rpc:x:112:65534::/run/rpcbind:/usr/sbin/nologin
statd:x:113:65534::/var/lib/nfs:/usr/sbin/nologin
vagrant:x:1000:1000:vagrant,,,:/home/vagrant:/bin/bash
systemd-coredump:x:999:999:systemd Core Dumper:/:/usr/sbin/nologin
vboxadd:x:998:1::/var/run/vboxadd:/bin/false
user1:x:1001:1001::/home/user1:/bin/bash
$ tail -n 3 /etc/passwd
systemd-coredump:x:999:999:systemd Core Dumper:/:/usr/sbin/nologin
vboxadd:x:998:1::/var/run/vboxadd:/bin/false
user1:x:1001:1001::/home/user1:/bin/bash
$ tail -3 /etc/passwd
systemd-coredump:x:999:999:systemd Core Dumper:/:/usr/sbin/nologin
vboxadd:x:998:1::/var/run/vboxadd:/bin/false
user1:x:1001:1001::/home/user1:/bin/bash

Otro flag útil es -f para mostrar las líneas nuevas que se hayan añadido al fichero en tiempo real.

less

El comando less se utiliza para visualizar el contenido de un fichero. El contenido es mostrado de forma interactiva y podemos navegar por el fichero utilizando las flechas del teclado. Presionando la tecla h podemos ver el menú de ayuda con sus atajos disponibles.

$ less /etc/passwd