← Terminal y Línea de Comandos en Linux Bloque 8 · Paquetes y estado del sistema · Tema 40 de 43

Tema 40

La red desde la terminal

Todo lo aprendido hasta aquí ocurrió dentro de una máquina. Pero la terminal nació para usarse a distancia, y sigue siendo la forma en que se administra casi todo lo que hay en Internet: los servidores no tienen pantalla, ni teclado, ni escritorio, y se llega a ellos con un comando. En el tema 2 dijimos que un servidor en la nube era «exactamente el entorno profesional», y que para usarlo había que saber conectarse. Este tema cumple con eso. Primero, lo necesario para saber si hay red y por qué no la hay; después, descargar archivos; y al final ssh, que convierte cada comando de este curso en algo que se puede ejecutar en cualquier máquina del mundo.

1. Cinco conceptos de red

Este no es un curso de redes, y no hace falta que lo sea. Para usar los comandos del tema alcanza con cinco ideas, que son las que aparecen en sus salidas y en sus mensajes de error.

ConceptoQué esEjemplo
InterfazCada conexión de la máquina a una red: la placa cableada, la inalámbrica. El kernel le da un nombre.wlp3s0
Dirección IPEl número que identifica a una interfaz dentro de su red. Es a lo que se envían los datos.192.168.1.37
Puerta de enlaceEl equipo de la red local por el que se sale hacia las demás redes: en una casa, el router.192.168.1.1
DNSEl servicio que traduce nombres en direcciones IP. Las máquinas se comunican por número; los nombres son para las personas.www.gnu.org → 209.51.188.116
PuertoUn número, de 1 a 65535, que distingue a cada servicio dentro de una misma máquina. La dirección lleva hasta el equipo; el puerto, hasta el programa.22 para ssh, 443 para la web segura

Una comunicación completa se describe con esos datos: «desde mi interfaz, con mi dirección, a través de la puerta de enlace, hasta la dirección que el DNS dio para ese nombre, en tal puerto». Cuando la red no funciona, uno de esos eslabones está roto, y el diagnóstico consiste en probarlos en orden.

Las direcciones del ejemplo son las tradicionales, de la versión 4 del protocolo: cuatro números de 0 a 255 separados por puntos. Algunos rangos tienen un significado fijo, y reconocerlos ahorra confusiones:

RangoEs
127.0.0.1La propia máquina. Se llama localhost, y funciona aunque no haya ninguna red.
192.168.x.x, 10.x.x.x, 172.16.x.x a 172.31.x.xDirecciones privadas: valen dentro de una red local, y no son alcanzables desde Internet. Todas las casas usan las mismas.
169.254.x.xLa máquina no consiguió que nadie le asignara una dirección, y se puso una provisoria. Es un síntoma, no una configuración.
Las demásDirecciones públicas, únicas en todo Internet.

De ahí sale una distinción que se necesita apenas se quiere llegar a una máquina desde afuera. Tu equipo tiene una dirección privada, que le dio el router; hacia Internet, toda la casa sale con una sola dirección pública, la del router. Son dos números distintos, y cada uno se averigua de una manera. Las direcciones de la versión 6, como fe80::a2c5:89ff:fe3b:71d2, conviven con las anteriores y aparecerán en las salidas; lo dicho vale igual para ellas.

2. ip address: interfaces y direcciones

ip es el comando para consultar y configurar la red. Es de los que llevan subcomandos, como anticipamos en el tema 3: ip address trata de direcciones, ip route, de rutas. Los subcomandos se pueden abreviar, y casi todo el mundo escribe ip a e ip r. Consultar no requiere sudo.

terminal
$ ip -br address
lo               UNKNOWN        127.0.0.1/8 ::1/128
enp0s31f6        DOWN
wlp3s0           UP             192.168.1.37/24 fe80::a2c5:89ff:fe3b:71d2/64

La opción -br, de brief, da una línea por interfaz: nombre, estado y direcciones. Este equipo tiene tres.

InterfazEsEstado
loLa interfaz de loopback: la máquina hablando consigo misma, en 127.0.0.1. Existe siempre.UNKNOWN, que para ella es lo normal.
enp0s31f6La placa de red cableada.DOWN: no hay cable conectado.
wlp3s0La placa inalámbrica.UP, con dirección: por aquí está conectado.

Los nombres parecen arbitrarios y no lo son. Las dos primeras letras indican la clase —en para Ethernet, wl para inalámbrica— y el resto, la posición física de la placa en el equipo, de modo que el nombre no cambia de un arranque a otro. wlp3s0 es la placa del bus 3, la misma que lspci mostraba en 03:00.0 en el tema 37. En máquinas virtuales y sistemas más viejos aparecen los nombres clásicos, eth0 y wlan0.

Sin -br, la salida es completa. Pidiendo una sola interfaz:

terminal
$ ip address show wlp3s0
3: wlp3s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether a0:c5:89:3b:71:d2 brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.37/24 brd 192.168.1.255 scope global dynamic noprefixroute wlp3s0
       valid_lft 82014sec preferred_lft 82014sec
    inet6 fe80::a2c5:89ff:fe3b:71d2/64 scope link noprefixroute
       valid_lft forever preferred_lft forever
En la salidaSignifica
UPLa interfaz está activada en el sistema.
LOWER_UPHay enlace físico: el cable está conectado, o la red inalámbrica, asociada. Si falta, el problema es del cable o de la señal.
link/etherLa dirección física de la placa, o MAC: viene de fábrica y la identifica en la red local.
inetLa dirección IP, versión 4. Es el dato que casi siempre se busca.
/24El tamaño de la red: los primeros 24 bits —los tres primeros números— son comunes a toda la red local. Aquí, de 192.168.1.1 a 192.168.1.254.
dynamicLa dirección se obtuvo automáticamente, por DHCP: la asignó el router.
valid_lftPor cuántos segundos más vale esa asignación, antes de renovarla.
inet6Una dirección de la versión 6.

Para obtener solo el número, sin nada que filtrar, hay un atajo: hostname -I escribe las direcciones de la máquina, separadas por espacios. Y la dirección pública, la que ven los servidores de Internet, no figura en ninguna interfaz: es del router. Se la pregunta a un servicio externo, con el curl de la sección 8.

terminal
$ hostname -I
192.168.1.37
$ curl -s ifconfig.me; echo
203.0.113.45

En los tutoriales anteriores a 2015 el comando para todo esto es ifconfig. Pertenece a un paquete, net-tools, que las distribuciones ya no instalan, junto con route y netstat. Sus reemplazos son los de este tema: ip address, ip route y ss.

3. ip route: por dónde se sale

Tener dirección no alcanza para llegar a Internet: hay que saber a quién entregarle lo que va hacia afuera. Eso lo dice la tabla de rutas.

terminal
$ ip route
default via 192.168.1.1 dev wlp3s0 proto dhcp src 192.168.1.37 metric 600
192.168.1.0/24 dev wlp3s0 proto kernel scope link src 192.168.1.37 metric 600

