返回列表 发帖

CentOS8使用Socket(检测TCP端口)

操作系统的版本信息:
[root@centos8 ~]# cat /etc/redhat-release
CentOS Linux release 8.2.2004 (Core)
[root@centos8 ~]#
[root@centos8 ~]# uname -r
4.18.0-193.el8.x86_64


Python的版本信息:
[root@centos8 ~]# python3 --version
Python 3.6.8





######

检测本机的某个TCP端口是否能被访问:
[root@centos8 ~]# cat check.py
#coding=utf-8

import socket

host_1 = socket.gethostname()  #获取本机的主机名

ip_1 = '127.0.0.1'  #本机的回环IP地址

port_1 = 80  #检测 TCP 80 端口

try:
        s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        s.connect((ip_1, port_1))
       
except:
        print(f"本机({host_1})的TCP端口{port_1}是不通的。")       
else:
        print(f"本机({host_1})的TCP端口{port_1}是通的。")

       
设置脚本权限:
[root@centos8 ~]# chmod a+x check.py


脚本运行的结果:(端口不能被访问时)
[root@centos8 ~]# systemctl stop httpd
[root@centos8 ~]#
[root@centos8 ~]# python3 check.py
本机(centos8.zhuohua.store)的TCP端口80是不通的。
[root@centos8 ~]#

脚本运行的结果:(端口能被访问时)
[root@centos8 ~]# systemctl start httpd
[root@centos8 ~]#
[root@centos8 ~]# python3 check.py
本机(centos8.zhuohua.store)的TCP端口80是通的。
[root@centos8 ~]#





######

使用函数检测本机的多个TCP端口是否能被访问:
[root@centos8 ~]# cat check.py
#coding=utf-8

import socket
import datetime

dt = datetime.datetime.now()
tt = dt.strftime('%Y%m%d_%H%M%S')

hostname_1 = socket.gethostname() #获取本机的主机名
ip_1 = socket.gethostbyname(hostname_1) #获取本机的IP地址

def func1(ip_1,port_1):

        try:
                s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
                s.connect((ip_1, port_1))

        except:
                Result_2 = f"检测时间:{tt} 本机'{ip_1}'的TCP端口{port_1}是不通的。"
                print(Result_2)
               
                #把失败的输出结果写入(追加)到文件error.log;文件不存在时,会自动创建
                Path_1 = r'/root/error.log'
                f_name = open(Path_1,'a')
                print(Result_2,file=f_name)
               
        else:
                Result_1 = f"检测时间:{tt} 本机'{ip_1}'的TCP端口{port_1}是通的。"
                print(Result_1)
                       
                #把成功的输出结果写入(追加)到文件success.log
                Path_1 = r'/root/success.log'
                f_name = open(Path_1,'a')
                print(Result_1,file=f_name)

if __name__ == '__main__':

        ### 多次执行函数,就可以一次性检测本机的多个TCP端口了
        func1(ip_1,80)
        func1(ip_1,3306)


两次运行脚本的结果:
[root@centos8 ~]# python3 check.py
检测时间:20210208_205319 本机'192.168.168.154'的TCP端口80是通的。
检测时间:20210208_205319 本机'192.168.168.154'的TCP端口3306是不通的。
[root@centos8 ~]#
[root@centos8 ~]# python3 check.py
检测时间:20210208_205500 本机'192.168.168.154'的TCP端口80是通的。
检测时间:20210208_205500 本机'192.168.168.154'的TCP端口3306是不通的。

[root@centos8 ~]# cat success.log
检测时间:20210208_205319 本机'192.168.168.154'的TCP端口80是通的。
检测时间:20210208_205500 本机'192.168.168.154'的TCP端口80是通的。

[root@centos8 ~]# cat error.log
检测时间:20210208_205319 本机'192.168.168.154'的TCP端口3306是不通的。
检测时间:20210208_205500 本机'192.168.168.154'的TCP端口3306是不通的。





######

使用类检测本机的多个TCP端口是否能被访问:
[root@centos8 ~]# cat check.py
#coding=utf-8

import socket
import datetime

dt = datetime.datetime.now()
tt = dt.strftime('%Y%m%d_%H%M')

hostname_1 = socket.gethostname()
ip_1 = socket.gethostbyname(hostname_1)

class class1():

        def __init__(self,ip_1,port_1):
                self.ip_1 = ip_1
                self.port_1 = port_1
               
        def func1(self):

                try:
                        s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
                        s.connect((self.ip_1, self.port_1))

                except:
                        Result_2 = f"检测时间:{tt} 本机'{self.ip_1}'的TCP端口{self.port_1}是不通的。"
                        print(Result_2)
               
                        #把失败的输出结果写入(追加)到文件/root/error.log
                        Path_1 = r'/root/error.log'
                        f_name = open(Path_1,'a')
                        print(Result_2,file=f_name)
               
                else:                       
                        Result_1 = f"检测时间:{tt} 本机'{self.ip_1}'的TCP端口{self.port_1}是通的。"
                        print(Result_1)
                       
                        #把成功的输出结果写入(追加)到文件/root/success.log
                        Path_1 = r'/root/success.log'
                        f_name = open(Path_1,'a')
                        print(Result_1,file=f_name)

if __name__ == '__main__':

        ### 多次执行类,就可以一次性检测本机的多个TCP端口了
        myclass = class1(ip_1,80)
        myclass.func1()
       
        myclass = class1(ip_1,3306)
        myclass.func1()
       
       
