Emezeta.com

10 comandos «one-line» para administradores


Un one-line command (o comando de una sola línea) es una secuencia de varios comandos encadenados entre sí, de forma que la salida de un comando, es la entrada del siguiente. Es muy común la construcción de comandos one-line en lenguajes y/o herramientas como Perl, AWK o entornos de sistemas operativos.

terminal comandos server servidor commands

En este pequeño manual veremos 10 comandos one-line, especialmente indicado para administradores web que trabajan y manipulan registros de acceso y logs en servidores.

Ejemplo

Si no tienes claro como funcionan las redirecciones y los comandos de este tipo, veamos un pequeño y sencillo ejemplo antes de empezar.

Si eres muy nuevo en este tipo de artículos y quieres aprender desde un punto de vista más básico, puedes echarle un vistazo a 10 comandos para trabajar en Linux.

1. Los 35 recursos más pedidos

Con este one-line command conseguiremos que se nos muestren los 35 recursos más pedidos a nuestro servidor web, con la transferencia acumulada y el tamaño de cada recurso independientemente (entre paréntesis).

cat access_log | cut -d” ” -f10,7 | sort -n | uniq -c | awk ‘{printf(“%2.2fMB (%2.2fKB) %s\n”, ((($3*$1)/1024)/1024), (($3)/1024), $2)}’ | sort -n | tail -35

Es muy útil para optimizar nuestro sitio web con respecto a la transferencia, ya que podemos observar que ficheros son los más pedidos y actuar en consecuencia.

Ejemplo de resultado
28.56MB (91.98KB) /weblog/geek-nogeek-2.png
28.64MB (13.85KB) /ttf/sansation.ttf
29.24MB (3.71KB) /img/imgload.jpg
39.58MB (10.53KB) /img/social-susc.png
48.43MB (130.18KB) /weblog/ajedrez-ag-piezas.jpg

2. Los 50 agentes de usuario menos comunes

Un agente de usuario es la identificación del navegador (o aplicación) que se utiliza para acceder al recurso del servidor web. Se ordenarán por número de peticiones realizadas.

cat access_log | cut -d” ” -f12- | egrep -v “MSIE|Gecko|Safari|Opera” | sort | uniq -c | sort -n | tail -50

En este ejemplo filtraremos los navegadores basados en el motor del Internet Explorer, Gecko, Safari y Opera.

Ejemplo de resultado
113 "facebookexternalhit/1.1 (+http://www.facebook.com/externalhit_uatext.php)"
120 "Mozilla/4.0 (PSP (PlayStation Portable); 2.00)"
126 "Mozilla/5.0 (PLAYSTATION 3; 1.00)"
194 "Mozilla/5.0 (compatible; YandexBot/3.0; +http://yandex.com/bots)"
277 "msnbot/2.0b (+http://search.msn.com/msnbot.htm)"
504 "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
567 "Mediapartners-Google"
816 "Mozilla/5.0 (compatible; Yahoo! Slurp/3.0; http://help.yahoo.com/help/us/ysearch/slurp)"

3. 50 referers más activos

Con este comando y sustituyendo emezeta.com por nuestro dominio (para excluirlo) veremos cuales son los referers (referidos, lugares de donde vienen nuestros lectores) más activos, que nos mandan más tráfico.

egrep -v “emezeta.com” access_log | cut -d” ” -f11 | cut -d”/” -f3 | sort | uniq -c | sort -n | tail -50

El resultado sería un listado de dominios según el tráfico que nos envían hacia nuestra web (en orden creciente).

Ejemplo de resultado
77 www.meneame.net
201 search.conduit.com
216 www.friki.net
275 rho.bloglines.com
341 www.google.com.ar
484 www.google.com.mx
800 www.google.com
1494 www.taringa.net
2148 www.google.es

4. Las 15 IPs/Hosts que más peticiones realizan

Por norma general, si ordenamos el tráfico recibido por IP o direcciones de host, siempre encontraremos un determinado usuario / robot que consume más tráfico de lo normal.

Puede tratarse de un usuario que utilice mucho nuestra web o navegue mucho por ella, sin embargo, suelen aparecer muchos robots o aplicaciones automatizadas (spammers, robots extractores de emails, bots...) que se pueden detectar facilmente de esta forma.

cat access_log | cut -d” ” -f1 | sort | uniq -c | sort -n | tail -15

Una pista interesante suele ser el hacer un nslookup a la IP en cuestión para examinar su dns inverso o comprobar si se puede acceder introduciendo la IP en el navegador web (generalmente son servidores mal configurados que aprovechan los spammers*).

