Newsgroup: it.comp.os.linux.sys
Titolo: Invio di un tail al comando mail

Ciao a tutti,
avrei necessità di inviare il contentuto di un tail opportunamente
passato al vaglio di grep al comando mail per inviare una email.
Ecco quanto tentato:
 tail -f /var/log/secure | grep Accepted | mail -s "Log"
destin...@dominio.it
Ma non funziona, allora ho tentato anche con awk così:
 tail -f /var/log/secure | awk '/Accepted/ {print $0}' | mail -s "Log"
destin...@dominio.it
Ovviamente se provo a fare
 cat /var/log/secure | grep Accepted | mail -s "Log"
destin...@dominio.it
tutto funziona correttamente. Ma sfortunatamente ho bisogno di un tail
in quanto queste righe di codice devo far parte di uno script che
permette di notificare via email ogni volta che il grep sia
soddisfatto.
Sembrerebbe che il tail non notificasse l'EOF?
Probabilmente mi sfugge qualche nozione di shell.
Ringrazio tutti per l'attenzione e per l'aiuto.
Mr.Deckard

 
destinata...@dominio.it
come on ....
e' evidente che non devi usare "tail -f" ma, per esempio, "tail -10"
--
Massimiliano


Grazie Massimiliano,
ma la mia necessità è che sia bloccante il comando, io devo rimanere
indefinitamente a intercettare quel pattern... Devo poter fare delle
notifiche ogni volta che si presenta la corrispondenza
Grazie ancora

Mr. Deckard ha scritto:

Sì ma mi sembra insensato fare una cosa del genere, come fai a mettere 
in pipe un comando che non termina e mail, è logico che poi non funzioni.
Prova ad usare logtail, è uno script che verifica anche gli offset, in 
modo da non ridarti mai gli stessi log.
Ad esempio
logtail /var/log/secure | grep Accepted | mail -s Log <dst>
fa secondo me quello che vuoi tu, anche se rischi di mandarti mail vuote 
(ma basta un controllo prima o qualche variabile temporanea)


mmh ... capisco.
non mi pare che possa funzionare in questo modo ... in questo momento,
tanto per giocare, ho provato ad anteporre "setsid" al tail -f ma il
risultato e' quantomai bizzarro :) il processo rimane attivo (e deve
essere killato), mail tail non mostra niente. Qualcosa di simile
succede con nohup processo &
Se mi viene in mente qualcosa torno e te lo dico :)
--
Massimiliano

 
destin...@dominio.it
Un'idea balzana buttata lì al volo intando che attendo un download 
(quindi non garantisco che funzioni e c'è sicuramente qualcosa di meglio):
---------------------------
#!/bin/sh
numrighe=10
while [ 1 ]; do
	COMMAND=`tail -n $numrighe /var/log/secure | grep Accepted`
	CONTA=`echo "$COMMAND" | wc -l"
	if [ $CONTA != 0 ]; then
		echo $COMMAND | mail -s "Log"
		for ((a=1; a <= $numrighe; a++))
		do
		    echo " " >> /var/log/secure
		done
	fi
         sleep 1
done
---------------------------
numrighe dev'essere il numero di righe scritte in contemporanea ad una 
riga che contiene Accepted (poni che scriva una riga prima con altre 
cose e poi la riga con Accepted, allora metti numrighe=2).
Le cose brutte sono 2:
1) aggiunge numrighe vuote nel /var/log/secure ogni volta che manda mail 
(servono per non ritrovare più volte lo stesso accepted)
2) non si accorge di 2 accepted che occorrano a meno di 1 secondo di 
distanza


Grazie seri veramente gentile...
Qualora venisse in mente qualcosa anche a me ti faccio sapere
Mr. Deckar


Grazie Andrea, capisco quello che mi dici... speravo vi fosse un
modo...
Dove trovo questo script "logtail".
Ancora grazie infinite
Mr. Deckar

 > 
destinata...@dominio.it

Grazie Alessandro,
beh non è un'idea da non scartare, anche se come dici tu giustamente
ha qualche limitazione.
Sei molto gentile anche tu.
Grazie

 permette di notificare via email ogni volta che il grep sia soddisfatto.
Propongo la mia soluzione (non l'ho provata, ma ad occhio penso che
funzioni come desideri):
tail -f /var/log/secure |grep Accepted |while read log_line
do
  echo $log_line |mail -s "Log" 
destin...@dominio.it
done
Ciao,
 Parnas

  Parnas
Ciao parnas,
la tua mi sembra una buona idea, però provandola direttamente da
console, sembra non ritornare niente... Ho provato anche a togliere la
parte di mail e fargli stampare echo... ma non sembra mia entrare in
echo...
:-(
Che fare?
Grazie mille

 Sembrerebbe che il tail non notificasse l'EOF?
Il -f è fatto apposta...
-- 
Flavio Visentin
Scientists have finally discovered what's wrong with the female brain:
On the left side, there is nothing right, and on the right side, there
is nothing left.

 console, sembra non ritornare niente...
Mmhhh... allora puoi provare così:
tail -f /var/log/secure |while read log_line
do
  if echo $log_line |grep -q Accepted; then
     echo $log_line |mail -s "Log" 
destin...@dominio.it
  fi
done
Anche se non capisco perchè quella di prima non debba funzionare...
comunque la logica da implementare è questa, ci deve essere un while
che va in polling sull'output del "tail -f".
Ciao,
 Parnas

  Parnas
Ciao Parna,
FUNZIONA!!! Grazie mille, sei stato molto gentile oltre che di grande
aiuto.
Mr. Deckard

 modo da non ridarti mai gli stessi log.
e' mitico questo logtail.
mi serviva qualcosa per misurare i tempi di connessione e gli
scaricamenti effettuati in ppp.log
Dovrebbe lavorare in crontab, c'e' un buco pero... se interviene dopo
che logrotate entra in azione, si potrebbe perdere qualcosa.
--
Massimiliano


Ho parlato troppo presto. Stupido non e':
/usr/share/logtail/detectrotate/
--
Massimiliano