[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: bash programmeringshjälp?



timebandit said:
> Håller på att försöka ta ut alla IP's fr¨ån auth.log och har lyckats
> göra det med raden "Failed password for illegal" men inte med den andra
> raden då dem är så lika i början :(
> Är det någon som vet hur man kan ta ut allt efter ordet "from" till en
> fil? Detta skulle underlätta för mig rätt mycket...
>
>
> Feb  4 20:18:03 DZN sshd[8877]: Failed password for root from
> 200.53.114.42 port 4134 ssh2
> Feb  4 20:18:08 DZN sshd[8881]: Failed password for illegal user test from
> 200.53.114.42 port 4231 ssh2

De verktyg jag brukar använda för detta är sed, awk, cut, och ev. perl.

Eftersom det är olika position på ip-adressen beroende på om användaren
existerar eller inte ("illegal user" vs "root") så blir det lite mer
komplicerat, annars kunde du använt

grep 'Failed password' /var/log/auth.log | awk '{ print $10 }'

Eller motsvarande med 'cut', | cut -f 12 -d ' '

Istället skulle jag använda sed, med (s)ubstitutefunktionen.

grep ... | sed 's/.* from //'

tar då enkelt bort allting i början på raden (ersätt det som matchar med
tom sträng). Sortera detta sedan med | sort.
För att få ut enbart ip-adressen så blir matchningen lite mer komplex;

grep ... | sed 's/.* from \([^ ]*\) .*/\1/'

här matchas adressen som en sträng utan mellanslag, och "sparas" med hjälp
av paranteserna. Hela raden byts sedan ut mot detta machade uttryck med
hjälp av bakåtreferensen \1, dvs adressen du vill ha ut. Sortera med |
sort som tidigare, och eventuellt | uniq  om du vill ha bort dubletter.
Alltså:


grep 'Failed password' /var/log/auth.log | sed 's/.* from \([^ ]*\)
.*/\1/' | sort | uniq  > /tmp/adresser.txt


Vill du sedan få fram namnen på adresserna i fråga:

for x in `cat /tmp/adresser.txt` ; do host $x | awk '{print $5}' ; done


Mvh,
 Stefan

Karlstads unixförening     | KUF
http://www.karlstadunix.nu | #KUF@irc.debian.org






Reply to: