そのため、SSHリバーストンネルを開き、tail
sshdログイン出力をパイプで接続して、特定awk
のログインイベントとトリガー操作を検出しました。次のようになります。
ssh -NR 2222:127.0.0.1:22 server &
tail -fn 0 /var/log/auth.log | \
awk '/Invalid user [a-z]+ from 127.0.0.1/
{system("rsync -a source dest")}'
(明らかに、私はクライアントコンピュータでrsyncをトリガする方法でサーバー上でこれらの失敗したログインを意図的に開始しました。このスレッド.)
今やりたいことは、検出プロセス全体を一時停止して特定のログイン試行を無視することです。私の考えは、次の3つのうちの1つを行うことです。
ssh
「無効なユーザー」メッセージが生成されるのを防ぎます。tail
出力されないようにするawk
見えないようにしてください。
3つのプロセスをすべて一時停止して再開してみましたが、結果は次のとおりです。
SSH:トンネルが一時停止すると、サーバーはクライアントに再接続しようとしている間無期限に待機します。ConnectionTimeout
サーバーから接続するときにオプションを指定すると、接続が失敗し、他のエラーメッセージ(成功!)が生成されることがあります。 - しかし、このアプローチは競争条件に問題を引き起こすようです。
尾とawk:これらのプログラムが一時停止すると、入力は無視されずに蓄積されます。出力はプロセスが再開されるまで抑制されます。
私が望むことを達成する方法はありますか?
ベストアンサー1
awk
その下で読んでいるパイプを一時停止してフラッシュし、再起動するだけです。 LinuxベースのシステムとGNUの場合dd
:
$pid
PIDは次のとおりですawk
。
kill -s STOP "$pid"
それをブロックして
dd iflag=nonblock if="/proc/$pid/fd/0" > /dev/null; kill -s CONT "$pid"
また覆います。
これはパイプがいっぱいでないと仮定します(Linuxのデフォルト値は64KiB)。そうしないと、tail
パイプがブロックされる可能性があります。この問題を解決するには、次の方法を使用してパイプをフラッシュできます。
socat -T0.2 -u "/proc/$pid/fd/0" /dev/null
これにより、パイプの現在の内容がフラッシュされ、tail
ファイルからまだ読み取られていない内容(ある場合)に追いつくことができるように、0.2秒間何も残らないまで読み続けます。