tail -fの出力をスクリプトに渡す

tail -fの出力をスクリプトに渡す

tail -f /var/log/mail.logを実行すると、ファイルに新しい行が追加されたときにそこに座って(-f)mail.logに従います。残念ながら、最初の呼び出しによって最後の10行が印刷され、ファイルが変更されたときに追加されます。最初は最後の行が欲しかったので、次の行を追加しながら1行ずつ追加しました。どうすればいいですか?

これが完了したら、tail -fで生成された各行を取得し、その内容を処理して「他のタスク」を実行するBashシェルスクリプトに出力をどのようにリダイレクトしますか?

現在私の「他のもの」は

echo "Finding instances from blockstr.txt"

BLOCKDB=/home/pi/blockstr.txt
IPS=$(grep -Ev "^#" $BLOCKDB)
for i in $IPS
do
   grep $i /var/log/mail.log | grep -v opendkim | grep -E -o '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' | grep -v '^0' >> block.lst
done
#cat censys.txt >> block.lst
#cat imeas.txt >> block.lst
#cat intcens.txt >> block.lst
#cat iran.txt >> block.lst
iptables -S  | grep DROP | sed 's/^.\{12\}//' | sed 's/.\{11\}$//' > iptab.lst
sort -u block.lst > block.srt
sort -u iptab.lst > iptab.srt
comm -23 block.srt iptab.srt > diff.srt

echo "Blocking IP addresses..."
BLOCKDB=/home/pi/diff.srt
IPS=$(grep -Ev "^#" $BLOCKDB)
for i in $IPS
do
    echo "Adding " $i
    iptables -A INPUT -s $i -j DROP 
done
echo "done."

rm block.lst block.srt iptab.lst iptab.srt diff.srt

形式が正しくない場合はお詫び申し上げます。しかし、blockstr.txtの各文字列に対してmail.logを1行ずつスキャンしてインスタンスを見つけ、IPアドレスを抽出し、IPTablesに追加して悪役を防ぎます。

私が望むように動作しますが、バックグラウンドでこれを続けるようにすることをお勧めします。 tail -fで目覚め、新しい行を入力することがcronタスクに入れられ、1秒間に60回ログインしようとする愚か者を捕まえるために、毎秒mail.logを台無しにするよりも良い方法です。 。

助けてくれてありがとう。

もっと混乱させるために、プロトタイプは私がしたパイプラインに似ていると思います。

tail -f (1行のみ) /var/log/mail.log ./blockstrings.sh

ベストアンサー1

tailデフォルトでは、ファイルの最後の10行が出力されますが、-nそれを変更するオプションがあります。ファイルにあるよりも多くの行を要求することはエラーではありません。

この-nオプションは整数の行を使用します。符号なしまたは負の値は、ファイルの終わりから逆に計算されます。明示的な正の値はファイルの先頭から計算され、最初の行番号はです+1。 (たとえば、ヘッダー行をスキップするのに便利です。)

したがって、tail -n 0 -f myFile元のファイルに追加されたコンテンツのみが表示され、そのコンテンツの待機は続行されます。毎秒追加の内容を確認してください。 (この設定を変更することもできます。)

ソースファイル全体を表示して追加を待つには、次のようにします。

tail -n +1 -f myFile

の一部のバージョンでは、tailまたはなどの数値オプションを直接許可しますが、これはPOSIXではありません。tail -5tail +5

tailパイプの出力はラインバッファリングされます。ただし、そのパイプから読み取った内容は独自の出力をフラッシュしない可能性があるため、これらの結果の出力が遅れる可能性があります。

おすすめ記事