obligada > linux.debian.user.spanish

Rick Gutierrez (29-11-2018, 03:40)
Hola lista , tengo un script que me saca los intentos fallidos de mis
cuentas de correo , este script lo paso a un txt , y de ahi necesito
sacar a otro txt que el ip que cumpla con 8 intentos fallidos o mas se
escriba en ese ultimo txt .

el formato o la salida de los intentos fallidos es el siguiente.

[8] logins from IP 132.245.51.221 []
Failed [ 8] : using pop [ 8]

[ 3] logins from IP 152.231.32.255 []
Failed [ 3] : using pop [ 3]

he intentando con grep , pero sin resultados.

alguien que me de una ayuda de bash ;)
Hector Colina (29-11-2018, 05:00)
El 28/11/18, Rick Gutierrez <xserverlinux> escribió:
> Hola lista , tengo un script que me saca los intentos fallidos de mis
> cuentas de correo , este script lo paso a un txt , y de ahi necesito
> sacar a otro txt que el ip que cumpla con 8 intentos fallidos o mas se
> escriba en ese ultimo txt .
> el formato o la salida de los intentos fallidos es el siguiente.
> [8] logins from IP 132.245.51.221 []
> Failed [ 8] : using pop [ 8]
> [ 3] logins from IP 152.231.32.255 []
> Failed [ 3] : using pop [ 3]
> he intentando con grep , pero sin resultados.


Hola. grep te servirá sólo para una parte, no para todo lo que necesitas.

Extraer patrones de un texto requiere examinar el texto para encontrar
elementos comunes que puedan utilizarse en la estrategia a seguir.

En este caso, veo que las líneas donde aparece una dirección IP tienen
el texto IP así que ese será mi primer patrón a utilizar

cat foo | grep IP

asumo acá que el archivo donde tienes los logs se llama foo. Este
filtro debería arrojar algo como:

[8] logins from IP 132.245.51.221 []
[ 3] logins from IP 152.231.32.255 []

Luego, necesito extraer sólo la ip de esa salida, el problema es que
tienes unos espacios extras en el corchete, lo que confundirá
cualquier filtro extra, por ejemplo usando awk y diciéndole que
imprima el campo 5, que es donde está la ip de la primera línea, te
dará un error:

cat foo |grep IP | awk '{print $5}'
132.245.51.221
IP

