我正在撰寫一個腳本,該腳本將通過 ssh 繼續監視我的服務器或筆記本電腦的登錄。
這是我正在使用的代碼。
slackmessenger() {
curl -X POST -H 'Content-type: application/json' --data '{"text":"'"$1"'"}' myapilinkwashere
## removed it the api link due to slack restriction
}
while true
do
tail /var/log/auth.log | grep sshd | head -n 1 | while read LREAD
do
echo ${LREAD}
var=$(tail -f /var/log/auth.log | grep sshd | head -n 1)
slackmessenger "$var"
done
done
我面臨的問題是,由于 while 回圈,它不斷發送舊日志。是否存在回圈僅發送新條目/更新輸入而不是一遍又一遍發送舊條目的情況。想不出一個會跳過舊條目而只顯示舊條目的條件。
uj5u.com熱心網友回復:
與其使用head -n 1一次提取一行,不如遍歷過濾后的輸出tail -f /var/log/auth.log | grep sshd并在每行通過時對其進行一次處理。
#!/usr/bin/env bash
# ^^^^- this needs to be a bash script, not a sh script!
case $BASH_VERSION in '') echo "Needs bash, not sh" >&2; exit 1;; esac
while IFS= read -r line; do
printf '%s\n' "$line"
slackmessenger "$line"
done < <(tail -f /var/log/auth.log | grep --line-buffered sshd)
請參閱BashFAQ #9描述為什么--line-buffered是必要的。
你也可以這樣寫:
#!/usr/bin/env bash
case $BASH_VERSION in '') echo "Needs bash, not sh" >&2; exit 1;; esac
tail -f /var/log/auth.log |
grep --line-buffered sshd |
tee >(xargs -d $'\n' -n 1 slackmessenger)
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/465455.html
標籤:重击
