Prólogo
¡Hola a todos! Me llamo Sasha y llevo más de seis años realizando pruebas de backend (servicios de Linux y API). La idea de este artículo surgió después de la solicitud de un tester conocido que me pidió sugerencias sobre qué leer sobre comandos de Linux antes de una entrevista. Por lo general, se espera que un candidato para el puesto de ingeniero de QA tenga conocimientos de los comandos básicos (si, por supuesto, se considera que va a trabajar con Linux), pero ¿cómo entender qué comandos vale la pena estudiar durante la preparación para la entrevista si no se tiene experiencia con Linux o apenas se tiene?
Por eso, aunque ya se ha escrito mucho sobre esto, me he decidido a escribir otro artículo titulado 'Linux para principiantes' y enumerar aquí los comandos básicos que se deben conocer antes de cualquier entrevista en un departamento (o empresa) donde se utilice Linux. Pensé en qué comandos y utilidades utilizo con más frecuencia y en cuáles son los parámetros que uso, recopilé comentarios de colegas y organicé todo esto en un solo artículo. El artículo se divide conceptualmente en 3 partes: primero, información breve sobre los fundamentos de la entrada y salida en la terminal de Linux; después, una revisión de los comandos más básicos; y en la tercera parte se describen soluciones a tareas típicas en Linux.
Cada comando tiene muchas opciones, aquí no se enumerarán todas. Siempre se puede introducirmano--help, para obtener más información sobre el comando.
Ejemplo:
[user@testhost ~]$ mkdir --help Uso: mkdir [OPCIÓN]... DIRECTORIO... Crea el (los) DIRECTORIO(S), si no existen ya. Los argumentos obligatorios para las opciones largas son obligatorios también para las opciones cortas. -m, --mode=MODE establece el modo del archivo (como en chmod), no a=rwx - umask -p, --parents sin error si ya existe, crea directorios padres según sea necesario -v, --verbose imprime un mensaje por cada directorio creado -Z establece el contexto de seguridad SELinux de cada directorio creado al tipo predeterminado --context[=CTX] como -Z, o si se especifica CTX, establece el contexto de seguridad SELinux o SMACK a CTX --help muestra esta ayuda y sale --version muestra información de la versión y sale Ayuda en línea de GNU coreutils: Para documentación completa, ejecuta: info coreutils 'invocación de mkdir'
Si un comando está ejecutándose demasiado tiempo, se puede finalizar presionando en la consola Ctrl+C (se envía una señal al proceso) SIGINT).
Un poco sobre la salida de comandos
Cuando se inicia un proceso en Linux, se crean 3 flujos de datos estándar para este proceso: stdin, stdout y stderr. Tienen los números 0, 1 y 2 respectivamente. Pero ahora nos interesan stdout y, en menor medida, stderr. Es fácil deducir por los nombres que stdout se utiliza para la salida de datos, y stderr — para mostrar mensajes de error. Por defecto, al ejecutar un comando en Linux stdout y stderr la salida se muestra en la consola, sin embargo, si la salida del comando es extensa, puede ser conveniente redirigirla a un archivo. Esto se puede hacer, por ejemplo, así:
[user@testhost ~]$ man signal > man_signal
Si mostramos el contenido del archivo man_signal, veremos que es idéntico a lo que habríamos obtenido al ejecutar el comando `man signal`.
La operación de redirección `>` utiliza por defecto stdout. Se puede especificar la redirección stdout de manera explícita: `1>`. De manera similar, se puede indicar la redirección stderr: `2>`. Estas operaciones pueden combinarse, permitiendo dividir la salida estándar del comando y la salida de mensajes de error:
[user@testhost ~]$ man signal 1> man_signal 2> man_signal_error_log
Se puede redirigir tanto stdoutcomo stderr a un solo archivo de la siguiente manera:
[user@testhost ~]$ man signal > man_signal 2>&1
La operación de redirección `2>&1` significa redirigir stderr a la misma ubicación a la que está dirigido stdout.
Otra herramienta útil para trabajar con entrada-salida (o más bien, un recurso práctico para la comunicación entre procesos) es pipe (o tubería). Las tuberías se utilizan frecuentemente para conectar varios comandos: stdout la salida de un comando se redirige al siguiente, y así sucesivamente: stdin [user@testhost ~]$ ps aux | grep docker | tail -n 2 root 1045894 0.0 0.0 7512 3704 ? Sl 16:04 0:00 docker-containerd-shim -namespace moby -workdir /var/lib/docker/containerd/daemon/io.containerd.runtime.v1.linux/moby/2fbfddaf91c1bb7b9a0a6f788f3505dd7266f1139ad381d5b51ec1f47e1e7b28 -address /var/run/docker/containerd/docker-containerd.sock -containerd-binary /usr/bin/docker-containerd -runtime-root /var/run/docker/runtime-runc 531 1048313 0.0 0.0 110520 2084 pts/2 S+ 16:12 0:00 grep --color=auto docker
Los comandos básicos de Linux
Muestra el directorio actual (de trabajo).
pwd
[user@testhost ~]$ pwd /home/user
date
Muestra la fecha y hora actuales del sistema.
[user@testhost ~]$ date Mon Dec 16 13:37:07 UTC 2019 [user@testhost ~]$ date +%s 1576503430
Este comando muestra quién está conectado al sistema. Además, la salida incluye el tiempo de actividad y la LA (promedio de carga).
w
[user@testhost ~]$ w 05:47:17 up 377 days, 17:57, 1 user, load average: 0.00, 0.01, 0.05 USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT user pts/0 32.175.94.241 05:47 2.00s 0.01s 0.00s w
ls
Muestra el contenido del directorio. Si no se proporciona una ruta, se muestra el contenido del directorio actual.
[user@testhost ~]$ pwd /home/user [user@testhost ~]$ ls qqq [user@testhost ~]$ ls /home/user qqq [user@testhost ~]$ ls / bin boot cgroup dev etc home lib lib64 local lost+found media mnt opt proc root run sbin selinux srv swap sys tmp usr var
Personalmente, a menudo utilizo las opciones
-l -l (formato de lista larga — salida en columna con información adicional sobre archivos), -t (ordenar por la fecha de modificación del archivo/directorio) y -r (orden inverso — en combinación con -t los archivos más «nuevos» estarán al final):
[user@testhost ~]$ ls -ltr /
total 4194416
drwxr-xr-x 2 root root 4096 Jan 6 2012 srv
drwxr-xr-x 2 root root 4096 Jan 6 2012 selinux
drwxr-xr-x 2 root root 4096 Jan 6 2012 mnt
drwxr-xr-x 2 root root 4096 Jan 6 2012 media
drwx------ 2 root root 16384 Oct 1 2017 lost+found
drwxr-xr-x 2 root root 4096 Oct 1 2017 local
drwxr-xr-x 13 root root 4096 Oct 1 2017 usr
drwxr-xr-x 11 root root 4096 Apr 10 2018 cgroup
drwxr-xr-x 4 root root 4096 Apr 10 2018 run
-rw------- 1 root root 4294967296 Sep 10 2018 swap
dr-xr-xr-x 10 root root 4096 Dec 13 2018 lib
drwxr-xr-x 6 root root 4096 Mar 7 2019 opt
drwxr-xr-x 20 root root 4096 Mar 19 2019 var
dr-xr-xr-x 10 root root 12288 Apr 9 2019 lib64
dr-xr-xr-x 2 root root 4096 Apr 9 2019 bin
dr-xr-xr-x 4 root root 4096 Apr 9 2019 boot
dr-xr-xr-x 2 root root 12288 Apr 9 2019 sbin
dr-xr-xr-x 3229 root root 0 Jul 2 10:19 proc
drwxr-xr-x 34 root root 4096 Oct 28 13:27 home
drwxr-xr-x 93 root root 4096 Oct 30 16:00 etc
dr-xr-x--- 11 root root 4096 Nov 1 13:02 root
dr-xr-xr-x 13 root root 0 Nov 13 20:28 sys
drwxr-xr-x 16 root root 2740 Nov 26 08:55 dev
drwxrwxrwt 3 root root 4096 Nov 26 08:57 tmp
Hay 2 nombres de directorio especiales: «.» y «..«. El primero significa el directorio actual, el segundo — el directorio padre. A menudo son útiles en varios comandos, en particular, Muestra el contenido del directorio. Si no se proporciona una ruta, se muestra el contenido del directorio actual.:
[user@testhost home]$ pwd
/home
[user@testhost home]$ ls ..
bin boot cgroup dev etc home lib lib64 local lost+found media mnt opt proc root run sbin selinux srv swap sys tmp usr var
[user@testhost home]$ ls ../home/user/
qqq
También hay una opción útil para mostrar archivos ocultos (comienzan con «.«) — -a:
[user@testhost ~]$ ls -a
. .. 1 .bash_history .bash_logout .bash_profile .bashrc .lesshst man_signal man_signal_error_log .mongorc.js .ssh temp test .viminfo
Y también se puede usar la opción -h — salida en formato legible para humanos (presta atención a los tamaños de los archivos):
[user@testhost ~]$ ls -ltrh
total 16K
-rwxrwx--x 1 user user 31 Nov 26 11:09 temp
-rw-rw-r-- 1 user user 6.0K Dec 3 16:02 1
drwxrwxr-x 2 user user 4.0K Dec 4 10:39 test
cd
Cambiar el directorio actual.
[user@testhost ~]$ pwd
/home/user
[user@testhost ~]$ cd /home/
[user@testhost home]$ pwd
/home
Si no se pasa el nombre del directorio como argumento, se utilizará la variable de entorno $HOME, es decir, el directorio principal. También puede ser útil utilizar `~` — un carácter especial que significa $HOME:
[user@testhost etc]$ pwd
/etc
[user@testhost etc]$ cd ~/test/
[user@testhost test]$ pwd
/home/user/test
mkdir
Crear un directorio.
[user@testhost ~]$ mkdir test
[user@testhost ~]$ ls -ltr
total 38184
-rw-rw-r-- 1 user user 39091284 Nov 22 14:14 qqq
drwxrwxr-x 2 user user 4096 Nov 26 10:29 test
A veces es necesario crear una estructura específica de directorios: por ejemplo, un directorio dentro de un directorio que no existe. Para no tener que introducir varias veces seguidas mkdir, se puede usar la opción -p — permite crear todos los directorios faltantes en la jerarquía. Además, con esta opción mkdir no devuelve un error si el directorio ya existe.
[user@testhost ~]$ ls
qqq test
[user@testhost ~]$ mkdir test2/subtest
mkdir: cannot create directory ‘test2/subtest’: No such file or directory
[user@testhost ~]$ mkdir -p test2/subtest
[user@testhost ~]$ ls
qqq test test2
[user@testhost ~]$ ls test2/
subtest
[user@testhost ~]$ mkdir test2/subtest
mkdir: cannot create directory ‘test2/subtest’: File exists
[user@testhost ~]$ mkdir -p test2/subtest
[user@testhost ~]$ ls test2/
subtest
rm
Eliminar archivo.
[user@testhost ~]$ ls
qqq test test2
[user@testhost ~]$ rm qqq
[user@testhost ~]$ ls
test test2
La opción -r permite eliminar directorios recursivamente con todo su contenido, la opción -f permite ignorar errores durante la eliminación (por ejemplo, sobre un archivo que no existe). Estas opciones permiten, a grandes rasgos, garantizar la eliminación de toda la jerarquía de archivos y directorios (si el usuario tiene los permisos para hacerlo), por lo que deben ser utilizadas con precaución (un ejemplo clásico de broma es “rm -rf /», que en ciertas circunstancias puede eliminar, si no todo el sistema, al menos muchos archivos importantes para su funcionamiento).
[user@testhost ~]$ ls
test test2
[user@testhost ~]$ ls -ltr test2/
total 4
-rw-rw-r-- 1 user user 0 Nov 26 10:40 temp
drwxrwxr-x 2 user user 4096 Nov 26 10:40 temp_dir
[user@testhost ~]$ rm -rf test2
[user@testhost ~]$ ls
test
cp
Copiar archivo o directorio.
[user@testhost ~]$ ls
temp test
[user@testhost ~]$ cp temp temp_clone
[user@testhost ~]$ ls
temp temp_clone test
Este comando también tiene opciones -r y -f, que se pueden utilizar para garantizar la copia de la jerarquía de directorios y carpetas en otro lugar.
mv
Mover o renombrar un archivo o directorio.
[user@testhost ~]$ ls -ltr
total 4
drwxrwxr-x 2 user user 4096 Nov 26 10:29 test
-rw-rw-r-- 1 user user 0 Nov 26 10:45 temp
-rw-rw-r-- 1 user user 0 Nov 26 10:46 temp_clone
[user@testhost ~]$ ls test
[user@testhost ~]$ mv test test_renamed
[user@testhost ~]$ mv temp_clone test_renamed/
[user@testhost ~]$ ls
temp test_renamed
[user@testhost ~]$ ls test_renamed/
temp_clone
cat
Mostrar el contenido de un archivo (o archivos).
[user@testhost ~]$ cat temp
Content of a file.
Lalalala...
También vale la pena prestar atención a los comandos head (muestra n primeras líneas o bytes de un archivo) y tail (de esta hablaremos más adelante).
tail
Mostrar n las últimas líneas o bytes de un archivo.
[user@testhost ~]$ tail -1 temp
Lalalala...
Una opción muy útil es -f — permite mostrar nuevos datos en el archivo en tiempo real.
less
A veces un archivo de texto es demasiado grande, y no es conveniente mostrarlo con un comando. cat. Entonces se puede abrir con el comando less: el archivo se mostrará en partes, permitiendo la navegación entre estas partes, búsqueda y otras funciones simples.
[user@testhost ~]$ less temp
También puede ser útil la opción de usar less con un pipe (pipe):
[user@testhost ~]$ grep "ERROR" /tmp/some.log | less
ps
Mostrar la lista de procesos.
[user@testhost ~]$ ps
PID TTY TIME CMD
761020 pts/2 00:00:00 bash
809720 pts/2 00:00:00 ps
Normalmente uso las opciones de BSD "aux" — mostrar todos los procesos en el sistema (dado que puede haber muchos procesos, solo muestro los primeros 5 de ellos, usando un pipe (pipe) y el comando head):
[user@testhost ~]$ ps aux | head -5
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.0 19692 2600 ? Ss Jul02 0:10 /sbin/init
root 2 0.0 0.0 0 0 ? S Jul02 0:03 [kthreadd]
root 4 0.0 0.0 0 0 ? I< Jul02 0:00 [kworker/0:0H]
root 6 0.0 0.0 0 0 ? I< Jul02 0:00 [mm_percpu_wq]
Muchos también utilizan las opciones de BSD "axjf", que permite mostrar un árbol de procesos (aquí he recortado parte de la salida para la demostración):
[user@testhost ~]$ ps axjf
PPID PID PGID SID TTY TPGID STAT UID TIME COMMAND
0 2 0 0 ? -1 S 0 0:03 [kthreadd]
2 4 0 0 ? -1 I< 0 0:00 _ [kworker/0:0H]
2 6 0 0 ? -1 I< 0 0:00 _ [mm_percpu_wq]
2 7 0 0 ? -1 S 0 4:08 _ [ksoftirqd/0]
...
...
...
1 4293 4293 4293 tty6 4293 Ss+ 0 0:00 ▷/sbin/mingetty ▷/dev/tty6
1 532967 532964 532964 ? -1 Sl 495 0:00 ▷/opt/td-agent/embedded/bin/ruby ▷/usr/sbin/td-agent --log ▷/var/log/td-agent/td-agent.log --use-v1-config --group td-agent --daemon ▷/var/run/td-agent/td-agent.pid
532967 532970 532964 532964 ? -1 Sl 495 803:06 _ ▷/opt/td-agent/embedded/bin/ruby ▷/usr/sbin/td-agent --log ▷/var/log/td-agent/td-agent.log --use-v1-config --group td-agent --daemon ▷/var/run/td-agent/td-agent.pid
1 537162 533357 532322 ? -1 Sl 0 5067:43 ▷/usr/bin/dockerd --default-ulimit nofile=262144:262144 --dns=172.17.0.1
537162 537177 537177 537177 ? -1 Ssl 0 4649:28 _ docker-containerd --config ▷/var/run/docker/containerd/containerd.toml
537177 537579 537579 537177 ? -1 Sl 0 4:48 | _ docker-containerd-shim -namespace moby -workdir ▷/var/lib/docker/containerd/daemon/io.containerd.runtime.v1.linux/moby/0ee89b20deb3cf08648cd92e1f3e3c661ccffef7a0971
537579 537642 537642 537642 ? -1 Ss 1000 32:11 | | _ ▷/usr/bin/python ▷/usr/bin/supervisord -c ▷/etc/supervisord/api.conf
537642 539764 539764 537642 ? -1 S 1000 0:00 | | _ sh -c echo "READY"; while read -r line; do echo "$line"; supervisorctl shutdown; done
537642 539767 539767 537642 ? -1 S 1000 5:09 | | _ php-fpm: master process (▷/etc/php73/php-fpm.conf)
539767 783097 539767 537642 ? -1 S 1000 0:00 | | | _ php-fpm: pool test
539767 783131 539767 537642 ? -1 S 1000 0:00 | | | _ php-fpm: pool test
539767 783185 539767 537642 ? -1 S 1000 0:00 | | | _ php-fpm: pool test
...
...
...
Esta comando tiene muchas opciones diferentes, así que recomiendo consultar la documentación para un uso activo. Para la mayoría de los casos, basta con saber «ps aux«.
kill
Enviar una señal a un proceso. De forma predeterminada, se envía la señal SIGTERM, que finaliza el proceso.
[user@testhost ~]$ ps ux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
531 1027147 0.0 0.0 119956 4260 ? S 14:51 0:00 sshd: user@pts/1
531 1027149 0.0 0.0 115408 3396 pts/1 Ss 14:51 0:00 -bash
531 1027170 0.0 0.0 119956 4136 ? R 14:51 0:00 sshd: user@pts/2
531 1027180 0.0 0.0 115408 3564 pts/2 Ss 14:51 0:00 -bash
531 1033727 0.0 0.0 107960 708 pts/1 S+ 15:17 0:00 sleep 300
531 1033752 0.0 0.0 117264 2604 pts/2 R+ 15:17 0:00 ps ux
[user@testhost ~]$ kill 1033727
[user@testhost ~]$ ps ux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
531 1027147 0.0 0.0 119956 4260 ? S 14:51 0:00 sshd: user@pts/1
531 1027149 0.0 0.0 115408 3396 pts/1 Ss+ 14:51 0:00 -bash
531 1027170 0.0 0.0 119956 4136 ? R 14:51 0:00 sshd: user@pts/2
531 1027180 0.0 0.0 115408 3564 pts/2 Ss 14:51 0:00 -bash
531 1033808 0.0 0.0 117268 2492 pts/2 R+ 15:17 0:00 ps ux
Dado que un proceso puede tener manejadores de señales, kill no siempre conduce al resultado esperado: la finalización instantánea del proceso. Para "matar" un proceso de manera segura, es necesario enviarle la señal SIGKILL. Sin embargo, esto puede resultar en la pérdida de datos (por ejemplo, si el proceso debe guardar cierta información en disco antes de finalizar), por lo que se debe usar este comando con precaución. El número de la señal SIGKILL es 9, por lo que la versión corta del comando se ve así:
[user@testhost ~]$ ps ux | grep sleep
531 1034930 0.0 0.0 107960 636 pts/1 S+ 15:21 0:00 sleep 300
531 1034953 0.0 0.0 110516 2104 pts/2 S+ 15:21 0:00 grep --color=auto sleep
[user@testhost ~]$ kill -9 1034930
[user@testhost ~]$ ps ux | grep sleep
531 1035004 0.0 0.0 110516 2092 pts/2 S+ 15:22 0:00 grep --color=auto sleep
Además de los mencionados, SIGTERM y SIGKILL existen muchos otros diferentes tipos de señales, cuya lista se puede encontrar fácilmente en Internet. Y no olvides que las señales SIGKILL y SIGSTOP no pueden ser interceptadas o ignoradas.
ping
Enviar un paquete ICMP ECHO_REQUEST al host [user@testhost ~]$ ping google.com PING google.com (172.217.15.78) 56(84) bytes de data. 64 bytes desde iad23s63-in-f14.1e100.net (172.217.15.78): icmp_seq=1 ttl=47 tiempo=1.85 ms 64 bytes desde iad23s63-in-f14.1e100.net (172.217.15.78): icmp_seq=2 ttl=47 tiempo=1.48 ms 64 bytes desde iad23s63-in-f14.1e100.net (172.217.15.78): icmp_seq=3 ttl=47 tiempo=1.45 ms 64 bytes desde iad23s63-in-f14.1e100.net (172.217.15.78): icmp_seq=4 ttl=47 tiempo=1.46 ms 64 bytes desde iad23s63-in-f14.1e100.net (172.217.15.78): icmp_seq=5 ttl=47 tiempo=1.45 ms ^C --- estadísticas de ping de google.com --- 5 paquetes transmitidos, 5 recibidos, 0% pérdida de paquetes, tiempo 4006ms rtt min/avg/max/mdev = 1.453/1.541/1.850/0.156 ms.
Por defecto
funciona hasta que se finalice manualmente. Por lo tanto, puede ser útil la opción ping -c — el número de paquetes, después de los cuales se detendrá automáticamente. Otra opción que a veces utilizo es ping -i , el intervalo entre el envío de paquetes., el intervalo entre el envío de paquetes.
[user@testhost ~]$ ping -c 3 -i 5 google.com
PING google.com (172.217.5.238) 56(84) bytes de datos.
64 bytes de iad30s07-in-f238.1e100.net (172.217.5.238): icmp_seq=1 ttl=47 time=1.55 ms
64 bytes de iad30s07-in-f14.1e100.net (172.217.5.238): icmp_seq=2 ttl=47 time=1.17 ms
64 bytes de iad30s07-in-f14.1e100.net (172.217.5.238): icmp_seq=3 ttl=47 time=1.16 ms
--- estadísticas de ping de google.com ---
3 paquetes transmitidos, 3 recibidos, 0% pérdida de paquetes, tiempo 10006ms
rtt min/avg/max/mdev = 1.162/1.295/1.551/0.181 ms
ssh
Cliente SSH OpenSSH, permite conectarse a un host remoto.
MacBook-Pro-User:~ user$ ssh user@11.11.22.22
Último inicio de sesión: mar nov 26 11:27:39 2019 desde otro_host
[user@testhost ~]$ hostname
testhost
Hay muchos matices en el uso de SSH, además este cliente tiene muchas funcionalidades, por lo que si es necesario (o deseado) se puede leer más sobre esto .
scp
Copiar archivos entre hosts (para esto se utiliza ssh).
[user@testhost ~]$ pwd
/home/user
[user@testhost ~]$ ls
temp test_renamed
[user@testhost ~]$ exit
logout
Conexión cerrada al 11.11.22.22.
MacBook-Pro-Aleksandr:~ user$ scp user@11.11.22.22:/home/user/temp Downloads/
temp 100% 31 0.2KB/s 00:00
MacBook-Pro-Aleksandr:~ user$ cat Downloads/temp
Contenido de un archivo.
Lalalala...
rsync
También se puede utilizar para sincronizar directorios entre hosts rsync (-a — modo de archivo, permite copiar completamente todo el contenido del directorio "tal como está", -v — salida de información adicional en la consola):
MacBook-Pro-User:~ user$ ls Downloads/user
ls: Downloads/user: No such file or directory
MacBook-Pro-User:~ user$ rsync -av user@testhost:/home/user Downloads
recibiendo lista de archivos ... hecho
user/
user/.bash_history
user/.bash_logout
user/.bash_profile
user/.bashrc
user/.lesshst
user/.mongorc.js
user/.viminfo
user/1
user/man_signal
user/man_signal_error_log
user/temp
user/.ssh/
user/.ssh/authorized_keys
user/test/
user/test/created_today
user/test/temp_clone
enviados 346 bytes recibidos 29210 bytes 11822.40 bytes/seg
el tamaño total es 28079 la aceleración es 0.95
MacBook-Pro-User:~ user$ ls -a Downloads/user
. .bash_history .bash_profile .lesshst .ssh 1 man_signal_error_log test
.. .bash_logout .bashrc .mongorc.js .viminfo man_signal temp
echo
Mostrar en pantalla una línea de texto.
[user@testhost ~]$ echo "Hello"
Hello
Las opciones que merecen atención son -n — no completar la línea con un salto de línea al final, y -e — habilitar la interpretación de escapes usando "".
[user@testhost ~]$ echo "tHellon"
tHellon
[user@testhost ~]$ echo -n "tHellon"
tHellon[user@testhost ~]$
[user@testhost ~]$ echo -ne "tHellon"
Hello
También se puede usar este comando para mostrar los valores de las variables. Por ejemplo, en Linux, el código de salida del último comando finalizado se guarda en una variable especial $?, y de esta forma se puede saber qué error ocurrió en la última aplicación ejecutada:
[user@testhost ~]$ ls # no habrá error
1 man_signal man_signal_error_log temp test
[user@testhost ~]$ echo $? # obtendremos 0 — no hubo errores
0
[user@testhost ~]$ ls qwerty # habrá un error
ls: cannot access qwerty: No such file or directory
[user@testhost ~]$ echo $? # obtendremos 2 — Uso indebido de los builtins de shell (según la documentación de Bash)
2
[user@testhost ~]$ echo $? # el último echo se ejecutó sin errores, obtendremos 0
0
telnet
Cliente para el protocolo TELNET. Se utiliza para comunicarse con otro host.
[user@testhost ~]$ telnet example.com 80
Trying 93.184.216.34...
Connected to example.com.
Escape character is '^]'.
GET / HTTP/1.1
Host: example.com
HTTP/1.1 200 OK
Cache-Control: max-age=604800
Content-Type: text/html; charset=UTF-8
Date: Tue, 26 Nov 2019 11:59:18 GMT
Etag: "3147526947+gzip+ident"
Expires: Tue, 03 Dec 2019 11:59:18 GMT
Last-Modified: Thu, 17 Oct 2019 07:18:26 GMT
Server: ECS (dcb/7F3B)
Vary: Accept-Encoding
X-Cache: HIT
Content-Length: 1256
... aquí estaba el cuerpo de la respuesta, que recorté a mano ...
Si necesitas usar el protocolo TLS (recuerda que SSL está obsoleto), entonces telnet no servirá para estos propósitos. En cambio, servirá el cliente openssl:
Ejemplo de uso de openssl con la salida de la respuesta a la solicitud GET
[user@testhost ~]$ openssl s_client -connect example.com:443
CONNECTED(00000003)
depth=2 C = US, O = DigiCert Inc, OU = www.digicert.com, CN = DigiCert Global Root CA
verify return:1
depth=1 C = US, O = DigiCert Inc, CN = DigiCert SHA2 Secure Server CA
verify return:1
depth=0 C = US, ST = California, L = Los Angeles, O = Internet Corporation for Assigned Names and Numbers, OU = Technology, CN = www.example.org
verify return:1
---
Cadena de certificados
0 s: /C=US /ST=California /L=Los Angeles /O=Internet Corporation for Assigned Names and Numbers /OU=Technology /CN=www.example.org
i: /C=US /O=DigiCert Inc /CN=DigiCert SHA2 Secure Server CA
1 s: /C=US /O=DigiCert Inc /CN=DigiCert SHA2 Secure Server CA
i: /C=US /O=DigiCert Inc /OU=www.digicert.com /CN=DigiCert Global Root CA
2 s: /C=US /O=DigiCert Inc /OU=www.digicert.com /CN=DigiCert Global Root CA
i: /C=US /O=DigiCert Inc /OU=www.digicert.com /CN=DigiCert Global Root CA
---
Certificado del servidor
-----BEGIN CERTIFICATE-----
MIIHQDCCBiigAwIBAgIQD9B43Ujxor1NDyupa2A4/jANBgkqhkiG9w0BAQsFADBN
MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMScwJQYDVQQDEx5E
aWdpQ2VydCBTSEEyIFNlY3VyZSBTZXJ2ZXIgQ0EwHhcNMTgxMTI4MDAwMDAwWhcN
MjAxMjAyMTIwMDAwWjCBpTELMAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3Ju
aWExFDASBgNVBAcTC0xvcyBBbmdlbGVzMTwwOgYDVQQKEzNJbnRlcm5ldCBDb3Jw
b3JhdGlvbiBmb3IgQXNzaWduZWQgTmFtZXMgYW5kIE51bWJlcnMxEzARBgNVBAsT
ClRlY2hub2xvZ3kxGDAWBgNVBAMTD3d3dy5leGFtcGxlLm9yZzCCASIwDQYJKoZI
hvcNAQEBBQADggEPADCCAQoCggEBANDwEnSgliByCGUZElpdStA6jGaPoCkrp9vV
rAzPpXGSFUIVsAeSdjF11yeOTVBqddF7U14nqu3rpGA68o5FGGtFM1yFEaogEv5g
rJ1MRY/d0w4+dw8JwoVlNMci+3QTuUKf9yH28JxEdG3J37Mfj2C3cREGkGNBnY80
eyRJRqzy8I0LSPTTkhr3okXuzOXXg38ugr1x3SgZWDNuEaE6oGpyYJIBWZ9jF3pJ
QnucP9vTBejMh374qvyd0QVQq3WxHrogy4nUbWw3gihMxT98wRD1oKVma1NTydvt
hcNtBfhkp8kO64/hxLHrLWgOFT/l4tz8IWQt7mkrBHjbd2XLVPkCAwEAAaOCA8Ew
ggO9MB8GA1UdIwQYMBaAFA+AYRyCMWHVLyjnjUY4tCzhxtniMB0GA1UdDgQWBBRm
mGIC4AmRp9njNvt2xrC/oW2nvjCBgQYDVR0RBHoweIIPd3d3LmV4YW1wbGUub3Jn
ggtleGFtcGxlLmNvbYILZXhhbXBsZS5lZHWCC2V4YW1wbGUubmV0ggtleGFtcGxl
Lm9yZ4IPd3d3LmV4YW1wbGUuY29tgg93d3cuZXhhbXBsZS5lZHWCD3d3dy5leGFt
cGxlLm5ldDAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsG
AQUFBwMCMGsGA1UdHwRkMGIwL6AtoCuGKWh0dHA6Ly9jcmwzLmRpZ2ljZXJ0LmNv
bS9zc2NhLXNoYTItZzYuY3JsMC+gLaArhilodHRwOi8vY3JsNC5kaWdpY2VydC5j
b20vc3NjYS1zaGEyLWc2LmNybDBMBgNVHSAERTBDMDcGCWCGSAGG/WwBATAqMCgG
CCsGAQUFBwIBFhxodHRwczovL3d3dy5kaWdpY2VydC5jb20vQ1BTMAgGBmeBDAEC
AjB8BggrBgEFBQcBAQRwMG4wJAYIKwYBBQUHMAGGGGh0dHA6Ly9vY3NwLmRpZ2lj
ZXJ0LmNvbTBGBggrBgEFBQcwAoY6aHR0cDovL2NhY2VydHMuZGlnaWNlcnQuY29t
L0RpZ2lDZXJ0U0hBMlNlY3VyZVNlcnZlckNBLmNydDAMBgNVHRMBAf8EAjAAMIIB
fwYKKwYBBAHWeQIEAgSCAW8EggFrAWkAdwCkuQmQtBhYFIe7E6LMZ3AKPDWYBPkb
37jjd80OyA3cEAAAAWdcMZVGAAAEAwBIMEYCIQCEZIG3IR36Gkj1dq5L6EaGVycX
sHvpO7dKV0JsooTEbAIhALuTtf4wxGTkFkx8blhTV+7sf6pFT78ORo7+cP39jkJC
AHYAh3W/51l8+IxDmV+9827/Vo1HVjb/SrVgwbTq/16ggw8AAAFnXDGWFQAABAMA
RzBFAiBvqnfSHKeUwGMtLrOG3UGLQIoaL3+uZsGTX3MfSJNQEQIhANL5nUiGBR6g
l0QlCzzqzvorGXyB/yd7nttYttzo8EpOAHYAb1N2rDHwMRnYmQCkURX/dxUcEdkC
wQApBo2yCJo32RMAAAFnXDGWnAAABAMARzBFAiEA5Hn7Q4SOyqHkT+kDsHq7ku7z
RDuM7P4UDX2ft2Mpny0CIE13WtxJAUr0aASFYZ/XjSAMMfrB0/RxClvWVss9LHKM
MA0GCSqGSIb3DQEBCwUAA4IBAQBzcIXvQEGnakPVeJx7VUjmvGuZhrr7DQOLeP4R
8CmgDM1pFAvGBHiyzvCH1QGdxFl6cf7wbp7BoLCRLR/qPVXFMwUMzcE1GLBqaGZM
v1Yh2lvZSLmMNSGRXdx113pGLCInpm/TOhfrvr0TxRImc8BdozWJavsn1N2qdHQu
N+UBO6bQMLCD0KHEdSGFsuX6ZwAworxTg02/1qiDu7zW7RyzHvFYA4IAjpzvkPIa
X6KjBtpdvp/aXabmL95YgBjT8WJ7pqOfrqhpcmOBZa6Cg6O1l4qbIFH/Gj9hQB5I
0Gs4+eH6F9h3SojmPTYkT+8KuZ9w84Mn+M8qBXUQoYoKgIjN
-----END CERTIFICATE-----
subject= /C=US /ST=California /L=Los Angeles /O=Internet Corporation for Assigned Names and Numbers /OU=Technology /CN=www.example.org
issuer= /C=US /O=DigiCert Inc /CN=DigiCert SHA2 Secure Server CA
---
No se enviaron nombres de CA de certificado del cliente
Sello de firma de par: SHA256
Clave temporal del servidor: ECDH, P-256, 256 bits
---
El apretón de manos SSL ha leído 4643 bytes y escrito 415 bytes
---
Nuevo, TLSv1/SSLv3, El cifrado es ECDHE-RSA-AES128-GCM-SHA256
La clave pública del servidor es de 2048 bits
La renegociación segura está soportada
Compresión: NINGUNA
Expansión: NINGUNA
No se negoció ALPN
Sesión SSL:
Protocolo : TLSv1.2
Cifrado : ECDHE-RSA-AES128-GCM-SHA256
ID de sesión: 91950DC50FADB57BF026D2661E6CFAA1F522E5CA60D2310E106EE0E0FD6E70BD
Contexto de ID de sesión:
Clave maestra: 704E9145253EEB4E9DC47E3DC6725D296D4A470EA296D54F71D65E74EAC09EB096EA1305CBEDD9E7020B8F72FD2B68A5
Argumento de la clave: Ninguno
Principal Krb5: Ninguno
Identidad PSK: Ninguna
Sugerencia de identidad PSK: Ninguna
Sugerencia de tiempo de vida del billete de sesión TLS: 7200 (segundos)
Billete de sesión TLS:
0000 - 68 84 4e 77 be e3 f5 00-49 c5 44 40 53 4d b9 61 h.Nw....I.D@SM.a
0010 - c9 fe df e4 05 51 d0 53-ae cf 89 4c b6 ef 6c 9e .....Q.S...L..l.
0020 - fe 12 9a f0 e8 e5 4e 87-42 89 ac af ca e5 4a 85 ......N.B.....J.
0030 - 38 08 26 e3 22 89 08 b5-62 c0 8b 7e b8 05 d3 54 8.&."...b..~...T
0040 - 8c 24 91 a7 b4 4f 79 ad-36 59 7c 69 2d e5 7f 62 .$...Oy.6Y|i-..b
0050 - f6 73 a3 8b 92 63 c1 e3-df 78 ba 8c 5a cc 82 50 .s...c...x..Z..P
0060 - 33 4e 13 4b 10 e4 97 31-cc b4 13 65 45 60 3e 13 3N.K...1...eE`>.
0070 - ac 9e b1 bb 4b 18 d9 16-ea ce f0 9b 5b 0c 8b bf ....K.......[...
0080 - fd 78 74 a0 1a ef c2 15-2a 0a 14 8d d1 3f 52 7a .xt.....*....?Rz
0090 - 12 6b c7 81 15 c4 c4 af-7e df c2 20 a8 dd 4b 93 .k......~.. ..K.
Hora de inicio: 1574769867
Tiempo de espera: 300 (segundos)
Código de retorno de verificación: 0 (ok)
---
GET / HTTP/1.1
Host: example.com
HTTP/1.1 200 OK
Cache-Control: max-age=604800
Content-Type: text/html; charset=UTF-8
Date: Tue, 26 Nov 2019 12:04:38 GMT
Etag: "3147526947+ident"
Expires: Tue, 03 Dec 2019 12:04:38 GMT
Last-Modified: Thu, 17 Oct 2019 07:18:26 GMT
Server: ECS (dcb/7EC8)
Vary: Accept-Encoding
X-Cache: HIT
Content-Length: 1256
<!doctype html>
<html>
<head>
<title>Dominio de Ejemplo</title>
<meta charset="utf-8" />
<meta http-equiv="Content-type" content="text/html; charset=utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<style type="text/css">
body {
background-color: #f0f0f2;
margin: 0;
padding: 0;
font-family: -apple-system, system-ui, BlinkMacSystemFont, "Segoe UI", "Open Sans", "Helvetica Neue", Helvetica, Arial, sans-serif;
}
div {
width: 600px;
margin: 5em auto;
padding: 2em;
background-color: #fdfdff;
border-radius: 0.5em;
box-shadow: 2px 3px 7px 2px rgba(0,0,0,0.02);
}
a:link, a:visited {
color: #38488f;
text-decoration: none;
}
@media (max-width: 700px) {
div {
margin: 0 auto;
width: auto;
}
}
</style>
</head>
<body>
<div>
<h1>Dominio de Ejemplo</h1>
<p>Este dominio es para uso en ejemplos ilustrativos en documentos. Puede utilizar este dominio en literatura sin necesidad de coordinación previa o pedir permiso.</p>
<p><a href="https://www.iana.org/domains/example">Más información...</a></p>
</div>
</body>
</html>
Solución de tareas típicas en Linux
Cambiar el propietario del archivo
El propietario de un archivo o directorio se puede cambiar usando el comando chown:
[user@testhost ~]$ chown user:user temp
[user@testhost ~]$ ls -l temp
-rw-rw-r-- 1 user user 31 Nov 26 11:09 temp
En el parámetro de este comando se debe proporcionar el nuevo propietario y grupo (opcionalmente), separados por dos puntos. Además, al cambiar el propietario de un directorio puede ser útil la opción -R — entonces los propietarios también se cambiarán para todo el contenido del directorio.
Cambiar los permisos de acceso del archivo
Esta tarea se resuelve con el comando chmod. Como ejemplo, daré la configuración de permisos 'el propietario tiene permiso de lectura, escritura y ejecución, el grupo tiene permiso de lectura y escritura, y todos los demás — nada':
[user@testhost ~]$ ls -l temp
-rw-rw-r-- 1 user user 31 Nov 26 11:09 temp
[user@testhost ~]$ chmod 760 temp
[user@testhost ~]$ ls -l temp
-rwxrw---- 1 user user 31 Nov 26 11:09 temp
El primer 7 (esto es 0b111 en representación binaria) en el parámetro significa 'todos los permisos para el propietario', el segundo 6 (esto es 0b110 en representación binaria) — 'lectura y escritura', y 0 — no permisos para los demás. La máscara de bits consta de tres bits: el bit menos significativo ('derecho') se encarga de la ejecución, el siguiente ('medio') — de la escritura, y el más significativo ('izquierdo') — de la lectura.
También se pueden establecer permisos utilizando símbolos especiales (sintaxis mnemotécnica). Por ejemplo, en el siguiente caso, primero se quitan los permisos de ejecución para el usuario actual y luego se devuelven:
[user@testhost ~]$ ls -l temp
-rwxrw---- 1 user user 31 Nov 26 11:09 temp
[user@testhost ~]$ chmod -x temp
[user@testhost ~]$ ls -l temp
-rw-rw---- 1 user user 31 Nov 26 11:09 temp
[user@testhost ~]$ chmod +x temp
[user@testhost ~]$ ls -l temp
-rwxrwx--x 1 user user 31 Nov 26 11:09 temp
Este comando tiene muchas variantes de uso, por lo que recomiendo leer más sobre él (especialmente sobre la sintaxis mnemotécnica, por ejemplo, ).
Mostrar el contenido de un archivo binario
Esto se puede hacer con la herramienta hexdump. A continuación se presentan ejemplos de su uso.
[user@testhost ~]$ cat temp
Contenido de un archivo.
Lalalala...
[user@testhost ~]$ hexdump -c temp
0000000 C o n t e n t o f a f i l
0000010 e . n L a l a l a l a . . . n
000001f
[user@testhost ~]$ hexdump -x temp
0000000 6f43 746e 6e65 2074 666f 6120 6620 6c69
0000010 2e65 4c0a 6c61 6c61 6c61 2e61 2e2e 000a
000001f
[user@testhost ~]$ hexdump -C temp
00000000 43 6f 6e 74 65 6e 74 20 6f 66 20 61 20 66 69 6c |Contenido de un f|
00000010 69 6c 65 2e 0a 4c 61 6c 61 6c 61 6c 61 2e 2e 2e 0a |ile..Lalalala....|
0000001f
Con esta herramienta también se pueden mostrar datos en otros formatos, sin embargo, las variantes más útiles suelen ser precisamente estas.
Buscar archivos
Encontrar un archivo por parte del nombre en el árbol de directorios se puede hacer con el comando find:
[user@testhost ~]$ find test_dir/ -name "*le*"
test_dir/file_1
test_dir/file_2
test_dir/subdir/file_3
También hay otras opciones y filtros de búsqueda disponibles. Por ejemplo, se pueden encontrar archivos en la carpeta test, creados hace más de 5 días:
[user@testhost ~]$ ls -ltr test
total 0
-rw-rw-r-- 1 user user 0 Nov 26 10:46 temp_clone
-rw-rw-r-- 1 user user 0 Dec 4 10:39 created_today
[user@testhost ~]$ find test/ -type f -ctime +5
test/temp_clone
Buscar texto en archivos
El comando que ayudará con esta tarea es grep. Tiene muchas variantes de uso, aquí como ejemplo se menciona la más simple.
[user@testhost ~]$ grep -nr "content" test_dir/
test_dir/file_1:1:contenido de prueba para file_1
test_dir/file_2:1:contenido de prueba para file_2
test_dir/subdir/file_3:1:contenido de prueba para file_3
Una de las formas populares de usar el comando grep — es utilizarlo en una tubería (pipe):
[user@testhost ~]$ sudo tail -f /var/log/test.log | grep "ERROR"
La opción -v esto permite hacer el efecto grepel inverso — solo se mostrarán las líneas que no contengan el patrón pasado a grep.
Ver paquetes instalados
No hay un comando universal, ya que todo depende de la distribución de Linux y del gestor de paquetes utilizado. Probablemente una de las siguientes comandos te ayudará:
yum list installed
apt list --installed
zypper se —installed-only
pacman -Qqe
dpkg -l
rpm -qa
Ver cuánto espacio ocupa el árbol de directorios
Una de las formas de utilizar el comando du:
[user@testhost ~]$ du -h -d 1 test_dir/
8,0K test_dir/subdir
20K test_dir/
Se puede cambiar el valor del parámetro -d, para obtener información más detallada sobre el árbol de directorios. También se puede usar el comando en combinación con sort:
[user@testhost ~]$ du -h -d 1 test_dir/ | sort -h
8,0K test_dir/subdir
16K test_dir/subdir_2
36K test_dir/
[user@testhost ~]$ du -h -d 1 test_dir/ | sort -h -r
36K test_dir/
16K test_dir/subdir_2
8,0K test_dir/subdir
La opción -h del comando sort permite ordenar tamaños en un formato legible para humanos (por ejemplo, 1K, 2G), la opción -r permite ordenar los datos en orden inverso.
Buscar y reemplazar en un archivo, en los archivos de un directorio
Esta operación se realiza utilizando la herramienta sed (sin la opción g al final solo se reemplazará la primera aparición de «old-text» en la línea):
sed -i 's/old-text/new-text/g' input.txt
Se puede utilizar para varios archivos a la vez:
[user@testhost ~]$ cat test_dir/file_*
contenido de prueba para file_1
contenido de prueba para file_2
[user@testhost ~]$ sed -i 's/test/edited/g' test_dir/file_*
[user@testhost ~]$ cat test_dir/file_*
contenido editado para file_1
contenido editado para file_2
Imprimir una columna de la salida
Para abordar esta tarea se ayudará awk. En este ejemplo se imprime la segunda columna de la salida del comando `ps ux`:
[user@testhost ~]$ ps ux | awk '{print $2}'
PID
11023
25870
25871
25908
25909
Es importante tener en cuenta que awk tiene una funcionalidad mucho más rica, por lo que si necesitas trabajar con texto en la línea de comandos, es recomendable leer más sobre este comando.
Obtener la dirección IP por nombre de host
Puedes usar uno de los siguientes comandos:
[user@testhost ~]$ host ya.ru
ya.ru tiene la dirección 87.250.250.242
ya.ru tiene dirección IPv6 2a02:6b8::2:242
ya.ru el correo es manejado por 10 mx.yandex.ru.
[user@testhost ~]$ dig +short ya.ru
87.250.250.242
[user@testhost ~]$ nslookup ya.ru
Servidor: 8.8.8.8
Dirección: 8.8.8.8#53
Respuesta no autoritativa:
Nombre: ya.ru
Dirección: 87.250.250.242
Información de red
Puedes usar ifconfig:
[user@testhost ~]$ ifconfig
deth0: flags=4163 mtu 1500
inet 47.89.93.67 netmask 255.255.224.0 broadcast 47.89.95.255
inet6 fd90::302:57ff:fe79:1 prefixlen 64 scopeid 0x20
ether 04:01:57:79:00:01 txqueuelen 1000 (Ethernet)
RX packets 11912135 bytes 9307046034 (8.6 GiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 14696632 bytes 2809191835 (2.6 GiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo: flags=73 mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10
loop txqueuelen 0 (Local Loopback)
RX packets 10 bytes 866 (866.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 10 bytes 866 (866.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
También puedes usar ip:
[user@testhost ~]$ ip a
1: lo: mtu 65536 qdisc noqueue state UNKNOWN group default
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 04:01:57:79:00:01 brd ff:ff:ff:ff:ff:ff
inet 47.89.93.67/19 brd 47.89.95.255 scope global eth0
valid_lft forever preferred_lft forever
inet6 fd90::302:57ff:fe79:1/64 scope link
valid_lft forever preferred_lft forever
3: ip_vti0: mtu 1500 qdisc noop state DOWN group default
link/ipip 0.0.0.0 brd 0.0.0.0
Sin embargo, si, por ejemplo, solo le interesa IPv4, puede agregar la opción -4:
[user@testhost ~]$ ip -4 a
1: lo: mtu 65536 qdisc noqueue state UNKNOWN group default
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
2: eth0: mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
inet 47.89.93.67/19 brd 47.89.95.255 scope global eth0
valid_lft forever preferred_lft forever
Ver puertos abiertos
Para esto se usa la utilidad netstat. Por ejemplo, para ver todos los puertos TCP y UDP que están escuchando, mostrando el PID del proceso que escucha el puerto y con una representación numérica del puerto, debe utilizarla con las siguientes opciones:
[user@testhost ~]$ netstat -lptnu
Información del sistema
Puede obtener esta información utilizando el comando uname.
[user@testhost ~]$ uname -a
Linux alexander 3.10.0-123.8.1.el7.x86_64 #1 SMP Mon Sep 22 19:06:58 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux
Para entender en qué formato se genera la salida, puede consultar helpde este comando:
[user@testhost ~]$ uname --help
Uso: uname [CLAVE]…
Imprime información específica sobre el sistema. Si no se especifica CLAVE,
se asume -s.
-a, --all imprimir toda la información, en el siguiente orden,
excepto -p e -i, si son desconocidos:
-s, --kernel-name imprimir el nombre del núcleo
-n, --nodename imprimir el nombre de la máquina en la red
-r, --release imprimir el número de versión del sistema operativo
-v, --kernel-version imprimir la versión del núcleo
-m, --machine imprimir el tipo de hardware de la máquina
-p, --processor imprimir el tipo de procesador o «desconocido»
-i, --hardware-platform imprimir el tipo de plataforma hardware o «desconocido»
-o, --operating-system imprimir el nombre del sistema operativo
--help mostrar esta ayuda y salir
--version mostrar información de la versión y salir
Información de la memoria
Para entender cuánta memoria RAM está ocupada o libre, puede utilizar el comando free.
[user@testhost ~]$ free -h
total used free shared buff/cache available
Mem: 3.9G 555M 143M 56M 3.2G 3.0G
Swap: 0B 0B 0B
Información sobre los sistemas de archivos (espacio libre en los discos)
Comando df permite ver cuánto espacio está libre y cuánto está ocupado en los sistemas de archivos montados.
[user@testhost ~]$ df -hT
Sistema de archivos Tipo Tamaño Usado Disponible Usado% Montado en
/dev/vda1 ext4 79G 21G 55G 27% /
devtmpfs devtmpfs 2.0G 0 2.0G 0% /dev
tmpfs tmpfs 2.0G 0 2.0G 0% /dev/shm
tmpfs tmpfs 2.0G 57M 1.9G 3% /run
tmpfs tmpfs 2.0G 0 2.0G 0% /sys/fs/cgroup
tmpfs tmpfs 396M 0 396M 0% /run/user/1001
La opción -T indica que se debe mostrar el tipo de sistema de archivos.
Información sobre las tareas y varias estadísticas del sistema
Para esto se utiliza el comando top. Es capaz de mostrar diversa información: por ejemplo, los procesos principales por uso de memoria o los principales por uso de tiempo de CPU. También muestra información sobre la memoria, CPU, tiempo activo y LA (promedio de carga).
[user@testhost ~]$ top | head -10
top - 17:19:13 up 154 días, 6:59, 3 usuarios, promedio de carga: 0.21, 0.21, 0.27
Tareas: 2169 total, 2 en ejecución, 2080 durmiendo, 0 detenidas, 0 zombie
Cpu(s): 1.7%us, 0.7%sy, 0.0%ni, 97.5%id, 0.0%wa, 0.0%hi, 0.1%si, 0.0%st
Mem: 125889960k total, 82423048k usados, 43466912k libres, 16026020k buffers
Swap: 0k total, 0k usados, 0k libres, 31094516k en caché
PID USUARIO PR NI VIRT RES SHR S %CPU %MEM TIEMPO+ COMANDO
25282 usuario 20 0 16988 3936 1964 R 7.3 0.0 0:00.04 top
4264 telegraf 20 0 2740m 240m 22m S 1.8 0.2 23409:39 telegraf
6718 root 20 0 35404 4768 3024 S 1.8 0.0 0:01.49 redis-server
Esta utilidad tiene muchas funciones, así que si necesita usarla con frecuencia, es mejor familiarizarse con su documentación.
Volcado de tráfico de red
Para capturar tráfico de red en Linux se utiliza la utilidad tcpdump. Para volcar el tráfico en el puerto 12345, puede utilizar el siguiente comando:
[user@testhost ~]$ sudo tcpdump -i any -A port 12345
La opción -A indica que veremos la salida en ASCII (por lo que es bueno para protocolos de texto), -i any indica que no nos interesa la interfaz de red, port — tráfico de qué puerto volcar. En lugar de port puede usar host, o una combinación de host y port (host A and port X). Y otra opción útil puede ser -n — no convertir las direcciones en nombres de host en la salida.
¿Qué pasa si el tráfico es binario? Entonces la opción que necesitamos es -X — para mostrar datos en hexadecimal y ASCII:
[user@testhost ~]$ sudo tcpdump -i any -X port 12345
Es importante tener en cuenta que en ambas variantes de uso se mostrarán paquetes IP, por lo que al principio de cada uno habrá encabezados binarios de IP y TCP. Aquí hay un ejemplo de salida para la solicitud «123» enviada al servidor que escucha en el puerto 12345:
[user@testhost ~]$ sudo tcpdump -i any -X port 12345
tcpdump: salida detallada suprimida, use -v o -vv para una decodificación completa del protocolo
escuchando en any, tipo de enlace LINUX_SLL (cocinado de Linux), tamaño de captura 262144 bytes
14:27:13.224762 IP localhost.49794 > localhost.italk: Flags [P.], seq 2262177478:2262177483, ack 3317210845, win 342, options [nop,nop,TS val 3196604972 ecr 3196590131], length 5
0x0000: 4510 0039 dfb6 4000 4006 5cf6 7f00 0001 E..9..@.@ ......
0x0010: 7f00 0001 c282 3039 86d6 16c6 c5b8 9edd ......09 .......
0x0020: 8018 0156 fe2d 0000 0101 080a be88 522c ...V.- .....R,
0x0030: be88 1833 3132 330d 0a00 0000 0000 0000 ...3123.........
0x0040: 0000 0000 0000 0000 00 .........
En lugar de la salida
Por supuesto, en Linux hay muchas más cosas interesantes que se pueden leer en Habr, StackOverflow y otros sitios (como ejemplo puedo mencionar , que también está disponible en ). Los administradores de sistemas y DevOps utilizan muchos más comandos y utilidades para la configuración de servidores, pero incluso a los testers puede no bastar con los comandos mencionados. Puede ser necesario verificar la validez de algún extraño tiempo de espera del cliente hacia el servidor o el funcionamiento del servidor cuando no hay espacio libre en el disco. Ya ni hablar de Docker, que ahora es utilizado activamente por muchas empresas. Sería interesante en el marco de la continuación de este artículo de referencia analizar varios ejemplos de uso de diversas utilidades de consola de Linux en el proceso de prueba de servicios. ¡También compartan su lista de comandos favoritos en los comentarios 🙂
Fuente: habr.com
