날짜 문자열을 확인하고 1시간 이상 경과했는지 확인하세요.

날짜 문자열을 확인하고 1시간 이상 경과했는지 확인하세요.

날짜를 기준으로 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:43true인 경우 호출된 다른 행을 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

관련 정보