Dos líneas, que se leen de abajo hacia arriba. La segunda dice que la red 192.168.1.0/24 está directamente conectada a wlp3s0: a los equipos de la casa se les habla sin intermediarios. La primera es la ruta por defecto: todo lo que no sea de esa red se envía a 192.168.1.1, la puerta de enlace. Ese es el dato que se busca aquí.

Si no hay una línea default, la máquina puede hablar con sus vecinas y con nadie más: es la explicación de «tengo red local y no tengo Internet». Para saber qué camino tomaría un destino concreto:

terminal
$ ip route get 1.1.1.1
1.1.1.1 via 192.168.1.1 dev wlp3s0 src 192.168.1.37 uid 1000
$ ip route get 192.168.1.50
192.168.1.50 dev wlp3s0 src 192.168.1.37 uid 1000

Hacia Internet, pasando por el router; hacia un equipo de la red local, directamente. Con varias interfaces activas —cable e inalámbrica, o una red privada virtual—, esta consulta dice sin lugar a dudas por cuál sale cada cosa.

Con ip se consulta; la configuración se hace en otro lado

ip también puede modificar: sudo ip address add, sudo ip link set … down. Esos cambios se pierden al reiniciar, y en un equipo remoto pueden cortar la conexión por la que se está trabajando. La configuración permanente la lleva un servicio —NetworkManager en los escritorios, netplan o systemd-networkd en los servidores—, cada uno con sus archivos y sus comandos. En este tema nos limitamos a mirar.

4. Nombres y DNS

Nadie recuerda direcciones. Se escribe un nombre, y el sistema lo traduce antes de conectarse. La traducción consulta dos fuentes, en este orden:

FuenteQué esSe usa para
/etc/hostsUn archivo de texto local, con una dirección y sus nombres por línea.La propia máquina, y los nombres que el administrador quiera fijar a mano.
Los servidores DNSMáquinas que responden consultas de nombres. Su dirección la entrega el router, junto con la IP.Todo lo demás.
terminal
$ cat /etc/hosts
127.0.0.1 localhost
127.0.1.1 equipo
…
$ host www.gnu.org
www.gnu.org is an alias for wildebeest1p.gnu.org.
wildebeest1p.gnu.org has address 209.51.188.116
wildebeest1p.gnu.org has IPv6 address 2001:470:142:5::116
$ host no-existe.example
Host no-existe.example not found: 3(NXDOMAIN)

/etc/hosts es el archivo que conocimos en el tema 8, y explica por qué localhost y el nombre de la propia máquina funcionan sin red. Agregarle una línea —192.168.1.50 servidor— permite llamar por su nombre a un equipo de la red local que ningún DNS conoce. host hace una consulta al DNS y muestra la respuesta; NXDOMAIN es la manera en que el DNS dice «ese nombre no existe».

Se escribeHace
host nombreConsulta el DNS y da una respuesta breve.
dig nombreLo mismo, con todo el detalle de la consulta. dig +short nombre, solo la dirección.
getent hosts nombreTraduce como lo haría cualquier programa: mirando primero /etc/hosts. Está siempre instalado.
resolvectl statusMuestra qué servidores DNS usa cada interfaz.
terminal
$ resolvectl status wlp3s0 | grep -i 'dns server'
Current DNS Server: 192.168.1.1
       DNS Servers: 192.168.1.1
$ cat /etc/resolv.conf | grep -v '^#'
nameserver 127.0.0.53
options edns0 trust-ad
search .

El archivo tradicional que indica el servidor DNS es /etc/resolv.conf. En Ubuntu apunta a 127.0.0.53, una dirección de la propia máquina: allí escucha un servicio, systemd-resolved, que recibe todas las consultas, las reenvía al servidor verdadero y recuerda las respuestas. Por eso la pregunta «¿qué DNS estoy usando?» se le hace a resolvectl, y no al archivo.

El DNS es responsable de una gran parte de las fallas que se describen como «no anda Internet». La manera de distinguirlo es la de la sección 6: si se llega a un destino por su número y no por su nombre, la red funciona, y lo roto es la traducción.

5. ping: ¿responde?

ping envía a un destino un mensaje mínimo que pide respuesta, y mide cuánto tarda en volver. Es la prueba elemental de conectividad, y lo usamos sin explicarlo en el tema 25.

terminal
$ ping -c 4 www.gnu.org
PING wildebeest1p.gnu.org (209.51.188.116) 56(84) bytes of data.
64 bytes from wildebeest1p.gnu.org (209.51.188.116): icmp_seq=1 ttl=52 time=168 ms
64 bytes from wildebeest1p.gnu.org (209.51.188.116): icmp_seq=2 ttl=52 time=171 ms
64 bytes from wildebeest1p.gnu.org (209.51.188.116): icmp_seq=3 ttl=52 time=167 ms
64 bytes from wildebeest1p.gnu.org (209.51.188.116): icmp_seq=4 ttl=52 time=169 ms

--- wildebeest1p.gnu.org ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3004ms
rtt min/avg/max/mdev = 167.212/168.790/171.034/1.498 ms
En la salidaSignifica
La primera líneaA qué dirección se tradujo el nombre. Si aparece, el DNS funciona.
icmp_seqEl número de orden de cada envío. Si faltan números, esos se perdieron.
ttlUn contador que baja en cada equipo intermedio: da una idea de cuántos saltos hay hasta el destino.
timeEl tiempo de ida y vuelta. Menos de 1 ms a la propia máquina; unos pocos, al router; decenas o cientos, a otro continente.
packet lossEl porcentaje de envíos sin respuesta. Es el número que se mira.
rtt min/avg/max/mdevEl tiempo mínimo, promedio y máximo, y cuánto varía. Una variación grande indica una conexión inestable.

En Linux, ping no se detiene solo: sin -c sigue enviando hasta que se lo interrumpe con Ctrl+C, y recién entonces muestra las estadísticas. Quien viene de Windows, donde hace cuatro envíos y termina, cree que el comando se colgó.

OpciónEfecto
-c NHace N envíos y termina.
-i NEspera N segundos entre envíos, en lugar de uno.
-W NEspera cada respuesta N segundos como máximo.
-qMuestra solo el resumen final.
-4, -6Fuerza la versión 4 o la 6 del protocolo.

El código de salida es 0 si hubo al menos una respuesta, y por eso sirve en una condición, como en la receta de entonces: ping -c 1 -W 2 servidor > /dev/null && echo "responde" || echo "no responde".

Cuando falla, el mensaje indica en qué eslabón:

RespuestaEl problema está en
Temporary failure in name resolution, Name or service not knownEl DNS: no se pudo traducir el nombre. O no hay red, o el nombre está mal escrito.
Network is unreachableLas rutas: no hay camino hacia ese destino. Falta la ruta por defecto, o la interfaz no tiene dirección.
Destination Host UnreachableLa red local: el destino, o la puerta de enlace, no contesta.
Ninguna línea, y 100% packet lossLos envíos salen y nada vuelve: el destino está apagado, o algo en el camino los descarta.
Que no responda al ping no prueba que esté caído

