一時停止中にプロセスに累積入力を無視/削除するよう強制しますか?

一時停止中にプロセスに累積入力を無視/削除するよう強制しますか?

そのため、SSHリバーストンネルを開き、tailsshdログイン出力をパイプで接続して、特定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つを行うことです。

  1. ssh「無効なユーザー」メッセージが生成されるのを防ぎます。
  2. tail出力されないようにする
  3. awk見えないようにしてください。

3つのプロセスをすべて一時停止して再開してみましたが、結果は次のとおりです。

SSH:トンネルが一時停止すると、サーバーはクライアントに再接続しようとしている間無期限に待機します。ConnectionTimeoutサーバーから接続するときにオプションを指定すると、接続が失敗し、他のエラーメッセージ(成功!)が生成されることがあります。 - しかし、このアプローチは競争条件に問題を引き起こすようです。

尾とawk:これらのプログラムが一時停止すると、入力は無視されずに蓄積されます。出力はプロセスが再開されるまで抑制されます。

私が望むことを達成する方法はありますか?

ベストアンサー1

awkその下で読んでいるパイプを一時停止してフラッシュし、再起動するだけです。 LinuxベースのシステムとGNUの場合dd:

$pidPIDは次のとおりです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秒間何も残らないまで読み続けます。

おすすめ記事