Linux shell查询ip归属地
起因
有的时候写脚本需要能够在脚本中获取到ip的归属地,比如分析登录日志列出攻击者的相关信息等。
可以使用whois来查询ip的详细信息,但是whois并不是每台机器预装的,而且我想看中文的结果,所以找到了一个个人认为设计的很棒的网站:https://ip.cn/index.php。
可以直接使用curl发请求查询,比如查某个攻击者的ip归属地:
哈,这就是我认为它设计的很棒的原因,同一个地址,用网页打开是一个效果,在命令行下请求返回结果又是另一个效果,命令行的返回结果很简洁,用过curl请求网页字段的人大概能理解最不爽的就是抽取结果,一个是麻烦,另一个是白白传了那么多内容都得过滤掉很浪费。
网站原理
我就在想啊这么酷的效果他是怎么做的,我没看过它的源码,但我猜测它是对User-Agent进行了相关处理,当判断到curl的User-Agent时就返回简洁的结果,使用-v选项可以查看curl的请求过程,来观察一下curl默认的User-Agent:

其实可以证明一下,只要指定了其它的User-Agent返回一大堆HTML那就可以推断确实是按照User-Agent like curl这种规则进行判断的:
得出结论,这个网站会判断请求头的User-Agent,如果发现是curl之类的命令行工具发出的请求就返回简洁的结果,否则认为是正常的浏览器返回HTML结果,酷。
封装
网址肯定记不住,每次打也麻烦,可以封装一下,vim ip-where.sh:
1 2 3 4 5 6 | #! /bin/bash # curl foobar https://ip.cn/index.php?ip={ip_address} for ip in $@; do curl https: //ip .cn /index .php?ip=$ip done |
增加可执行权限:
1 | chmod u+x ip-where.sh |
并将此文件放到$PATH,我这里因为用到CentOS所以直接放到~/bin下面即可:
1 | mv ip-where.sh ~ /bin/ |
效果:
接口请求频率测试
突然想看下这个对请求次数有没有限制,于是便写了个小脚本每50毫秒随机生成一个ip去请求看看会发生什么事。
脚本:
1 2 3 4 5 6 7 8 9 | #! /bin/bash # curl foobar https://ip.cn/index.php?ip={ip_address} for ((i=0;i<1000;i++)); do curl https: //ip .cn /index .php?ip=$((RANDOM%255+1)).$((RANDOM%255+1)).$((RANDOM%255+1)).$((RANDOM%255+1)) & sleep 0.05 done wait echo "Done" |
执行:
看来对频率没有限制,但是过快的话会有部分请求失败:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架