ping usa un protocolo propio, ICMP, distinto del que usan la web o ssh. Muchos servidores y cortafuegos lo descartan a propósito, y siguen atendiendo sus servicios con normalidad. Una respuesta prueba que el equipo está y que el camino funciona; el silencio no prueba nada. Para saber si un servicio atiende, hay que preguntarle al servicio, como haremos con curl y con nc.

Para ver el camino completo, salto por salto, están tracepath destino, que viene instalado, y traceroute y mtr, que se instalan aparte. Muestran cada equipo intermedio y su tiempo de respuesta, y señalan dónde se corta una comunicación que no llega.

6. Diagnosticar por capas

«No tengo Internet» es un síntoma con cinco causas posibles, una por cada concepto de la sección 1. Se las descarta en orden, de lo más cercano a lo más lejano, y la primera prueba que falla señala el eslabón roto.

El camino de una comunicación y la prueba de cada tramo: la propia interfaz, que se verifica con ip address; la puerta de enlace, con ping a su dirección; Internet, con ping a una dirección externa; y el servidor de destino, con ping a su nombre Tu equipo 192.168.1.37 wlp3s0 Puerta de enlace 192.168.1.1 el router Internet 1.1.1.1 una dirección externa El destino www.gnu.org por su nombre ip -br address ping 192.168.1.1 ping 1.1.1.1 ping www.gnu.org ¿tengo dirección? ¿funciona la red local? ¿hay salida? ¿funciona el DNS? cada prueba supone que las anteriores pasaron
Cuatro pruebas, de izquierda a derecha. La primera que falla dice dónde buscar.
  1. ¿Hay interfaz con dirección? ip -br address. Si está DOWN o sin dirección, el problema es el cable, la red inalámbrica o el DHCP. interfaz
  2. ¿Hay ruta por defecto? ip route. Anotar la dirección de la puerta de enlace. ruta
  3. ¿Responde la puerta de enlace? ping -c 3 192.168.1.1. Si no, falla la red local o el router. red local
  4. ¿Se llega a Internet por número? ping -c 3 1.1.1.1. Si no, el router no tiene salida: es un problema del proveedor. salida
  5. ¿Se llega por nombre? ping -c 3 www.gnu.org. Si el paso anterior funcionó y este no, falla el DNS. nombres

La dirección 1.1.1.1 es la de un servicio público de DNS, elegida por fácil de recordar y porque responde siempre; 8.8.8.8 cumple la misma función. Lo que hace valioso al procedimiento es que no adivina. En dos minutos se pasa de «no anda» a «la máquina está bien, la red local está bien, el router no tiene salida», que es una frase con la que se puede llamar al proveedor.

Si los cinco pasos funcionan y un servicio en particular no responde, la red está sana: el problema es de ese servicio, o de un puerto.

7. ss: puertos y conexiones

Un servicio de red escucha en un puerto: le pide al kernel que le entregue todo lo que llegue con ese número. Un programa que quiere usarlo se conecta a la dirección de la máquina y a ese puerto.

Los servicios conocidos tienen su puerto asignado por convención, de modo que no hace falta indicarlo:

PuertoServicioPuertoServicio
22ssh53DNS
80Web, sin cifrar: http443Web, cifrada: https
25, 587Envío de correo631Impresión
3306MySQL, MariaDB5432PostgreSQL

La lista completa está en un archivo de texto, /etc/services, que se consulta con grep. Los puertos menores que 1024 están reservados: solo root puede poner un programa a escuchar en ellos.

ss, de socket statistics, muestra los puertos en uso. Se lo acompaña casi siempre con las mismas cuatro letras:

las opciones, leídas
ss -tuln
    ││││
    │││└─ n: mostrar números, sin traducirlos a nombres
    ││└─ l: solo los que están escuchando (listening)
    │└─ u: los del protocolo UDP
    └─ t: los del protocolo TCP
terminal
$ ss -tuln
Netid State  Recv-Q Send-Q  Local Address:Port   Peer Address:Port Process
udp   UNCONN 0      0       127.0.0.53%lo:53          0.0.0.0:*
udp   UNCONN 0      0             0.0.0.0:5353        0.0.0.0:*
tcp   LISTEN 0      4096    127.0.0.53%lo:53          0.0.0.0:*
tcp   LISTEN 0      4096        127.0.0.1:631         0.0.0.0:*
tcp   LISTEN 0      4096                *:22                *:*

La columna que hay que leer con cuidado es Local Address:Port. El puerto dice qué servicio es; la dirección, desde dónde se lo puede alcanzar:

Dirección localEl servicio atiendeEn el ejemplo
127.0.0.1, 127.0.0.53, [::1]Solo conexiones de la propia máquina. Desde afuera no existe.El DNS local, en el 53; la impresión, en el 631.
0.0.0.0, *, [::]Conexiones por cualquier interfaz: es alcanzable desde la red.El servidor ssh, en el 22.
Una dirección concretaSolo las que lleguen a esa dirección.—

Esa diferencia explica el caso más frecuente con servicios propios: «instalé la base de datos, funciona en el servidor y desde mi máquina no me puedo conectar». Casi siempre escucha en 127.0.0.1, que es la configuración prudente de fábrica.

Para saber qué programa tiene cada puerto se agrega -p, que requiere sudo para ver los procesos ajenos:

terminal
$ sudo ss -tlnp
State  Recv-Q Send-Q Local Address:Port Peer Address:Port Process
LISTEN 0      4096   127.0.0.53%lo:53        0.0.0.0:*     users:(("systemd-resolve",pid=612,fd=15))
LISTEN 0      4096       127.0.0.1:631       0.0.0.0:*     users:(("cupsd",pid=1033,fd=7))
LISTEN 0      4096               *:22              *:*     users:(("sshd",pid=8410,fd=3),("systemd",pid=1,fd=160))
$ sudo ss -tlnp | grep ':631 '          # ¿quién tiene el puerto 631?

Cada línea termina con el nombre y el PID del proceso, con lo que se vuelve al terreno de los temas 32 y 39. En el puerto 22 figuran dos: sshd y el propio systemd, que mantiene abierto el puerto y despierta al servicio cuando llega alguien. Es la unidad ssh.socket que mencionamos en el tema 39.

Se escribeMuestra
ss -tulnLos puertos en escucha.
sudo ss -tulnpLo mismo, con el proceso de cada uno.
ss -tnLas conexiones TCP establecidas en este momento.
ss -tn state established '( dport = :443 )'Las conexiones salientes hacia el puerto 443.
ss -sUn resumen con cantidades.

ss mira la propia máquina. Para probar un puerto de otra hay que intentar conectarse, y la herramienta mínima es nc, de netcat:

terminal
$ nc -zv 192.168.1.50 22
Connection to 192.168.1.50 22 port [tcp/ssh] succeeded!
$ nc -zv 192.168.1.50 80
nc: connect to 192.168.1.50 port 80 (tcp) failed: Connection refused
$ nc -zv -w 3 192.168.1.50 3306
nc: connect to 192.168.1.50 port 3306 (tcp) timed out: Operation now in progress

La opción -z prueba la conexión sin enviar nada, -v informa el resultado y -w fija cuánto esperar. Las dos formas de fallar dicen cosas distintas, y distinguirlas es media solución:

