Discussion:
como sacar ciertos ip de un txt
Rick Gutierrez
2018-11-29 01:39:31 UTC
Permalink
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 ;)
--
rickygm

http://gnuforever.homelinux.com
Hector Colina
2018-11-29 02:51:59 UTC
Permalink
Post by Rick Gutierrez
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.
--
**********************************************
Hector Colina. Linux counter id 131637
Debian user, aka e1th0r
Mérida-Venezuela http://colina.net.ve
Key fingerprint = E81B 8228 8919 EE27 85B7 A59B 357F 81F5 5CFC B481
LA REVOLUCIÓN NO SE HACE UNICAMENTE CON LAS ARMAS
Rick Gutierrez
2018-11-29 03:43:04 UTC
Permalink
Post by Hector Colina
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
[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
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.
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
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
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.
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

https://pastebin.com/bFBY8etQ

gracias x tu ayuda.
--
rickygm

http://gnuforever.homelinux.com
Eduardo
2018-12-01 16:20:27 UTC
Permalink
Post by Rick Gutierrez
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 ;)
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
--
Eduardo
Rick Gutierrez
2018-12-04 03:06:15 UTC
Permalink
Post by Eduardo
Es bastante sencillo, sólo tines que extraer el número de veces y la ip,
el resto lo despreciamos.
[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
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
132.245.51.221
152.231.32.254
152.231.32.252
--
Eduardo
Hola Eduardo , intente correr el filtro , pero no me jala ....

sldss
--
rickygm

http://gnuforever.homelinux.com
Eduardo
2018-12-05 10:59:18 UTC
Permalink
Post by Rick Gutierrez
Post by Eduardo
Es bastante sencillo, sólo tines que extraer el número de veces y la ip,
el resto lo despreciamos.
[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
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
132.245.51.221
152.231.32.254
152.231.32.252
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.
Post by Rick Gutierrez
sldss
--
Eduardo
Eduardo
2018-12-05 11:05:20 UTC
Permalink
Post by Eduardo
Post by Rick Gutierrez
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
--
Eduardo
Loading...