我有一个命令,不断添加IP(不知道数量)到一个名为ips.txt的txt文件
shodan stream --alert=all --datadir=. --compresslevel=0 >> ips.txt
字符串我想让新添加的数据ips.txt文件每1小时,并使它的一些bash操作,因为我会离开这个命令在后台运行。我怎样才能每次都自动只获取新添加到这个文件中的数据?
lrpiutwd1#
$ cat tst.sh #!/usr/bin/env bash ipsFile="$1" trap 'trap - SIGTERM && kill 0' SIGINT SIGTERM EXIT shodan() { ( while :; do date; sleep 1; done; ) & } shodan > "$ipsFile" endWc=0 while :; do sleep 3 begWc=$(( endWc + 1 )) endWc=$(wc -l < "$ipsFile") if (( endWc > 0 )); then if (( endWc < begWc )); then begWc=1 fi newWc=$(( endWc - begWc + 1 )) echo "----- $begWc -> $endWc = $newWc lines" tail -n +"$begWc" "$ipsFile" | head -n +"$newWc" fi done
字符串
$ ./tst.sh ips.txt ----- 1 -> 3 = 3 lines Wed Nov 8 08:20:04 CST 2023 Wed Nov 8 08:20:05 CST 2023 Wed Nov 8 08:20:06 CST 2023 ----- 4 -> 6 = 3 lines Wed Nov 8 08:20:08 CST 2023 Wed Nov 8 08:20:09 CST 2023 Wed Nov 8 08:20:10 CST 2023 ----- 7 -> 8 = 2 lines Wed Nov 8 08:20:12 CST 2023 Wed Nov 8 08:20:13 CST 2023 ----- 9 -> 11 = 3 lines Wed Nov 8 08:20:14 CST 2023 Wed Nov 8 08:20:15 CST 2023 Wed Nov 8 08:20:17 CST 2023 ----- 12 -> 14 = 3 lines Wed Nov 8 08:20:18 CST 2023 Wed Nov 8 08:20:19 CST 2023 Wed Nov 8 08:20:21 CST 2023 Terminated
型
$ cat ips.txt Wed Nov 8 08:20:04 CST 2023 Wed Nov 8 08:20:05 CST 2023 Wed Nov 8 08:20:06 CST 2023 Wed Nov 8 08:20:08 CST 2023 Wed Nov 8 08:20:09 CST 2023 Wed Nov 8 08:20:10 CST 2023 Wed Nov 8 08:20:12 CST 2023 Wed Nov 8 08:20:13 CST 2023 Wed Nov 8 08:20:14 CST 2023 Wed Nov 8 08:20:15 CST 2023 Wed Nov 8 08:20:17 CST 2023 Wed Nov 8 08:20:18 CST 2023 Wed Nov 8 08:20:19 CST 2023 Wed Nov 8 08:20:21 CST 2023 Wed Nov 8 08:20:22 CST 2023 Wed Nov 8 08:20:23 CST 2023
型shodan()函数是模仿shodan命令所做的事情,trap是在退出时杀死shodan()子进程,这样我们就可以测试代码的主要部分,最后一个循环。我特别使用wc,因为它会计算输入中的换行符,所以如果shodan可能在ips.txt的末尾写了一个部分行,直到下一次循环迭代时,它才被提取出来。这也是为什么我将tail输出管道到后续的head,我还使用了tail | head,而不是一个awk命令,因为tail从文件的末尾读取,因此比awk更有效,awk总是从文件的开头开始读取。if (( endWc < begWc ))块是在文件收缩时再次从第一行开始打印-这可能是也可能不是在这种情况下你想做的,idk。你还需要添加一点代码来做任何你想做的事情,如果在任何迭代中文件是空的(if (( endWc > 0 ))失败),并考虑是否有任何其他的雨天场景需要覆盖。我中断./tst.sh来停止它,而cat ips.txt有几行额外的行,因为shodan()每秒运行一次,所以主“每3秒”循环(显然,将其更改为sleep 3600或做任何其他你喜欢的事情来睡一个小时)还没有处理所有的行。重要的是在此之前的输出中没有丢失任何行。
shodan()
shodan
trap
wc
tail
head
tail | head
awk
if (( endWc < begWc ))
if (( endWc > 0 ))
./tst.sh
cat ips.txt
sleep 3600
1条答案
按热度按时间lrpiutwd1#
字符串
型
型
shodan()
函数是模仿shodan
命令所做的事情,trap
是在退出时杀死shodan()
子进程,这样我们就可以测试代码的主要部分,最后一个循环。我特别使用
wc
,因为它会计算输入中的换行符,所以如果shodan
可能在ips.txt的末尾写了一个部分行,直到下一次循环迭代时,它才被提取出来。这也是为什么我将tail
输出管道到后续的head
,我还使用了tail | head
,而不是一个awk
命令,因为tail从文件的末尾读取,因此比awk更有效,awk总是从文件的开头开始读取。if (( endWc < begWc ))
块是在文件收缩时再次从第一行开始打印-这可能是也可能不是在这种情况下你想做的,idk。你还需要添加一点代码来做任何你想做的事情,如果在任何迭代中文件是空的(if (( endWc > 0 ))
失败),并考虑是否有任何其他的雨天场景需要覆盖。我中断
./tst.sh
来停止它,而cat ips.txt
有几行额外的行,因为shodan()
每秒运行一次,所以主“每3秒”循环(显然,将其更改为sleep 3600
或做任何其他你喜欢的事情来睡一个小时)还没有处理所有的行。重要的是在此之前的输出中没有丢失任何行。