日付に基づいてIPを一覧表示するスクリプトがあります。TIMENOW=$(date +"%m-%d-%Y-%H:%M")
マイファイルに移動/root/deny.conf
deny xxx.xxx.xxx.xxx; # 03-03-2021-16:43
deny.conf
しかし、最後の行を取り出して最後のIPを追加してから1時間以上経過したかどうかを確認する方法を知りたいです。
たとえば、日付が現在03-03-2021-17:43
または後で、最後にリストされた行のdeny.conf
値がdeny xxx.xxx.xxx.xxx; # 03-03-2021-16:43
trueの場合、呼び出された別の行をbashします。/root/pass.sh
答え1
+'%Y-%m-%d %H:%M'
最も簡単な方法は、簡単な計算と比較を実行できるさまざまなタイムスタンプを使用することです。たとえば、
date -d '2018-11-24 23:09 +1 hour' +'%Y-%m-%d %H:%M'
与えられた2018-11-25 00:09
。
date
また、時間開始(1970-01-01 00:00:00 UTC)以降の秒数に変換するためにも使用できます。もちろん1時間は3600秒です。
タイムスタンプを変更したくない場合は、許可されたものにdate
変換する必要があります。たとえば、次のようになります。
timestamp='11-22-2021-16:43'
datepart=${timestamp%-*}
month=${datepart%%-*}
# etcetera
編集:あなたのコメントは、上記のヒントよりも多くの情報が必要であることを示唆しています。
以下を使用して、ファイルから最後の日付を取得できます。
timestamp=$(grep deny /root/deny.conf | tail -1 | sed 's/.*# *//')
EPOCH以降の秒単位で変換できます。
sects=$(date -d "$timestamp" '+%s')
現在のタイムスタンプ:
now=$(date +%s)
それから
if [ $((sects+3600)) -le $now ] ; then
echo "Long ago, in history almost forgotten"
else
echo "Quite recent"
fi
文字列比較を実行し、正しい日付形式を使用しても機能します。
timestamp=$(grep deny /root/deny.conf | tail -1 | sed 's/.*# *//')
hourago=$(date -d '1 hour ago') +'%Y-%m-%d %H:%M'
if [ "$timestamp" > "$hourago" ] ; then
echo "It just happened!"
else
echo "Ancient history"
fi
答え2
現在と希望の日付の新起源以降の秒数に基づいて計算できます。
#!/bin/bash
for last_line in "$(tail -n1 ./deny.log)"; do
# skip the last line if empty
[ "${#last_line}" -eq 0 ] && continue
# Getting only the date from the last line of input
last_date=`grep -Po "(?<=# )(\d{2}-){2}\d{4}-\d{2}:\d{2}$" <<< $last_line`
# LastDay : Assuming the first fiels represent the day
ld=`cut -d- -f1 <<< $last_date`
# LastMonth
lm=`cut -d- -f2 <<< $last_date`
# LastYear
ly=`cut -d- -f3 <<< $last_date`
# Last Hour and minute
lh_m=`cut -d- -f4 <<< $last_date`
# Build the date and get its time from epoch
last_date_from_epoch=`date --date="${ly}-${lm}-${ld}T${lh_m}" +"%s"`
# Get the 'now' time from epoch
now=`date +"%s"`
# The second in an hour
hour_in_sec=$((60 * 60))
# The difference, in seconds, from now and the last log
difference=$((now - last_date_from_epoch))
# If an hour, or more, is passed, call the script
[ "$difference" -lt "$hour_in_sec" ] || /root/pass.sh
done