MensajeQué ocurrióDónde mirar
Connection refusedLa máquina respondió, de inmediato, que nadie escucha en ese puerto.En el servidor: el servicio está detenido, o escucha en otro puerto o solo en 127.0.0.1.
Connection timed outNo hubo ninguna respuesta.En el camino: la máquina está apagada, la dirección es otra, o un cortafuegos descarta los intentos.

8. curl: hablar con un servidor

curl transfiere datos desde una dirección de Internet, o hacia ella. Su uso principal es el que haría un navegador sin pantalla: pedirle algo a un servidor web y entregar la respuesta. Si falta, se instala con sudo apt install curl.

terminal, en ~/practica
$ cd ~/practica
$ curl https://www.gnu.org/licenses/gpl-3.0.txt | head -n 3
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 35149  100 35149    0     0  71402      0 --:--:-- --:--:-- --:--:-- 71440
                    GNU GENERAL PUBLIC LICENSE
                       Version 3, 29 June 2007

$ curl -s https://www.gnu.org/licenses/gpl-3.0.txt | wc -l
674

El comportamiento por defecto es el que lo hace encajar en este curso: curl escribe lo descargado en la salida estándar. No guarda nada. El contenido de una dirección web pasa a ser texto que entra en una tubería, igual que el de un archivo con cat. La tabla de progreso va por el canal de errores, por eso no se mezcla con los datos, y -s la suprime.

OpciónEfecto
-o archivoGuarda la respuesta en ese archivo.
-OLa guarda con el nombre que tiene en el servidor.
-LSigue las redirecciones. Sin ella, si la dirección «se mudó», curl entrega el aviso de mudanza y no el contenido.
-sSilencioso: sin progreso ni mensajes.
-SCon -s, muestra igualmente los errores.
-fSi el servidor responde con un error, falla: no entrega la página de error y termina con código distinto de cero.
-IPide solo los encabezados de la respuesta, sin el contenido.
-C -Reanuda una descarga interrumpida.
-m NAbandona si la operación tarda más de N segundos.

Con esa tabla se puede leer, por fin, la línea que criticamos en el tema 36, curl -fsSL https://… | sudo bash: «descargar, fallando ante un error del servidor, en silencio pero mostrando los errores, siguiendo las redirecciones», y entregar el resultado a una shell con privilegios. Las cuatro letras son la forma estándar de usar curl en un script; lo objetable era lo que venía después de la barra.

Los encabezados y el código de estado

Todo servidor web antepone a su respuesta unas líneas que la describen. La primera lleva un número de tres cifras, el código de estado, que dice cómo le fue al pedido:

terminal
$ curl -sI https://www.gnu.org/licenses/gpl-3.0.txt
HTTP/1.1 200 OK
Date: Tue, 13 Oct 2026 15:02:11 GMT
Server: Apache/2.4.29
Content-Length: 35149
Content-Type: text/plain
…
$ curl -s -o /dev/null -w '%{http_code}\n' https://www.gnu.org/no-existe
404
CódigoSignifica
200Correcto: aquí está lo pedido.
301, 302Redirección: lo pedido está en otra dirección. curl la sigue con -L.
401, 403Hace falta identificarse; o no está permitido.
404No existe.
500, 502, 503Error del servidor: el pedido era válido, y el problema es de ellos.

La primera cifra da la clase: 2 es éxito, 3 redirección, 4 un error de quien pide, 5 un error de quien responde. La segunda forma del ejemplo, con -w, descarta el contenido y escribe solo el código: es la manera de verificar desde un script que un sitio está en pie. Y es la respuesta a la advertencia de la sección 5: un servidor web no se comprueba con ping, sino pidiéndole una página.

Para curl, una página de error es una descarga exitosa

Si se pide un archivo que no existe, el servidor responde con el código 404 y una página que lo explica. curl recibió una respuesta, la guarda y termina con código de salida 0. El resultado es un archivo con el nombre esperado y, adentro, un texto HTML que dice «Not Found»; el error aparece mucho después, cuando tar o el instalador se niegan a abrirlo. Al descargar para usar se agregan siempre -f y -L, y ante la duda se mira qué llegó, con file y head, del tema 12.

curl sirve además para conversar con los servicios que entregan datos en lugar de páginas, las API. Responden texto, por lo general en formato JSON, que se procesa con una herramienta dedicada, jq. Es el camino por el que un script consulta el clima, una cotización o el estado de un servidor.

9. wget: descargar archivos

wget hace una sola cosa, y está pensado para hacerla sin vigilancia: descargar archivos. A diferencia de curl, guarda en el disco sin que se lo pidan, sigue las redirecciones y reintenta si la conexión se corta.

terminal
$ wget https://www.gnu.org/licenses/gpl-3.0.txt
--2026-10-13 12:10:02--  https://www.gnu.org/licenses/gpl-3.0.txt
Resolving www.gnu.org (www.gnu.org)... 209.51.188.116, 2001:470:142:5::116
Connecting to www.gnu.org (www.gnu.org)|209.51.188.116|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 35149 (34K) [text/plain]
Saving to: ‘gpl-3.0.txt’

gpl-3.0.txt         100%[===================>]  34.33K  --.-KB/s    in 0.05s

2026-10-13 12:10:03 (702 KB/s) - ‘gpl-3.0.txt’ saved [35149/35149]
$ wc -l gpl-3.0.txt
674 gpl-3.0.txt

La salida de wget es todo el tema en cuatro líneas: resolver el nombre con el DNS, conectarse a la dirección en el puerto 443, enviar el pedido y recibir el código 200. Cuando una descarga falla, la línea en que se detiene dice en qué eslabón: si no pasa de Resolving, es el DNS; si se queda en Connecting, la red o un cortafuegos; si responde 404, la dirección.

OpciónEfecto
-O archivoGuarda con ese nombre. Con -O -, escribe en la salida estándar, como curl.
-P directorioGuarda en ese directorio.
-cContinúa una descarga interrumpida, desde donde quedó.
-qSilencioso.
-i lista.txtDescarga todas las direcciones de un archivo, una por línea.
--limit-rate=500kLimita la velocidad, para no ocupar toda la conexión.

Si el archivo ya existe, wget no lo pisa: guarda el nuevo como gpl-3.0.txt.1. Para una descarga grande —una imagen .iso, por ejemplo— la opción que vale es -c: si se corta a los 3 GB, repetir el mismo comando retoma en lugar de empezar de nuevo. Y para dejarla corriendo aunque se cierre la terminal están el nohup y el & del tema 33.

curlwget
Por defectoEscribe en la salida estándarGuarda en un archivo
RedireccionesHay que pedirlas, con -LLas sigue
ReintentosHay que pedirlosReintenta solo
Fuerte enTuberías, scripts, API, encabezados, enviar datosDescargas grandes, varias a la vez, sitios enteros
Descargar un archivocurl -fLO direcciónwget dirección

Lo descargado de Internet conviene verificarlo. Los sitios serios publican, junto a cada archivo, su suma de verificación: una cadena calculada a partir del contenido, que cambia por completo si se altera un solo byte. sha256sum archivo la calcula para lo que llegó, y si coincide con la publicada, el archivo está íntegro.