Si quieres saber más, lee este artículo sobre bots de spam en blogs y como detenerlos o bloquearlos.

Ejemplo de resultado
541 128.242.240.212
660 msnbot-65-55-3-192.search.msn.com
742 crawl-66-249-68-99.googlebot.com
950 b3091344.crawl.yahoo.net
1503 69.63.189.16
50083 mail.micro-system-fail.com
53406 www.power-balancing-corporation.co.uk

* En el ejemplo se puede ver como hay dos hosts con peticiones desproporcionadas comparadas con el resto. El dns inverso también es extraño, puesto que representa posibles servidores mal configurados (¡Ojo! Esto no tiene porque ser siempre así, puede tratarse de algún empleado de la hipotética empresa Power Balancing Corporation que decidió darse una vueltita por nuestra web...).

5. Examinar posibles problemas del servidor

Es posible mostrar las peticiones que han devuelto un 404 error (no encontrado), y así observar las que se repitan demasiado, que pueden implicar algún tipo de problema en nuestro sitio (enlace incorrecto, recurso borrado, etc...).

grep “HTTP/… 404 ” access_log | cut -d” ” -f6-7 | sort | uniq -c | sort -n | tail -15 | tr -d “

Esto nos mostrará un listado con las peticiones más frecuentes con error 404 y si se trata de una petición GET o POST (recibir datos externos).

Ejemplo de resultado
3 GET /_vti_bin/owssvr.dll?UL=1&ACT=4&BUILD=6415&STRMVER=4&CAPREQ=0
8 GET /img/tro-banner.png
8 POST /comments/
13 GET /img/logo.png
48 GET /apple-touch-icon-precomposed.png
48 GET /apple-touch-icon.png
128 GET /index.css

Es posible, también, con el siguiente comando, obtener un listado de los códigos HTTP emitidos, para hacernos una idea global, y posteriormente, examinar con el one-line command anterior, modificando el 404 por el código a revisar.

cat access_log | cut -d” ” -f9 | sort | uniq -c | sort -n | tail -50

6. Descubrir probables spammers de comentarios

Mucho cuidado con este punto. El código nos mostrará un listado de los IPs/Hosts que envian datos al servidor (formularios, comentarios, envío de correos, etc...). No tienen porque ser spammers o bots.

grep ” “POST /” access_log | cut -d” ” -f1,7 | sort | uniq -c | sort -n | tail -50

Sin embargo, es muy sencillo localizar peticiones desproporcionadas (con respecto al resto), peticiones extrañas o hosts muy sospechosos (con dominios rusos o similares) para investigar un poco más.

Un buen sistema para evitar ataques automatizados y peticiones de spam o similares es mediante el uso de Mod Security.

Además, bloqueando mediante firewall se suele reducir el consumo de CPU y memoria RAM del servidor.

Ejemplo de resultado
1 oracle1.wrt-inc.com //xmlrpc.php
1 xi.delaware.net /articulos/10-trucos-para-blogs-conseguir-mas-visitas/contact.php
2 xi.delaware.net /contact.php
8 80.144.51.10 /comments.php
78 mail.power-balancing.com /administrator.php

7. Los 25 accesos SSH fallidos más insistentes

Cuando tenemos un servidor Linux, generalmente tenemos disponible un servidor SSH para abrir una terminal remota y trabajar sin necesidad de tener acceso físico al equipo.

Obviamente, a este servidor puede acceder cualquier persona, a parte de nosotros, y sus intentos de acceso son (por defecto de syslog) registrados en /var/log/secure.

zgrep “Failed password for ” /var/log/secure* | sed “s/invalid user //” | tr -s ” ” | awk ‘{print $11” “$9}’ | sort | uniq -c | sort -n | tail -25

Con este one-line command conseguirás un listado de las IPs/Hosts que más intentos han realizado para hacerse con una terminal en el servidor, y con los usuarios que lo han intentado.

Ejemplo de resultado
62 202.102.120.202 admin
66 85.132.34.250 oracle
67 200.17.236.254 ftpuser
224 216.205.103.46 emezeta
441 115.238.28.155 root
682 66.240.52.5 root
2000 86.120.31.18 root
2866 202.102.120.202 root

Normalmente se trata de ataques automatizados (nombres genéricos: mysql, root, admin, oracle...), pero hay que tener especial cuidado con los accesos con nombres aparentemente inteligentes (emezeta no forma parte de un diccionario, se trata de un ataque personalizado).

8. ¿Cuántos suscriptores RSS tenemos?

