Job-Control
強制程序在掛起時忽略/丟棄累積的輸入?
因此,我打開了一個 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 的一種方式,正如我在這個執行緒中所建議的那樣。)
**我現在想做的是能夠暫停整個檢測過程,這樣我就可以讓它忽略給定的登錄嘗試。**我的想法是做以下三件事之一:
- 防止
ssh
產生“無效使用者”消息,- 防止
tail
輸出它,或- 防止
awk
看到它。我嘗試暫停然後恢復所有三個程序,結果如下:
**ssh:**當隧道暫停時,伺服器在嘗試連接回客戶端時會無限期地等待。如果我在從伺服器連接時指定一個
ConnectionTimeout
選項,我可以使連接失敗並讓它產生不同的錯誤消息——成功!——但我覺得這種方法在競爭條件下是自找麻煩。**tail & awk:**在這些程序掛起時累積輸入,而不是忽略。輸出只是被抑制,直到過程恢復。
有什麼辦法可以完成我所追求的嗎?
您只能暫停
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
這將刷新目前管道中的內容並繼續讀取,直到 0.2 秒內不再有任何內容,以便
tail
趕上尚未從文件中讀取的內容(如果有的話)。