10. ssh: una terminal en otra máquina

ssh, de secure shell, abre una sesión de terminal en otra máquina a través de la red. Todo lo que se escribe y todo lo que se recibe viaja cifrado. Lo que se ejecuta, se ejecuta allá: con los archivos, los programas y los recursos de la máquina remota.

Hacen falta dos cosas: que la máquina remota tenga en marcha el servidor de ssh, que escucha en el puerto 22, y tener en ella una cuenta de usuario. La forma del comando es la de una dirección de correo:

la forma general
ssh ana@192.168.1.50
     │       │
     │       └─ la máquina: una dirección IP o un nombre
     └─ el usuario EN ESA MÁQUINA. Si se omite, se usa el nombre del usuario local
terminal: la primera conexión
ana@equipo:~$ ssh ana@192.168.1.50
The authenticity of host '192.168.1.50 (192.168.1.50)' can't be established.
ED25519 key fingerprint is SHA256:Xk3v0q1mB7yT2dNf8sLwQ4hZr6uJc9aEoPiV5gYtR1U.
This key is not known by any other names.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '192.168.1.50' (ED25519) to the list of known hosts.
ana@192.168.1.50's password:
Welcome to Ubuntu 24.04.3 LTS (GNU/Linux 6.8.0-87-generic x86_64)
…
ana@servidor:~$ hostname
servidor
ana@servidor:~$ uptime
 12:18:40 up 41 days,  3:07,  1 user,  load average: 0,08, 0,05, 0,01
ana@servidor:~$ exit
logout
Connection to 192.168.1.50 closed.
ana@equipo:~$ 

La contraseña que se pide es la de la cuenta en la máquina remota, y al escribirla no aparece nada, como con sudo en el tema 2. Una vez dentro, el indicador cambia: ana@servidor. Es la única señal de dónde se está, y la razón por la que el tema 34 insistió en conservar el nombre de la máquina en PS1. Todo lo que se escriba ahora ocurre en el servidor, hasta salir con exit o Ctrl+D.

Lo demás es lo de siempre. Los cuarenta temas anteriores funcionan igual a través de ssh, porque del otro lado hay una shell Bash. Esa es la recompensa de haber aprendido la terminal: un servidor a diez mil kilómetros se maneja exactamente como el equipo propio.

La pregunta de la primera vez

Antes de la contraseña hubo una pregunta. Cada servidor tiene una clave que lo identifica, y ssh muestra su huella, una versión corta de esa clave. La primera vez no tiene con qué compararla, y pregunta si se confía. Al responder yes —la palabra completa—, la anota en ~/.ssh/known_hosts, y en adelante la comprueba en silencio.

Si la huella de un servidor cambia, ssh se niega a conectar

Cuando la clave que presenta un servidor no coincide con la anotada, aparece un recuadro alarmante, WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!, y la conexión no se establece. La protección existe para el caso en que alguien se hace pasar por el servidor para capturar la contraseña. En la práctica, la causa habitual es inocente: el servidor fue reinstalado, o esa dirección IP pasó a ser de otra máquina. Si se sabe que es eso, se borra la anotación vieja con ssh-keygen -R 192.168.1.50 y se vuelve a conectar. Si no se sabe por qué cambió, no se sigue adelante sin averiguarlo.

Ejecutar un solo comando

Si después de la dirección se escribe un comando, ssh lo ejecuta en la máquina remota, muestra su salida y termina, sin abrir una sesión:

terminal
ana@equipo:~$ ssh ana@192.168.1.50 'df -h / | tail -n 1'
/dev/sda2        98G   71G   23G  76% /
ana@equipo:~$ ssh ana@192.168.1.50 'journalctl -p err -b --no-pager' | wc -l
12
ana@equipo:~$ ssh ana@192.168.1.50 'cat /var/log/syslog' | grep -c cron
88

Las comillas simples deciden dónde se ejecuta cada parte. En la primera línea, toda la tubería está entre comillas y corre en el servidor. En la segunda, journalctl corre allá y wc, aquí: la salida del comando remoto atraviesa la red y entra en una tubería local. Es el mecanismo del tema 24, sin modificaciones, extendido a dos máquinas. También las variables y los comodines siguen las reglas del tema 9: sin comillas, los expande la shell local antes de que ssh arranque.

Se escribeEfecto
ssh usuario@máquinaAbre una sesión.
ssh usuario@máquina 'comando'Ejecuta un comando y vuelve.
ssh -p 2222 usuario@máquinaSe conecta a otro puerto.
ssh -v usuario@máquinaMuestra cada paso de la conexión. Para diagnosticar por qué no entra.
ssh -t usuario@máquina 'sudo comando'Reserva una terminal para el comando: necesario si pide contraseña o usa la pantalla.

Una sesión de ssh depende de la conexión. Si la red se corta, la sesión muere, y con ella lo que estuviera ejecutándose: es el SIGHUP del tema 33. Para los trabajos largos en un servidor se usa tmux, que mantiene la sesión viva del lado remoto, como anticipamos entonces.

Para practicar sin una segunda máquina

Se puede instalar el servidor en el propio equipo, con sudo apt install openssh-server, y conectarse a uno mismo: ssh localhost. Todo lo que sigue —la huella, las claves, scp— funciona igual. Al terminar, si no se lo va a usar, conviene detenerlo y deshabilitarlo con lo aprendido en el tema 39: sudo systemctl disable --now ssh.socket ssh.service.

11. Claves en lugar de contraseñas

Escribir la contraseña en cada conexión es incómodo, y una contraseña es además lo que prueban sin descanso los programas que recorren Internet buscando servidores. La forma habitual de identificarse ante ssh es otra.

Un par de claves son dos archivos relacionados matemáticamente. La clave privada queda en tu máquina y no se entrega a nadie. La clave pública se copia a cada servidor al que quieras entrar. El servidor puede comprobar, con la pública, que quien se conecta tiene la privada, sin que esta viaje nunca por la red.

En tu equipo, dentro de .ssh, quedan la clave privada id_ed25519 y la clave pública id_ed25519.pub. Con ssh-copy-id, la clave pública se agrega al archivo authorized_keys de tu cuenta en el servidor. La clave privada nunca sale de tu equipo Tu equipo · ~/.ssh/ id_ed25519 · privada id_ed25519.pub · pública El servidor · ~/.ssh/ authorized_keys las claves públicas admitidas ssh-copy-id la privada no sale de aquí
Se genera el par una vez, y se copia la clave pública a cada servidor. Perder la pública no es grave; perder el control de la privada, sí.

Son tres pasos, y los dos primeros se hacen una sola vez.

terminal: 1. generar el par
ana@equipo:~$ ssh-keygen -t ed25519 -C "ana@equipo"
Generating public/private ed25519 key pair.
Enter file in which to save the key (/home/ana/.ssh/id_ed25519):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/ana/.ssh/id_ed25519
Your public key has been saved in /home/ana/.ssh/id_ed25519.pub
ana@equipo:~$ ls -l ~/.ssh
-rw------- 1 ana ana  411 oct 13 12:31 id_ed25519
-rw-r--r-- 1 ana ana   92 oct 13 12:31 id_ed25519.pub
-rw------- 1 ana ana  978 oct 13 12:18 known_hosts