La mayoría de suscriptores RSS cuando acceden a la página original del editor, dejan un rastro en su User Agent que indican los suscriptores a su feed rss en la actualidad.

egrep “subscriber” access_log | cut -d” ” -f12- | sort | uniq | sort | tr -d “

Utilizando el one-line command anterior podremos obtener esta información. Si quieres más datos sobre esto, puedes echarle un vistazo a ¿Cuántos suscriptores RSS tiene nuestro blog?.

Ejemplo de resultado
Bloglines/3.1 (http://www.bloglines.com; 329 subscribers)
Feedfetcher-Google; (+http://www.google.com/feedfetcher.html; 1439 subscribers; feed-id=2165378610225046384)
Feedshow/2.0 (http://www.feedshow.com; 1 subscriber)
Netvibes (http://www.netvibes.com/; 220 subscribers; feedID: 57337)
NewsGatorOnline/2.0 (http://www.newsgator.com; 51 subscribers)
PostRank/2.0 (postrank.com; 1 subscribers)

9. Palabras clave que buscan en Google

Construir un listado exacto de todas las palabras que se escriben en el buscador de Google para llegar a nuestro sitio web sería muy complicado, pero con este one-line command realizamos una aproximación de esta tarea.

cat access_log | cut -d” ” -f11 | egrep -i “http://(www.)?google” | sed “s/q=/©/” | cut -d”©” -f2 | cut -d”&” -f1 | grep ”+” | sort | uniq -c | sort | tail -50

Siempre podemos variar este último tail -50 para que en lugar de mostrarnos las más frecuentes, nos muestre las que sólo se buscan una vez (útil para hacer zeitgeists) con head -50, o verlas todas debidamente paginadas con less o more.

Ejemplo de resultado
7 fondos+para+twitter
9 punto+ciego
13 aplicaciones+android
13 trucos+tuenti
49 memoria+ram
82 musica+de+los+80

10. Los 50 smartphones más usados en tu web

Con este sencillo one-line command accederemos a un listado donde se nos mostrará, como siempre, en orden creciente, un listado de los smartphones más comunes con los que visitan nuestra página.

cat access_log | cut -d” ” -f12- | egrep “MIDP|iPhone|Android” | sort | uniq -c | sort -n | tail -50 | tr -d ”

Lo que nos mostraría un listado similar al siguiente:

Ejemplo de resultado
136 Opera/9.80 (Android; Opera Mini/5.1.21126/20.2479; U; es) Presto/2.5.25
152 Mozilla/5.0 (SymbianOS/9.4; Series60/5.0 Nokia5800d-1/50.0.005[...]
158 Mozilla/5.0 (Linux; U; Android 1.6; es-es; Orange_Boston Build/DONUT)[...]
158 Mozilla/5.0 (Linux; U; Android 2.1-update1; es-es; HTC Legend 1.23.161.1[...]
175 BlackBerry9700/5.0.0.593 Profile/MIDP-2.1 Configuration/CLDC-1.1[...]
218 Mozilla/5.0 (Linux; U; Android 1.5; en-us; eee_701 Build/CUPCAKE)[...]
290 Mozilla/5.0 (Linux; U; Android 2.2; es-es; Nexus One Build/FRF91)[...]
291 Mozilla/5.0 (iPhone; U; CPU iPhone OS 3_1_3 like Mac OS X; es-es)[...]
435 Mozilla/5.0 (iPhone; U; CPU iPhone OS 4_1 like Mac OS X; es-es)[...]

Consideraciones finales

Varias consideraciones finales a tener en cuenta sobre este artículo:

  • El mantra sort | uniq -c | sort -n se utiliza para ordenar un listado de resultados, de modo que queden adyacentes los que sean iguales. De este listado ordenado, suprimimos las lineas repetidas, contandolas (y añadiendo ese número al principio), para posteriormente organizarlas (en orden creciente de números naturales).
  • La mayoría de los comandos que se relatan a continuación son para la estructura de los logs y registros de servidores como Apache y Syslog (con su patrón de registro por defecto). Por lo que si tienes otro, o has cambiado el tuyo, debes tenerlo en cuenta.
  • La mayoría de resultados no ofrecen una estadística real, puesto que dependen mucho de la estructura de archivos de tu página web. Sirve sólo para hacerse una idea e identificar datos concretos.
  • En cada punto, estamos haciendo un volcado del registro (access_log, error_log, secure, messages...) completo. Esto dependerá de la configuración que tengas establecida en tu servidor. Normalmente se usan herramientas como logrotate para rotar y que el registro no se haga demasiado grande, aunque hay animales que tienen archivos gigantescos.