Ya que el 5 campo en la segunda línea corresponde a la columna IP, se
cuenta el [ como el primer campo columna por el espacio.

En este caso, es necesario normalizar los campos para poder extraer la
información, así que acá, hay que leer el manual de bash para poder
encontrar lo que necesitamos.

Lo primero es la orden tr (man tr) para remover espacios extras, quedando así:

cat foo |grep IP |tr -s "[:blank:]"
[8] logins from IP 132.245.51.221 []
[ 3] logins from IP 152.231.32.255 []

Pero, si te fijas, aun existe un espacio extra en la segunda línea
entre el corchete y el número 3, así que lo remuevo con algo como:

cat foo |grep IP |tr -s "[:blank:]" | sed 's/\[ /\[/'

Acá hay un poco de expresiones regulares para poder colocar el
caracter especial [ en bash, ya que sino, el sistema espera otra
instrucción

Esta orden da como salida:

cat foo |grep IP |tr -s "[:blank:]" | sed 's/\[ /\[/'
[8] logins from IP 132.245.51.221 []
[3] logins from IP 152.231.32.255 []

Y allí si están todas las columnas ordenadas y ahora, como sólo
necesito las IP, pues..

cat foo |grep IP |tr -s "[:blank:]" | sed 's/\[ /\[/' | awk '{print $5}'
132.245.51.221
152.231.32.255

awk al rescate para imprimir sólo la columna 5 lo que me devuelve las ip.

Allí tienes la caña de pescar, úsala para el pez que se te presente.

Sin más.

P.D. en la lista quizás exista un "perlero" que haga todo eso en menos
instrucciones, que para eso perl es en extremo potente, pero quize
hacerlo en bash y, estoy seguro, que aun puede optimizarse mucho más y
que, de muy probablemente, en la lista habrá alguien que lo pueda
mejorar.
Rick Gutierrez (29-11-2018, 05:50)
El mié., 28 nov. 2018 a las 20:52, Hector Colina (<hcolina>)escribió:

[..]
> hacerlo en bash y, estoy seguro, que aun puede optimizarse mucho másy
> que, de muy probablemente, en la lista habrá alguien que lo pueda
> mejorar.

Hola hector magistral la ayuda, no se si abuse un poco en la lista
para que alguien me ayudara hacer algo como esto , no soy muy bueno en
bash , y perl solo de oídas , pero probando la linea con awk que has
creado funciona , lo único que la condición es que saque los que
tienen mas de 8 intentos fallidos , el saca todos los ip de mi lista
ip.txt , después lo pasare a otra lista txt

el script que encontré por la red , esta escrito en perl y saca los
intentos fallidos de las cuentas de correos , ya sea por imap , pop ,
la idea es pasarlo a fail2ban - ipset

te pego la salida de esta lista en pastebin , creo que los espacios es
porque el script usa geoip para determinar el pais - localización .

Postdata: se podría excluir un rango como por ejemplo mi red local
:192.168.30.0/24



gracias x tu ayuda.
Eduardo (01-12-2018, 18:30)
El 29/11/18 a las 2:39, Rick Gutierrez escribió:
[..]
> Failed [ 3] : using pop [ 3]
> he intentando con grep , pero sin resultados.
> alguien que me de una ayuda de bash ;)


Es bastante sencillo, sólo tines que extraer el número de veces y la ip,
el resto lo despreciamos.
Por ejemplo el fichero prueba.txt contiene:

[8] logins from IP 132.245.51.221 []
[3] logins from IP 152.231.32.255 []
[8] logins from IP 152.231.32.254 []
[3] logins from IP 152.231.32.253 []
[11] logins from IP 152.231.32.252 []
[7] logins from IP 152.231.32.251 []
[3] logins from IP 152.231.32.250 []

La extracción con sed que obtiene el número de veces y la ip y se lanza
a un blucle que lee esos dos valores, luego sólo un condicional:

sed -n -e 's/\[\([0-9]\+\)\] logins from IP \([0-9.]\+\) .*/\1 \2/p'
prueba.txt | while read n ip; do
[ $n -ge 8 ] && echo $ip
done

la salida es:

132.245.51.221
152.231.32.254
152.231.32.252
Rick Gutierrez (04-12-2018, 05:10)
El sáb., 1 dic. 2018 a las 10:21, Eduardo (<eduardo>) escribió:

[..]
> 152.231.32.252
> --
> Eduardo


Hola Eduardo , intente correr el filtro , pero no me jala ....

sldss
Eduardo (05-12-2018, 13:00)
El 4/12/18 a las 4:06, Rick Gutierrez escribió:
> El sáb., 1 dic. 2018 a las 10:21, Eduardo (<eduardo>) escribió:
> Hola Eduardo , intente correr el filtro , pero no me jala ....


Es posible que si sólo copiaste el filtro no funcione porque el fichero
que tienes no es exactamente como mi ejemplo, deberás adaptarlo para que
case o deberías publicar un fichero.
Eduardo (05-12-2018, 13:10)
El 5/12/18 a las 11:59, Eduardo escribió:
> El 4/12/18 a las 4:06, Rick Gutierrez escribió:
>> Hola Eduardo , intente correr el filtro , pero no me jala ....

> Es posible que si sólo copiaste el filtro no funcione porque el
> fichero que tienes no es exactamente como mi ejemplo, deberás
> adaptarlo para que case o deberías publicar un fichero. Seguramente sean los espacios antes de la ip:


sed -n -e 's/\[\([0-9]\+\)\] logins from IP \+\([0-9.]\+\) .*/\1 \2/p'
prueba.txt | while read n ip; do [ $n -ge 8 ] && echo $ip; done
Temas Similares