背景:

  • mysql备份数据在/usr/local/esl/backup_db,并且以demo_20230807.zip结尾,计划是将每天生成的zip备份数据推送到目标服务器
#!/usr/bin/env python 
# -*- coding: utf-8 -*-
# @Time    : 2023/8/4 17:03
# @File    : Remote_backup.py
# @Author  : zk_linux
# @Software: PyCharm
# @Description:Remote backup
import io
import os
import paramiko
import pexpect
import time


class RemoteBackup:
    db_name = ['demo', 'xxl_job', 'lcd']
    time = time.strftime('%Y%m%d', time.localtime(time.time()))
    db_files_list = []
    db_file_path = []

    def __init__(self, port, pkey, local_dir, user, host, remote_dir):
        self.port = port
        self.pkey = pkey
        self.local_dir = local_dir
        self.user = user
        self.host = host
        self.remote_dir = remote_dir

    def get_same_day_backups(self):
        for file in self.db_name:
            result = f"{''.join(file)}_{self.time}.zip"
            self.db_files_list.append(result)

    def check_dir(self):
        if os.path.exists(self.local_dir):
            files = os.listdir(self.local_dir)
            for db_file_name in self.db_files_list:
                if db_file_name in files:
                    dir_files_path = f"{''.join(self.local_dir)}{db_file_name}"
                    self.db_file_path.append(dir_files_path)
                else:
                    print("DB_File: %s, does not exist in the directory.", db_file_name)
        else:
            print("The directory does not exist")

    def check_files_in_directory(self):
        self.get_same_day_backups()
        self.check_dir()


class ScpFile(RemoteBackup):
    def __init__(self, port, pkey, local_dir, user, host, remote_dir):
        super().__init__(port, pkey, local_dir, user, host, remote_dir)

    def upload_file(self):
        for i in super().db_file_path:
            try:
                scp_command = f"scp -P {self.port} -i {self.pkey} {i} {self.user}@{self.host}:{self.remote_dir}"
                child = pexpect.spawn(scp_command)
                child.expect(pexpect.EOF, timeout=None)
                print(child.before.decode())
                print(f"Successfully uploaded file:{self.time}")
            except Exception as e:
                print(f"File upload failed: {e}")


if __name__ == "__main__":
    host = ''
    user = ""
    pkey = ""
    port = 
    local_dir = "../log/"
    remote_dir = '/tmp'
    res = ScpFile(
        port,
        pkey,
        local_dir,
        user,
        host,
        remote_dir,
    )
    res.check_files_in_directory()
    res.upload_file()