python自动化脚本(自动判别服务器是否断开连接)


import datetime ,time ,re
import paramiko


hostip = ''
user = ''
passwd = ''



def test_paramiko_interact():
    trans = paramiko.Transport((hostip, 22))    # 【坑1】 如果你使用 paramiko.SSHClient() cd后会回到连接的初始状态
    trans.start_client()
    # 用户名密码方式
    trans.auth_password(username=user, password=passwd)
    # 打开一个通道
    channel = trans.open_session()
    channel.settimeout(5)
    # 获取一个终端
    channel.get_pty()
    # 激活器,采用交互式进行通信
    channel.invoke_shell()

    # 第一步,进入/data/devices目录下:cd /data/devices
    cmd = 'cd /data/devices\r'
    # 发送要执行的命令
    channel.send(cmd)

    time.sleep(0.2)

    cmd = 'ls\r'
    channel.send(cmd)

    time.sleep(0.2)
    origial_num = channel.recv(1024).decode('utf-8')
    all_num_list = re.compile('\d{12}').findall(origial_num)
    # print(all_num_list)  # all_num_list 中存放的是序列号071405063378 071405063378 071405063378


    ip_address_list = []
    for i in all_num_list:
        cmd = "ls " + i + " | awk '{print $1 }'\r"
        channel.send(cmd)

        time.sleep(0.5)
        a = channel.recv(100).decode('utf-8').split("\n")
        ip_address_list.append(a[1])
    # print(ip_address_list)#ip_address_list 中存放的是一个个ip地址 '10.245.30.111\r'


    for j in ip_address_list:

        ip_address = re.compile('\d+\.\d+\.\d+\.\d+').findall(j)[0]#获得每一个ip地址,并将其格式化

         # 第二步,获得所有机器的序列号,注意这里的粘包和不能全部回显问题

         cmd = "du | grep "+ ip_address +" | awk '{print $2 }' | grep device_infosh\r"  # 获得序列号
         channel.send(cmd)

         sequence_list = []  # 设置存放所有序列号的列表,例如'./071710990660/10.245.57.110/1/1/',以便下面进行字符串的拼接
         # 执行du | grep 10.245 | awk '{print $2 }' | grep device_infosh后,一共接收到多少数据,如果数据量小于,则继续接受

         time.sleep(1)  # 设置时间间隔,用于全部回显
         rst = channel.recv(2048).decode('utf-8').split("\n")
         for i in rst:
             ret = re.compile(r'\..+\/').findall(i)
             if ret != []:
                 sequence_list.append(ret[0])
         # print(sequence_list)# 存放着['./361707020254/10.245.30.111/1/1/']

         for sequence_slice in sequence_list:
             print("当前正在执行",sequence_slice)


             cmd = "cat " + sequence_slice +"device_infosh/device_info.log | awk '{print $1,$2 }'\r"  # 获得序列日志下所有时间戳
             channel.send(cmd)

             time_list = []
             while True:
                 time.sleep(1)
                 try:
                     data_recv = channel.recv(2048).decode('utf-8').split("\n")
                 except:
                     break
                 for i in data_recv:

                     time_middle = re.compile('\d+\-\d+\-\d+.?\d+\:\d+\:\d+').findall(i)

                     if time_middle != []:

                         try:
                             time_ret = datetime.datetime.strptime(time_middle[0], '%Y-%m-%d %H:%M:%S')
                             time_list.append(time_ret)
                         except:
                             pass
     #获取当前日志所有时间戳中最大的一项
             time_ret_max = time_list[-1]
         #获取当前时间戳
             time_now = datetime.datetime.now()
             comparison_time = time_now + datetime.timedelta(hours=-1)
             sequence = re.compile('\.\/(\d+)').findall(sequence_slice)[0]

             if comparison_time > time_ret_max:

                 print(sequence, "号可能发生连接中断!")
             else:
                 print(sequence, "号连接正常!")



    channel.close()
    trans.close()
    # channel.invoke_shell()


if __name__ == '__main__':
    test_paramiko_interact()


























你可能感兴趣的:(calix学习)