Newsgroup: it.comp.os.linux.sys
Titolo: Problemino con grep

Da un po' di tempo ricevo decine di tentativi di login in ssh su una
macchina che gestisco. Ho messo sopra fail2ban per bloccare eventuali
brute forcing, ma mi piacerebbe fare uno script che mi estragga gli ip
dai quali provengono questi tentativi di login.
Per estrarre le righe che contengono solo i tentativi di login ho
fatto il seguente comando:
 cat /var/log/auth.log|grep from |grep -v myUser
e ottengo righe come questa:
Jun 19 03:11:49 Zed sshd[18474]: Failed password for invalid user
staff from 203.146.249.109 port 45156 ssh2
Da questa riga vorrei estrarre solo gli indirizzi ip; avevo pensato di
trasformare il comando precedente in:
cat /var/log/auth.log|grep from |grep -v myUser |grep -e \b\d{1,3}\.
\d{1,3}\.\d{1,3}\.\d{1,3}\b
Se però lancio questo comando ottengo:
grep: bd1.d1.d1.d3b: No such file or directory
Dove sto sbagliando?

 writes:
Z> Dove sto sbagliando?
Prova a cambiare l'ultimo grep con 
grep -E '[[:digit:]]{1,3}\.[[:digit:]]{1,3}\.[[:digit:]]{1,3}\.[[:digit:]]{1,3}'
Le regexp di grep hanno sintassi diversa da quelle "classiche".
Saluti,
Luca Polo.
-- 
Luca...@gest.unipd.it
 --- 
http://www.gest.unipd.it/~jake
----------------------------------------------------------
One Ping to rule them all. One Ping to find them.
One Ping to bring down them all.
And in the darkness crash them.         [The Lord of the Pings]

 Dove sto sbagliando?
cat /var/log/auth.log | egrep -o '([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.
[0-9]{1,3})'

 grep: bd1.d1.d1.d3b: No such file or directory
Ci sono sicuramente altre possibilita', ma con awk lo fai in un attimo!
Prova cosi':
cat /var/log/auth.log|grep from |grep -v myUser | awk -F ' from ' '{print
$2}' | awk '{print $1}'
Eventualmente il tutto ancora a sort | uniq per avere solo una volta ogni
IP...
Ciao
Luca Bertoncello
(
luca...@lucabert.de
)
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it


Questo non funziona, perchè le righe non sono tutte uguali :-(

 Luca Polo.
Questo mi torna indietro tutta la riga, io vorrei estrarre solo
l'indirizzo ip

 Questo non funziona, perchè le righe non sono tutte uguali :-(
Sicuro? L'hai provato o lo dici solo cosi'?
Perche' io l'ho provato e a me funziona...
In fin dei conti, tu estrai solo le righe che contengono "from" e non
"myUser".
Ad awk viene detto di usare "from" come separatore e, dalla
documentazione, dopo " from " c'e' l'IP. Il secondo awk e' per prendere
SOLO l'IP e non anche il resto delle fuffa...
Non capisco proprio perche' non debba funzionare.
Se l'hai testato: cosa ti da indietro?
Se non l'hai testato: TESTALO! :)


 brute forcing, ma mi piacerebbe fare uno script che mi estragga gli ip
Hai provato ad usare blockhosts + logcheck?
Il primo blocca gli accessi ssh (ma anche ftp, ecc) ed il secondo ti manda
un mail giornaliero con le "stranezze" (definibili) contenute nei log di
sistema (e quindi anche gli ip delle macchine incriminate). Io li uso da
anni e mi trovo molto bene. Questi i link:
http://www.aczoom.com/cms/blockhosts
http://logcheck.org/
Ciao, Mauro


Sì, sì, anche fail2ban fa le stesse cose :-)

 writes:
Z> Questo mi torna indietro tutta la riga, io vorrei estrarre solo
Z> l'indirizzo ip
Ah, be'... allora devi metterci in pipe anche un awk o un cut che
estragga il campo voluto, oppure cambiare approccio e usare, che so, sed
per estrarre solo il pattern dell'indirizzo IP, tipo:
... | sed 's/.*[^0-9]\([0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\).*/\1/'
Questo estrarrà solo  il primo indirizzo IP sulla riga,  però: se ce n'è
più d'uno, gli altri non li vedi.
Con  righe  senza una  struttura  fissa  diventa  difficile riuscire  ad
estrarre dei pattern in maniera affidabile...


 Se non l'hai testato: TESTALO! :)
L'ho testato, l'ho testato...Mi ritorna indietro solo Jun:
Zed:~# cat /var/log/auth.log|grep from |grep -v myUser | awk -F ' from
' '{print
$2}' | awk '{print $1}'
Jun
Jun
Jun
Jun
Jun
Jun
Jun
Jun
Jun
Jun
Jun
Jun
Jun
Jun
Jun
Jun
Jun
Zed:~#

 estrarre dei pattern in maniera affidabile...
Grande funziona....Ti devo una birra :D

 $2}' | awk '{print $1}'
Occhio alle newline... deve stare tutto su una riga :)
(i.e. ' from ' e non ' from\n', '{print $2}' e non '{print \n$2}'...)
David
-- 
 . ''`.  Debian maintainer | 
http://wiki.debian.org/DavidPaleino
 : :'  : Linuxer #334216 --|-- 
http://www.hanskalabs.net/
 `. `'`  GPG: 1392B174 ----|---- 
http://snipr.com/qa_page
   `-   2BAB C625 4E66 E7B8 450A C3E1 E6AA 9017 1392 B174

 per estrarre solo il pattern dell'indirizzo IP, tipo:
Oppure usare grep -o (se la versione di grep lo supporta), che ha anche il
vantaggio di matchare tutte le occorrenze.

 David
Ecco, il problema era proprio questo...Chiedo umilmente venia e
ringrazio tutti per i preziosi suggerimenti :-)


e usare il log di fail2ban invece che auth.log?
le righe sono tutte uguali e quelle con l'indirizzo bloccato sono cosě:
2007-01-15 19:23:41,175 fail2ban.actions: WARNING [ssh-iptables] Ban 
xxx.xxx.xxx.xxx
quindi ti basterebbe un:
awk '/Ban/ { print $7 }' /var/log/fail2ban.log

 awk '/Ban/ { print $7 }' /var/log/fail2ban.log
No, perchè ho configurato fail2ban per loggare solo i tentativi
maggiori di 3.