-t ed25519 elige el tipo de clave, el recomendado hoy; -C le agrega un comentario para reconocerla. A la primera pregunta se responde con Enter, para aceptar el lugar habitual. La segunda pide una frase de paso: una contraseña que protege el archivo de la clave privada, de modo que quien lo robe no pueda usarlo. Conviene ponerla. Un programa, ssh-agent, que los escritorios ya traen en marcha, la recuerda durante la sesión para no pedirla en cada conexión.

Los permisos de los archivos no son casuales: la privada es rw-------, solo del dueño, y el directorio ~/.ssh, drwx------, como anotamos en la tabla del tema 17.

terminal: 2. copiar la clave pública al servidor
ana@equipo:~$ ssh-copy-id ana@192.168.1.50
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
ana@192.168.1.50's password:

Number of key(s) added: 1

Now try logging into the machine, with:   "ssh 'ana@192.168.1.50'"
and check to make sure that only the key(s) you wanted were added.
terminal: 3. conectarse
ana@equipo:~$ ssh ana@192.168.1.50
Welcome to Ubuntu 24.04.3 LTS (GNU/Linux 6.8.0-87-generic x86_64)
ana@servidor:~$ cat ~/.ssh/authorized_keys
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIGq7…Yw0x ana@equipo

La contraseña se pidió por última vez en el paso 2. ssh-copy-id agregó una línea al archivo ~/.ssh/authorized_keys de la cuenta remota, y esa línea es la clave pública entera: un texto de una sola línea, que también se podría haber pegado a mano. Es lo que piden los servicios en la nube y los sitios como GitHub cuando solicitan «tu clave SSH»: el contenido de id_ed25519.pub.

La clave privada no se copia, no se envía y no se publica

El archivo sin extensión, id_ed25519, es el equivalente de todas tus contraseñas juntas: quien lo tenga entra a cada servidor donde esté tu clave pública. No se manda por correo ni por mensajería, no se sube a un repositorio de código, no se pega en un formulario. Lo que se comparte es siempre el archivo terminado en .pub. Y ssh lo hace cumplir a su manera: si la clave privada tiene permisos que permiten leerla a otros usuarios, se niega a usarla, con el mensaje UNPROTECTED PRIVATE KEY FILE!. Se corrige con chmod 600, del tema 18.

Con las claves funcionando, en un servidor expuesto a Internet se da el paso que cierra la puerta a los ataques por fuerza bruta: desactivar el ingreso con contraseña, poniendo PasswordAuthentication no en /etc/ssh/sshd_config. Es una edición de la configuración del servicio por el que se está conectado, y se hace con las precauciones del final del tema 39: probar con sudo sshd -t, recargar, y comprobar desde una segunda terminal antes de cerrar la primera.

12. ~/.ssh/config: nombres cortos

Usuario, dirección, puerto, archivo de clave: demasiado para escribir cada vez. ssh lee un archivo de configuración personal en el que cada máquina recibe un nombre corto, con todos sus datos.

~/.ssh/config
Host servidor
    HostName 192.168.1.50
    User ana

Host web
    HostName 203.0.113.10
    User administrador
    Port 2222
    IdentityFile ~/.ssh/id_ed25519

Host *
    ServerAliveInterval 60
terminal
ana@equipo:~$ chmod 600 ~/.ssh/config
ana@equipo:~$ ssh servidor                       # equivale a ssh ana@192.168.1.50
ana@servidor:~$ exit
ana@equipo:~$ ssh web 'uptime'                    # equivale a ssh -p 2222 administrador@203.0.113.10 'uptime'
LíneaIndica
HostEl nombre corto que se escribirá. Abre un bloque.
HostNameLa dirección o el nombre real de la máquina.
UserEl usuario remoto.
PortEl puerto, si no es el 22.
IdentityFileLa clave privada a usar, si no es la de nombre habitual.
Host *Opciones para todas las máquinas. ServerAliveInterval 60 envía una señal cada minuto, y evita que las conexiones inactivas se corten.

Los nombres definidos allí valen para todos los programas que se apoyan en ssh, que son los de la sección siguiente, y se completan con Tab.

13. scp y rsync: copiar entre máquinas

scp, de secure copy, es cp a través de ssh. Tiene la misma forma —origen y destino— y la misma identificación; lo que agrega es una manera de nombrar un archivo que está en otra máquina:

una ruta remota
ana@192.168.1.50:/var/log/syslog
       │        │      │
       │        │      └─ la ruta, en la máquina remota
       │        └─ los dos puntos: lo que hace que sea una ruta remota
       └─ usuario y máquina, como en ssh
terminal
ana@equipo:~$ cd ~/practica
ana@equipo:~/practica$ scp estado.txt servidor:/tmp/               # de aquí hacia allá
estado.txt                                    100%  437    98.2KB/s   00:00
ana@equipo:~/practica$ scp servidor:/etc/hostname .                # de allá hacia aquí
hostname                                      100%    9     3.1KB/s   00:00
ana@equipo:~/practica$ scp -r fotos servidor:respaldo/             # un directorio, con -r
ana@equipo:~/practica$ scp estado.txt servidor:                    # al directorio personal remoto

Las reglas son las de cp, del tema 11: -r para directorios, -p para conservar fechas y permisos, y el destino que puede ser un directorio o un nombre nuevo. Una ruta remota relativa parte del directorio personal del usuario en la otra máquina, y por eso servidor:, sin nada después, es ese directorio. El puerto se indica con -P, en mayúscula, a diferencia de ssh.

Sin los dos puntos, scp hace una copia local

scp estado.txt servidor no envía nada a ninguna parte: crea en el directorio actual una copia del archivo llamada servidor, y termina sin error. Los dos puntos son lo único que distingue una máquina de un nombre de archivo. Es el descuido clásico del comando, y se nota recién cuando se va a buscar el archivo del otro lado.

Para copiar un archivo, scp es suficiente. Para un directorio grande, o para repetir una copia, la herramienta es rsync, la que dejamos anotada en el tema 11. Compara origen y destino y transfiere solo lo que cambió; si se interrumpe, al repetir el comando continúa.

terminal
ana@equipo:~/practica$ rsync -av fotos/ servidor:respaldo/fotos/
sending incremental file list
./
playa.jpg
sierra.jpg
…
sent 856,402 bytes  received 133 bytes  342,614.00 bytes/sec
total size is 855,810  speedup is 1.00
ana@equipo:~/practica$ rsync -av fotos/ servidor:respaldo/fotos/   # otra vez: no hay nada que enviar
sending incremental file list

sent 198 bytes  received 12 bytes  140.00 bytes/sec
total size is 855,810  speedup is 4,075.29
OpciónEfecto
-aModo archivo: recorre subdirectorios y conserva permisos, fechas y enlaces. Es la que se usa siempre.
-vLista lo que transfiere.
-nSimulacro: muestra lo que haría, sin hacerlo.
-zComprime durante la transferencia. Útil en conexiones lentas.
--progressMuestra el avance de cada archivo.
--deleteBorra del destino lo que ya no está en el origen, para que queden idénticos.