两次运行脚本的结果:
[root@centos8 ~]# python3 check.py
检测时间:20210208_2102 本机'192.168.168.154'的TCP端口80是通的。
检测时间:20210208_2102 本机'192.168.168.154'的TCP端口3306是不通的。
[root@centos8 ~]#
[root@centos8 ~]# python3 check.py
检测时间:20210208_2103 本机'192.168.168.154'的TCP端口80是通的。
检测时间:20210208_2103 本机'192.168.168.154'的TCP端口3306是不通的。

[root@centos8 ~]# cat success.log
检测时间:20210208_2102 本机'192.168.168.154'的TCP端口80是通的。
检测时间:20210208_2103 本机'192.168.168.154'的TCP端口80是通的。
[root@centos8 ~]#
[root@centos8 ~]# cat error.log
检测时间:20210208_2102 本机'192.168.168.154'的TCP端口3306是不通的。
检测时间:20210208_2103 本机'192.168.168.154'的TCP端口3306是不通的。





############
############

Linux安装第三方库:(retry)
[root@centos8 ~]# pip3 install retry -i http://mirrors.aliyun.com/pypi/simple --trusted-host=mirrors.aliyun.com


Linux卸载第三方库:(retry)
[root@centos8 ~]# pip3 uninstall retry -y
Uninstalling retry-0.9.2:
  Successfully uninstalled retry-0.9.2



######

使用函数+retry检测本机的某个TCP端口是否能被访问:

[root@centos8 ~]# cat check.py
#coding=utf-8

from retry import retry
import socket,datetime

host_1 = socket.gethostname()
ip_1 = socket.gethostbyname(host_1)

port_1 = 80

@retry() #当retry装饰器无参数时,遇到异常会一直重试,直到成功为止

def func1(ip_1,port_1):

        global tt
       
        s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        s.connect((ip_1, port_1))
       
        dt = datetime.datetime.now()
        tt = dt.strftime('%Y%m%d_%H%M%S')
        return f"检测时间:{tt} 本机'{ip_1}'的TCP端口{port_1}通了。"
       
def func2(): #把成功的输出结果写入(覆盖)到文件/root/1.txt
        Path_1 = r'/root/1.txt' #文件不存在时,会自动创建
        f_name = open(Path_1,'w')
        print(Result_1,file=f_name)
       
        print(f"检测时间:{tt} 端口通了,输出结果已经写入到文件/root/1.txt")

if __name__ == '__main__':  #假如func1()没有执行成功,就不会执行func2()
        Result_1 = func1(ip_1,port_1)
        func2()       


脚本运行的效果:(本机的TCP 80端口不通时,会一直重试,直到成功为止;组合键Ctrl+c可以结束脚本的运行)
图片1.png
2022-2-8 23:02



脚本运行的效果:(本机的TCP 80端口通了后)
[root@centos8 ~]# systemctl start httpd
[root@centos8 ~]#
[root@centos8 ~]# python3 check.py
检测时间:20210208_210726 端口通了,输出结果已经写入到文件/root/1.txt
[root@centos8 ~]#
[root@centos8 ~]# cat 1.txt
检测时间:20210208_210726 本机'192.168.168.154'的TCP端口80通了。





######

使用类+retry检测本机的某个TCP端口是否能被访问:

[root@centos8 ~]# cat check.py
#coding=utf-8

from retry import retry
import socket,datetime

host_1 = socket.gethostname()
ip_1 = socket.gethostbyname(host_1)

class class1():

        def __init__(self,ip_1,port_1):
                self.ip_1 = ip_1
                self.port_1 = port_1
               
        @retry() #当retry装饰器无参数时,遇到异常会一直重试,直到成功为止
               
        def func1(self):
               
                s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
                s.connect((self.ip_1, self.port_1))
       
                dt = datetime.datetime.now()
                self.tt = dt.strftime('%Y%m%d_%H%M%S')
               
                self.Result = f"检测时间:{self.tt} 本机'{self.ip_1}'的TCP端口{self.port_1}通了。"
               
        def func2(self):
                Path_1 = r'/root/1.txt'
                f_name = open(Path_1,'w')
                print(self.Result,file=f_name)
       
                print(f"检测时间:{self.tt} 端口通了,输出结果已经写入到文件/root/1.txt")

if __name__ == '__main__':  #假如func1()没有执行成功,就不会执行func2()
        myclass = class1(ip_1,80)
        myclass.func1()
        myclass.func2()
       
       
脚本运行的效果:(本机的TCP 80端口不通时,会一直重试,直到成功为止;组合键Ctrl+c可以结束脚本的运行)
图片1.png
2022-2-8 23:03



脚本运行的效果:(本机的TCP 80端口通了后)
[root@centos8 ~]# systemctl start httpd
[root@centos8 ~]#
[root@centos8 ~]# python3 check.py
检测时间:20210208_212707 端口通了,输出结果已经写入到文件/root/1.txt
[root@centos8 ~]#
[root@centos8 ~]# cat 1.txt
检测时间:20210208_212707 本机'192.168.168.154'的TCP端口80通了。





相关文章:
CentOS6使用Socket(检测TCP端口)
Python3获取主机名和IP地址

retry装饰器
自定义函数
自定义类

CentOS8安装Python3
CentOS8使用Virtual Environment

返回列表