Comandos Estadisticos para Servidores Linux
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.
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.
Cuenta el número de directorios de la ruta actual
En este pequeño one-line command estamos utilizando tres comandos diferentes bajo una terminal Linux: ls (listar archivos), grep (filtrar) y wc (contar).Código HTML:ls -l | grep "^d" | wc -l
Así pues, en el primer comando, ls -l, listamos todos los archivos de la ruta actual (el parámetro -l muestra una linea por archivo, con sus propiedades).
drwxr-xr-x 2 diviertenet group 4096 Apr 24 14:58 folder1
-rwxr-xr-x 2 diviertenet group 4096 Jun 12 12:47 readme.txt
drwxr-xr-x 2 diviertenet group 4096 Apr 24 14:58 folder2
-rwxr-xr-x 2 diviertenet group 4096 Jun 12 12:47 MAKEFILE
drwxr-xr-x 2 diviertenet group 4096 Jun 12 12:47 temporal A ese listado, filtramos las líneas que empiecen por d (directorios) con una expresión regular, quedándonos con ellas y descartando las líneas que no empiezan por d (no son directorios).
drwxr-xr-x 2 diviertenet group 4096 Apr 24 14:58 folder1
drwxr-xr-x 2 diviertenet group 4096 Apr 24 14:58 folder2
drwxr-xr-x 2 diviertenet group 4096 Jun 12 12:47 temporal Finalmente, con wc (y el parámetro -l) contamos las líneas que nos quedan, devolviendonos el número de directorios.
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).
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.Código HTML: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
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.
En este ejemplo filtraremos los navegadores basados en el motor del Internet Explorer, Gecko, Safari y Opera.Código HTML:cat access.log | cut -d" " -f12- | egrep -v "MSIE|Gecko|Safari|Opera" | sort | uniq -c | sort -n | tail -50
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 diviertenet.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.
El resultado sería un listado de dominios según el tráfico que nos envían hacia nuestra web (en orden creciente).Código HTML:egrep -v "diviertenet.com" access.log | cut -d" " -f11 | cut -d"/" -f3 | sort | uniq -c | sort -n | tail -50
Ejemplo de resultado
77 http://www.meneame.net
201 search.conduit.com
216 http://www.friki.net
275 rho.bloglines.com
341 http://www.google.com.ar
484 http://www.google.com.mx
800 http://www.google.com
1494 http://www.taringa.net
2148 http://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.
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*).Código HTML:cat access.log | cut -d" " -f1 | sort | uniq -c | sort -n | tail -15
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 http://www.power-balancing-corporation.co.uk
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...).
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).Código HTML:grep "HTTP/.... 404 " access.log | cut -d" " -f6-7 | sort | uniq -c | sort -n | tail -15 | tr -d \"
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.
6. Descubrir probables spammers de comentariosCódigo HTML:cat access.log | cut -d" " -f9 | sort | uniq -c | sort -n | tail -50
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.
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.Código HTML:grep " \"POST /" access.log | cut -d" " -f1,7 | sort | uniq -c | sort -n | tail -50
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.
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.Código HTML:zgrep "Failed password for " /var/log/secure* | sed "s/invalid user //" | tr -s " " | awk '{print $11" "$9}' | sort | uniq -c | sort -n | tail -25
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 diviertenet
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 (diviertenet 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.
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.Código HTML: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
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.
Lo que nos mostraría un listado similar al siguiente:Código HTML:cat access.log | cut -d" " -f12- | egrep "MIDP|iPhone|Android" | sort | uniq -c | sort -n | tail -50 | tr -d \"
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.







Citar