Dos cuidados. La barra final del origen cambia el resultado: fotos/ significa «el contenido de fotos», y fotos, sin barra, «el directorio fotos», que se crearía dentro del destino. Y --delete borra: con el origen y el destino invertidos por error, vacía lo que se quería conservar. Antes de usarla se agrega -n, se lee lo que el comando anuncia, y recién entonces se lo ejecuta de verdad. rsync debe estar instalado en las dos máquinas, y sirve igual entre dos directorios de un mismo equipo.

Necesito…Herramienta
Enviar o traer un archivo, una vezscp
Copiar un directorio grande, o poder retomar si se cortarsync -av
Mantener dos directorios iguales, repitiendo la copiarsync -av --delete
Recorrer los archivos remotos y elegir qué traersftp, que abre una sesión interactiva
Pasar la salida de un comando a un archivo de otra máquinacomando | ssh servidor 'cat > archivo'

14. Recetas y errores comunes

Quiero…Comando
Ver mis interfaces y direccionesip -br address
Saber solo mi dirección IPhostname -I
Saber mi dirección públicacurl -s ifconfig.me
Saber cuál es mi puerta de enlaceip route | grep default
Saber qué servidor DNS usoresolvectl status
Traducir un nombre a una direcciónhost nombre, o getent hosts nombre
Comprobar si una máquina respondeping -c 3 máquina
Ver por dónde pasa una comunicacióntracepath máquina
Ver qué puertos escucha mi equipo, y qué programassudo ss -tulnp
Saber quién ocupa un puertosudo ss -tlnp | grep ':8080 '
Probar si un puerto remoto está abiertonc -zv máquina 22
Saber a qué servicio corresponde un puertogrep -w 5432 /etc/services
Comprobar que un sitio web respondecurl -sI https://sitio
Descargar un archivowget dirección, o curl -fLO dirección
Retomar una descarga cortadawget -c dirección
Verificar un archivo descargadosha256sum archivo
Entrar a otra máquinassh usuario@máquina
Ejecutar un comando en otra máquinassh usuario@máquina 'comando'
Dejar de escribir la contraseñassh-keygen -t ed25519, y ssh-copy-id usuario@máquina
Mostrar mi clave pública, para pegarla en un sitiocat ~/.ssh/id_ed25519.pub
Enviar un archivo a otra máquinascp archivo usuario@máquina:ruta/
Traer un directorio de otra máquinarsync -av usuario@máquina:ruta/ destino/
SíntomaCausaSolución
ifconfig: command not foundEl paquete que lo trae ya no se instala.ip address.
La interfaz está UP y sin dirección, o con 169.254.x.x.No obtuvo respuesta del DHCP.Revisar el router, o la clave de la red inalámbrica.
ping no termina nunca.En Linux sigue hasta que se lo interrumpe.Ctrl+C; o -c 4.
Temporary failure in name resolutionEl DNS no responde, o no hay red.ping 1.1.1.1: si funciona, es el DNS.
Network is unreachableNo hay ruta por defecto.ip route; reconectar la red.
La máquina no responde al ping, y su sitio web funciona.Descarta los mensajes de ping a propósito.Probar el servicio: curl -I, nc -zv.
Un servicio funciona en el servidor y no se lo alcanza desde otro equipo.Escucha solo en 127.0.0.1, o un cortafuegos lo bloquea.sudo ss -tlnp en el servidor; revisar su configuración.
Address already in use al iniciar un servicio.Otro programa ya ocupa ese puerto.sudo ss -tlnp | grep ':puerto '.
curl llena la pantalla de símbolos.Escribió un archivo binario en la terminal.-o archivo, o -O. Si la terminal quedó rara, reset.
El archivo descargado con curl no se puede abrir.Es una página de error o un aviso de redirección.file archivo; repetir con -fL.
curl: (6) Could not resolve hostFalla el DNS, o el nombre está mal escrito.Sección 4.
curl: (60) SSL certificate problemEl certificado del sitio no es válido, o la fecha del equipo está mal.Verificar la dirección y date. No «solucionarlo» con -k, que desactiva la verificación.
ssh: connect to host … port 22: Connection refusedLa máquina existe, y no tiene el servidor de ssh escuchando.Instalarlo o iniciarlo allí; revisar el puerto.
ssh: connect to host … port 22: Connection timed outLa máquina no responde: dirección equivocada, apagada, o un cortafuegos.ping, y verificar la dirección.
Permission denied (publickey,password).Usuario equivocado, contraseña equivocada, o clave no autorizada.Revisar el usuario remoto; ssh -v muestra qué se intentó.
Permission denied (publickey).El servidor solo admite claves, y la tuya no está en authorized_keys.Hacer llegar la clave pública por otro medio.
REMOTE HOST IDENTIFICATION HAS CHANGED!La clave del servidor no coincide con la anotada.Si se sabe por qué: ssh-keygen -R máquina.
UNPROTECTED PRIVATE KEY FILE!La clave privada es legible por otros.chmod 600 ~/.ssh/id_ed25519.
Copié la clave y ssh sigue pidiendo contraseña.En el servidor, ~/.ssh o authorized_keys tienen permisos demasiado abiertos.chmod 700 ~/.ssh; chmod 600 ~/.ssh/authorized_keys.
La sesión de ssh se congela y no acepta nada.La conexión se cortó.Enter, y luego ~. para cerrarla desde este lado.
Ejecuté el comando en la máquina equivocada.No se miró el indicador.Leer usuario@máquina antes de cada orden delicada.
scp terminó sin error y el archivo no está en el servidor.Faltaron los dos puntos: fue una copia local.scp archivo máquina:
rsync creó un directorio dentro de otro igual.Faltó la barra final en el origen.rsync -av origen/ destino/

La referencia del tema:

Se escribeQué hace
ip -br address, ip addressMuestra las interfaces y sus direcciones.
ip routeMuestra las rutas y la puerta de enlace.
host nombre, getent hosts nombreTraduce un nombre a una dirección.
ping -c N destinoComprueba si un destino responde, N veces.
tracepath destinoMuestra los saltos del camino.
ss -tuln, sudo ss -tulnpLos puertos en escucha; con sus procesos.
nc -zv máquina puertoPrueba si un puerto remoto acepta conexiones.
curl direcciónEscribe el contenido en la salida estándar.
curl -fLO direcciónDescarga a un archivo, siguiendo redirecciones y fallando ante errores.
curl -sI direcciónMuestra los encabezados y el código de estado.
wget dirección, wget -cDescarga un archivo; retoma una descarga.
ssh usuario@máquinaAbre una sesión remota.
ssh usuario@máquina 'comando'Ejecuta un comando remoto.
ssh-keygen -t ed25519Genera un par de claves.
ssh-copy-id usuario@máquinaInstala la clave pública en la máquina remota.
~/.ssh/configDefine nombres cortos para las conexiones.
scp origen destinoCopia entre máquinas. Lo remoto lleva máquina:ruta.
rsync -av origen/ destino/Sincroniza, transfiriendo solo lo que cambió.

