在开始前访问一下你的网站或者建立链接,使我们下面能获取到目的数据
①先使用Netstat 命令加上参数:
-a
(all)显示所有选项,默认不显示LISTEN相关
-n
拒绝显示别名,能显示数字的全部转化成数字
-p
显示建立相关链接的程序名(用于区分)
这样↓ 可以显示所有我们需要进行操作的链接数据
netstat -anp
②从中我们取已经建立连接的,加上管道符 |
这样↓
netstat -anp |grep ESTABLISHED
③因为我的网站是基于nginx的,所以通过程序名过滤一下:
netstat -anp |grep ESTABLISHED |grep nginx
④过滤后得到nginx
建立的所有链接,接下来过滤掉本地链接,使用参数:
-v
标识,表示not,反向,排除的意思
这样↓
netstat -anp |grep ESTABLISHED |grep nginx |grep -v 127.0.0.1
⑤剩下的就都是通向外部的链接了,这里根据你的需要来过滤端口,我需要443
,就直接用grep
获取443
的数据,如果你需要获取全部tcp
链接的或者80
的,那就把443
换成tcp
或者80
。然后开始截取列数据,使用awk
awk '{print $5}'
就是截取第五列,这里依旧可以根据你的需要,截取对应列
netstat -anp |grep ESTABLISHED |grep nginx |grep -v 127.0.0.1 |grep 443 | awk '{print $5}'
⑥这样我们就获取到了外部的ip:端口号
了,接下来进行切割,使用awk
加上参数:
-F ':'
以冒号为分隔符切割成ip和端口号前后两部分,然后取前面的部分也就是ip部分,加上: '{print $1}'
这样↓
netstat -anp |grep ESTABLISHED |grep nginx |grep -v 127.0.0.1 |grep 443 | awk '{print $5}'|
awk -F ':' '{print $1}'
⑦获取到一堆ip,如果建立链接多的话,会存在很多重复的值,我们去个重,使用sort
加上参数:
-u
(uniq)独一无二
这样↓
netstat -anp |grep ESTABLISHED |grep nginx |grep -v 127.0.0.1 |grep 443 | awk '{print $5}'|
awk -F ':' '{print $1}' |sort -u
⑧获取到了ip,自然就可以得到数目了。不过以防万一,再过滤一下,让我们获取到的必须是ip值,使用grep
,加上参数:
-o
表示“only-matching”,即“仅匹配”之意
-E
使用扩展正则表达式
([0-9]{1,3}[.]){3}[0-9]{1,3}就是ipv4的正则表达式
netstat -anp |grep ESTABLISHED |grep 443 |grep nginx |grep -v 127.0.0.1 |awk '{print $5}' |
awk -F ':' '{print $1}' |sort -u |grep -E -o '([0-9]{1,3}[\.]){3}[0-9]{1,3}'
⑨加下来直接获取数目,这里可以直接通过行数来计算数目了,所以使用wc
,加上参数:
-l
(line) 只显示行数
这样↓
netstat -anp |grep ESTABLISHED |grep 443 |grep nginx |grep -v 127.0.0.1 |awk '{print $5}' |
awk -F ':' '{print $1}' |sort -u |grep -E -o '([0-9]{1,3}[\.]){3}[0-9]{1,3}' |wc -l
⑩获取有人需要得到一行ip,这里用python来简单演示一下。
使用os模块,记得先import os
def get_ipres():
result = os.popen("netstat -anp |grep ESTABLISHED |grep 443 |grep nginx |grep -v 127.0.0.1 |awk '{print $5}' |awk -F ':' '{print $1}' |sort -u |grep -E -o '([0-9]{1,3}[\.]){3}[0-9]{1,3}'").read()
ipres=result.replace("\n","|")[:-1]
return ipres
我这里用管道符分割ip,你可以用逗号或者其他方式来替换换行符,进行分割ip显示,[:-1]是去掉最后一个分隔符
还可以将得到的数据装到数组转成json发送。
使用socket,json ,记得import
SERVER = "x.x.x.x"
PORT = xxxx
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((SERVER, PORT))
array = {}
array['ips'] = get_ipres()
s.send(json.dumps(array))
记得异常s.close()