如何将 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
我想看看哪些国家/地区正在尝试访问我的 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