Con este tema termina el bloque, y con él, el recorrido por las herramientas. Sabemos movernos por los archivos, procesar texto, gobernar procesos, administrar el sistema y trabajar en una máquina que no tenemos delante. En ~/practica quedó un archivo nuevo, gpl-3.0.txt. Varias veces, en estos temas, una línea de comandos resultó tan larga y tan útil que daba pena escribirla una sola vez: el informe de estado del tema 37, la búsqueda de lo que llena el disco, el diagnóstico de la red. El último bloque parte de ahí. En el tema 41 guardamos una secuencia de comandos en un archivo, le damos permiso de ejecución y la usamos como si fuera un comando más: el primer script.

15. Resumen

16. Preguntas de repaso

Intenta responder cada una antes de abrir la respuesta.

1. ¿Qué diferencia hay entre una dirección IP privada y una pública? ¿Cómo averiguas cada una?

La privada vale dentro de la red local y no es alcanzable desde Internet; la pública es única en Internet, y es la del router. La privada se ve con ip -br address o hostname -I; la pública, preguntándole a un servicio externo, como curl -s ifconfig.me.

2. En la salida de ip -br address, ¿qué es la interfaz lo?

La interfaz de loopback, con la dirección 127.0.0.1: la máquina comunicándose consigo misma. Existe aunque no haya ninguna red.

3. ¿Qué indica la línea default via 192.168.1.1 dev wlp3s0 de ip route?

Que todo lo que no vaya a una red directamente conectada se envía a 192.168.1.1, la puerta de enlace, por la interfaz wlp3s0.

4. ¿Para qué sirve /etc/hosts?

Para traducir nombres a direcciones localmente, antes de consultar el DNS. Contiene localhost y el nombre de la máquina, y se le pueden agregar otros.

5. ping 1.1.1.1 funciona y ping www.gnu.org responde Temporary failure in name resolution. ¿Qué está fallando?

El DNS. La red funciona, porque se llega a una dirección externa; lo que no funciona es la traducción de nombres.

6. Un servidor no responde al ping. ¿Se puede concluir que está apagado?

No. Muchos servidores y cortafuegos descartan los mensajes de ping y atienden normalmente sus servicios. Hay que probar el servicio, con curl o nc.

7. Enumera, en orden, las pruebas para diagnosticar «no tengo Internet».

Que la interfaz tenga dirección, con ip -br address; que haya ruta por defecto, con ip route; ping a la puerta de enlace; ping a una dirección externa, como 1.1.1.1; y ping a un nombre.

8. ¿Qué significan las cuatro letras de ss -tuln?

t, conexiones TCP; u, UDP; l, solo los puertos en escucha; n, mostrar números en lugar de nombres.

9. En ss -tln, un servicio figura en 127.0.0.1:5432 y otro en 0.0.0.0:22. ¿Cuál se puede usar desde otra máquina?

El segundo. El primero escucha solo en la dirección de la propia máquina, y desde afuera no es alcanzable.

10. ¿Qué diferencia hay entre Connection refused y Connection timed out?

refused: la máquina respondió que nadie escucha en ese puerto. timed out: no hubo ninguna respuesta, porque la máquina no está, la dirección es otra o un cortafuegos descarta el intento.

11. ¿Adónde va lo que descarga curl dirección, y qué permite eso?

A la salida estándar. Permite usar el contenido de una dirección web en una tubería, como si fuera la salida de cualquier otro comando.

12. ¿Qué hacen las opciones -f, -L y -O de curl?

-f hace que falle si el servidor responde con un error; -L, que siga las redirecciones; -O, que guarde la respuesta en un archivo con el nombre que tiene en el servidor.

13. Una descarga de 4 GB con wget se cortó a la mitad. ¿Qué haces?

Repetir el comando con -c, que retoma desde donde quedó en lugar de empezar de nuevo.

14. Estás conectado por ssh. ¿Cómo sabes en qué máquina se ejecutará lo que escribas?

Por el indicador, que muestra usuario@máquina, o ejecutando hostname.

15. En ssh servidor 'grep error /var/log/syslog' | wc -l, ¿dónde se ejecuta cada comando?

grep se ejecuta en el servidor, porque está entre comillas como argumento de ssh. wc se ejecuta en la máquina local, y recibe por la tubería la salida del comando remoto.

16. De un par de claves, ¿cuál se copia al servidor y cuál no se entrega nunca? ¿En qué archivo del servidor queda?

Se copia la pública, el archivo terminado en .pub, que queda como una línea de ~/.ssh/authorized_keys. La privada no sale de la máquina propia.

17. ¿Qué hace scp informe.pdf servidor, y qué se quiso escribir?

Crea una copia local del archivo llamada servidor. Para enviarlo a la máquina faltan los dos puntos: scp informe.pdf servidor:.

18. ¿Qué ventaja tiene rsync -av sobre scp -r al repetir una copia?

Compara el origen con el destino y transfiere solo lo que cambió; si se interrumpe, al repetirlo continúa donde quedó.

Para practicar

  1. Ejecuta ip -br address y luego ip address. ¿Cuántas interfaces tienes, cuál está en uso y cuál es su dirección? ¿Es privada? Averigua también tu dirección pública.
  2. Identifica tu puerta de enlace con ip route. Consulta con ip route get el camino hacia 1.1.1.1, hacia la puerta de enlace y hacia 127.0.0.1.
  3. Averigua qué servidor DNS usa tu equipo. Traduce tres nombres con host, y uno inventado. Compara host localhost con getent hosts localhost, y explica la diferencia.
  4. Haz ping -c 5 a 127.0.0.1, a tu puerta de enlace y a un sitio de otro continente. Compara los tiempos y el ttl de los tres.
  5. Recorre los cinco pasos de la sección 6 con la red funcionando, y anota el resultado de cada uno. Desconecta la red y repítelos: ¿cuál es el primero que falla, y con qué mensaje?
  6. Lista los puertos en escucha con sudo ss -tulnp. Para cada uno, anota el programa y si es alcanzable desde la red. Busca tres de esos puertos en /etc/services.
  7. Con curl, cuenta las líneas y las palabras de https://www.gnu.org/licenses/gpl-3.0.txt sin guardarlo, y muestra las diez palabras más frecuentes con los filtros del tema 26. Luego obtén solo el código de estado de esa dirección y de una que no exista.
  8. Descarga el mismo archivo con wget y con curl -fLO. Repite los dos comandos: ¿qué hace cada uno con el archivo que ya existe? Calcula su suma con sha256sum en las dos copias.
  9. Instala el servidor de ssh, o usa una segunda máquina. Conéctate, observa la pregunta de la huella y el cambio del indicador, y sal. Ejecuta de forma remota hostname, uptime y df -h /, sin abrir sesión.
  10. Genera un par de claves, instálalo con ssh-copy-id y comprueba que ya no se pide la contraseña. Define un nombre corto en ~/.ssh/config, envía un archivo con scp y un directorio con rsync -av, y repite el rsync para ver que no transfiere nada.