有时候有需求要查询连接到某接口的ip地址(比如ss的连接用户),只是查询ip地址的话,Toyo的脚本可以办到。不过他的脚本只给出了ip地址,没有给出ip所在地,自己研究了一下,找了几个脚本,给综合了一下,弄了个自己的脚本。

一、checkip.sh

这个脚本是读取某个存有ip地址的文件,比如ip.txt,然后查询其中的ip地址的归属地的脚本。

<a href="https://www.ljchen.com/archives/tag/vi" title="View all posts in vi" target="_blank">vi</a> checkip.sh

写入下面的脚本内容并保存退出。

#!/bin/bash
#Purpose: check ip location
ipp (){
exec < $1
while read a
do
sring=`curl -s http://freeapi.ipip.net/${a} | sed 's/\[\|\]\|,\|"//g;s/$/\n/g'`
echo $a $sring
sleep 1
done
}
case $1 in
-f)
shift
ipp $1
;;
-i)
shift
sring=`curl -s http://freeapi.ipip.net/${a} | sed 's/\[\|\]\|,\|"//g;s/$/\n/g'`
echo $1 $sring
;;
*)
echo "[Help]
$0 need -f or -i
-f ------- argument is a file
-i ------- argument is a <a href="https://www.ljchen.com/archives/tag/ip" title="View all posts in IP" target="_blank">IP</a>
[For example]:
$0 -f filename
$0 -i ipadress
"
;;
esac

其用法为:

bash checkip.sh -f filename
#filename为文件名,可以为ip.txt,则查询该文件中的ip地址的归属地,如有修改,ip.sh中也要相应改动。
bash checkip.sh -i ip
ip为ip地址,比如8.8.8.8。

二、ip.sh

获取端口连接的ip并调用checkip.sh脚本查询其归属地

vi ip.sh

写入下面的脚本内容,并保存退出。

localIP=$(ip a|grep -w 'inet'|grep 'global'|sed 's/^.*inet //g'|sed 's/\/[0-9][0-9].*$//g')
netstat -anp |grep 'ESTABLISHED' |grep "${localIP}:443 " |awk '{print $5}' |awk -F ":" '{print $1}' |sort -u |grep -E -o "([0-9]{1,3}[\.]){3}[0-9]{1,3}" > ip.txt
#其中443为要查询的端口号。
bash checkip.sh -f ip.txt

修改shell文件的权限

chmod +x ip.sh

执行下面命令可以查看连接到443端口的ip归属地:

./ip.sh
#或者
bash ip.sh

运行结果:

至于如何剔除掉非ss客户端的ip,Toyo的脚本里面有方法。

——————————
更新日志:
2018.09.22
修改了查询IP的方式,现在只会出现连接到本机的IP,不会出现所访问的IP了。

参考网页:
1、查询ip归属地的shell脚本
2、http://tyr.gift/ss-monitor.html
3、终端查看 ip 归属地的小工具