背景:
- 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()