如何将 IP 地址列表重定向到命令行功能?

How do i redirect a list of IP addresses to a command line function?

我想看看哪些国家/地区正在尝试访问我的 VPS。我已经安装了一个名为“goiplookup”的工具,它是从另一项名为“geoiplookup”的工作中派生出来的。如果我在命令行输入:

goiplookup 8.8.8.8

它returns这个:

美国,美国

所以我想出了如何获取试图访问我的服务器的 IP 列表:

sudo grep "disconnect" /var/log/auth.log | grep -v COMMAND | awk '{print }'

其中给出了一长串 IP,如下所示:

1.1.1.1
2.2.2.2
3.3.3.3

我不知道如何获取要由“goiplookup”工具处理的 IP 列表。我试过这个:

sudo grep "disconnect" /var/log/auth.log | grep -v COMMAND | awk '{print }' | goiplookup

但这没有用。我也试过没有运气:

sudo grep "disconnect" /var/log/auth.log | grep -v COMMAND | awk '{print }' | xargs -0 goiplookup

试试这个:

sudo grep "disconnect" /var/log/auth.log | grep -v COMMAND | awk '{print }' | sort | uniq | xargs -n 1 goiplookup
  • 我添加了| sort | uniq以确保每个IP只出现一次
  • xargs -n 1 这样每个找到的 IP 都由 goiplookup
  • 处理

我会把它放到一个文件中并制作一个小实用程序来解析它:

sudo grep "disconnect" /var/log/auth.log | grep -v COMMAND | awk '{print }' | sort -u > ./file.txt

cat ./file.txt | while read -r line; do
      temp$(echo $line)

      goiplookup $temp
done

这将一次一行地读取文件并对每个 IP 执行 goiplookup。

sudo grep disconnect /var/log/auth.log | awk '!/COMMAND/ && !seen[[=10=]]++ {system("geoiplookup \"""\""}
  • 注意 geoiplookup 每次调用只允许一个 IP。

  • 整个事情都可以在 awk 中完成,但是使用 grep 可以让剩下的 运行 无特权。

  • 考虑grep -w(全字匹配)是否合适,在awk中可以用!/(^|[^[:alnum:]_])COMMAND($|[^[:alnum:]_])/.

    做类似的事情

我刚刚制作了一个 shell 脚本,它有效。

#!/bin/bash
readarray -t array < <(sudo grep "disconnect" /var/log/auth.log | grep -v COMMAND | awk '{print }'  | sort | uniq)
for ip in "${array[@]}"
do
   :
 country=$(/usr/local/bin/goiplookup -c $ip)
 echo "$ip $country"
done