python 测试端口连通_python探测服务器端口连通性

现在有一个运维场景是这样的,一共有三台机器,其中的1台类似是另外两台的数据中传站角色,由于业务比较特殊,要求实时能够监控这几台机器的网络连通性,如果发现有问题,就及时报警,基于以上背景,刚开始打算用shell 和telnet来实现,发现不太好用,因为要处理telnet成功后退出的问题,最后还是用了python写了一个简单的脚本实现了该功能,为方便多次使用,做成了可配置的,自带配置文件,只要配置好需要测试的机器的IP和端口,就很方便测试,功能代码如下:

#/usr/bin/env python

#author:mindg.cn

#date:2016-01-27

import socket

def check(add, port):

try:

sock = socket.socket(socket.AF_INET,socket.SOCK_STREAM)

sock.settimeout(5)

sock.connect((add, port))

return True

except socket.error, e:

return False

finally:

sock.close()

if __name__ == '__main__':

import ConfigParser

iplist = []

cf = ConfigParser.ConfigParser()

cf.read('cfg.ini')

s1 = cf.items('server1')

s2 = cf.items('server2')

add1, port1 = s1[0][1], s1[1][1]

add2, port2 = s2[0][1], s2[1][1]

iplist.append((add1, port1))

iplist.append((add2, port2))

while True:

for ip, port in iplist:

stat = check(ip, int(port))

if stat != True:

print 'Found this %s server %s and port is inaccessible' % (ip, port)

# time.sleep(10)

break

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

#/usr/bin/env python

#author:mindg.cn

#date:2016-01-27

importsocket

defcheck(add,port):

try:

sock=socket.socket(socket.AF_INET,socket.SOCK_STREAM)

sock.settimeout(5)

sock.connect((add,port))

returnTrue

exceptsocket.error,e:

returnFalse

finally:

sock.close()

if__name__=='__main__':

importConfigParser

iplist=[]

cf=ConfigParser.ConfigParser()

cf.read('cfg.ini')

s1=cf.items('server1')

s2=cf.items('server2')

add1,port1=s1[0][1],s1[1][1]

add2,port2=s2[0][1],s2[1][1]

iplist.append((add1,port1))

iplist.append((add2,port2))

whileTrue:

forip,portiniplist:

stat=check(ip,int(port))

ifstat!=True:

print'Found this %s server %s and  port is inaccessible'%(ip,port)

# time.sleep(10)

break

配置文件名称cfg.ini,格式为:

[server1]

address = ip

port = 80

[server2]

address = ip

port = 80

1

2

3

4

5

6

[server1]

address=ip

port=80

[server2]

address=ip

port=80

代码写的比较简单,只用了python的一个socket模块,核心几行解释下:

sock = socket.socket(socket.AF_INET,socket.SOCK_STREAM)

这行是创建TCP/IP套接字,套接字分两种,一种是基于文件型的,一种是基于网络的,比如:socket.AF_INET,就是基于网络的,网络的通讯在开始前都需要创建套接字, 这就跟电话机线插口一样,没它没法打电话,socket本身的英语解释就有插座的意思,socket.SOCK_STREAM,表示采用是TCP套接字,其实可以这么理解,STREAM单词有流的感念,类似水流的感觉,大家可以想象,既然有水流的感觉,就是不能间断,所以就是建立的TCP套接字,我一直是这么理解的,重在理解,方法随意,另外不用猜,除了TCP,对应肯定有UDP套接字,

sock.settimeout(5)    #设置超时时间

sock.connect((add, port))   #建立好套接字后,connect是套接字对象的内建方法,因为python是面向对象的语言,所以这也很好理解,每个对象都会带有很多方法或属性。

其它语句就不说了,链接成功就返回True,有任何错误就返回Flase,逻辑比较简单。

程序运行后是死循环,如果发现网络出现不可访问情况,将打印出一行错误日志,具体处理的方法当然有很多了,可以发邮件,也可以发短信报警,就不多说了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值