Clase 05 — Debug y Diagnóstico con curl
Modo verbose (-v)
curl -v https://httpbin.org/get
# * = info de curl, > = enviado, < = recibido
| Prefijo | Significado |
|---|---|
* | Info de curl (conexión, SSL, etc.) |
> | Datos ENVIADOS al servidor (request) |
< | Datos RECIBIDOS del servidor (response) |
Formato de salida personalizado (-w)
# Solo código HTTP
curl -s -o /dev/null -w "%{http_code}" https://httpbin.org/get
# Múltiples métricas
curl -s -o /dev/null -w "\
HTTP Code: %{http_code}\n\
Total Time: %{time_total}s\n\
DNS Time: %{time_namelookup}s\n\
Connect Time: %{time_connect}s\n\
SSL Time: %{time_appconnect}s\n\
TTFB: %{time_starttransfer}s\n\
Download Size: %{size_download} bytes\n\
IP: %{remote_ip}:%{remote_port}\n\
" https://httpbin.org/get
# Formato JSON
curl -s -o /dev/null -w '{
"http_code": %{http_code},
"time_total": %{time_total},
"time_dns": %{time_namelookup},
"time_ttfb": %{time_starttransfer},
"size_download": %{size_download}
}\n' https://httpbin.org/get | jq '.'
Variables disponibles en -w
| Variable | Descripción |
|---|---|
%{http_code} | Código de estado HTTP |
%{time_total} | Tiempo total |
%{time_namelookup} | Resolución DNS |
%{time_connect} | Conexión TCP |
%{time_appconnect} | Conexión SSL/TLS |
%{time_starttransfer} | TTFB (Time To First Byte) |
%{size_download} | Bytes descargados |
%{speed_download} | Velocidad (bytes/s) |
%{remote_ip} | IP del servidor |
%{ssl_verify_result} | Verificación SSL (0=OK) |
Diagnóstico SSL/TLS
# Info completa de SSL
curl -vI https://github.com 2>&1 | grep -E "SSL|TLS|certificate|issuer|expire"
# Ignorar errores de certificado (⚠️ solo para debug!)
curl -k https://self-signed.badssl.com/
# Especificar CA bundle
curl --cacert /path/to/ca-bundle.crt https://api.ejemplo.com
Script: Verificar expiración de certificados
#!/bin/bash
dominios=("github.com" "google.com" "aws.amazon.com")
for dominio in "${dominios[@]}"; do
expiry=$(echo | openssl s_client -servername "$dominio" -connect "$dominio:443" 2>/dev/null | \
openssl x509 -noout -enddate 2>/dev/null | cut -d= -f2)
echo "$dominio: $expiry"
done
Test de latencia
#!/bin/bash
URL="${1:-https://httpbin.org/get}"
N="${2:-10}"
total=0
for i in $(seq 1 $N); do
time=$(curl -s -o /dev/null -w "%{time_total}" "$URL")
printf " #%02d: %ss\n" "$i" "$time"
total=$(echo "$total + $time" | bc)
done
promedio=$(echo "scale=3; $total / $N" | bc)
echo "Promedio: ${promedio}s ($N peticiones)"
Resolución DNS personalizada (--resolve)
# Forzar que un dominio resuelva a una IP específica
curl --resolve "api.ejemplo.com:443:127.0.0.1" https://api.ejemplo.com/health
# Útil para probar antes de cambiar DNS
Proxy
curl -x http://proxy:8080 https://api.ejemplo.com
curl --socks5 localhost:1080 https://api.ejemplo.com
Ejercicios
- Usá
curl -vpara analizar el handshake SSL dehttps://google.com - Creá un script que mida TTFB de 5 sitios y los ordene de más rápido a más lento
- Usá
-wpara crear un reporte JSON de rendimiento de una URL - Verificá la expiración del certificado SSL de 3 dominios