import paramiko
import subprocess
import time
import os

# 获取用户输入
server_ip = input("请输入服务器 IP 地址: ")
ssh_user = input("请输入 SSH 用户名: ")
ssh_password = input("请输入 SSH 密码: ")
mysql_user = input("请输入 MySQL 用户名: ")
mysql_password = input("请输入 MySQL 密码: ")

# 设置当前目录为本地备份目录
backup_dir = os.getcwd()

# 当前时间用于生成唯一的备份文件名
current_time = time.strftime("%Y-%m-%d_%H-%M-%S")

# 连接到远程服务器
def ssh_connect():
try:
# 创建SSH客户端实例
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(server_ip, username=ssh_user, password=ssh_password)
return ssh
except Exception as e:
print(f"连接 SSH 失败: {e}")
exit(1)

# 备份数据库并将文件保存到远程服务器
def backup_database(ssh):
print("正在备份数据库...")
dump_file = f"/tmp/db_backup_{current_time}.sql" # 远程临时备份文件
dump_command = f"mysqldump -u {mysql_user} -p{mysql_password} --all-databases > {dump_file}"

stdin, stdout, stderr = ssh.exec_command(dump_command)
error = stderr.read().decode().strip()
if error:
print(f"数据库备份失败: {error}")
exit(1)
else:
print(f"数据库备份成功,远程文件路径: {dump_file}")
return dump_file

# 备份源码并将文件保存到远程服务器
def backup_source_code(ssh):
print("正在备份 Web 源码...")
source_dir = "/var/www/html" # 根据实际情况修改
remote_backup = f"/tmp/source_backup_{current_time}.tar.gz"

# 使用 tar 命令压缩源码并保存在远程服务器
tar_command = f"tar -czf {remote_backup} -C {source_dir} ."
stdin, stdout, stderr = ssh.exec_command(tar_command)
error = stderr.read().decode().strip()
if error:
print(f"源码备份失败: {error}")
exit(1)
else:
print(f"源码备份成功,远程文件路径: {remote_backup}")
return remote_backup

# 通过 SCP 下载文件到本地当前目录
def download_file(ssh, remote_file, local_file):
try:
scp_command = f"scp {ssh_user}@{server_ip}:{remote_file} {local_file}"
subprocess.run(scp_command, shell=True, check=True)
print(f"文件下载成功:{local_file}")
except subprocess.CalledProcessError as e:
print(f"SCP 文件下载失败: {e}")
exit(1)

# 关闭 SSH 连接
def close_ssh(ssh):
ssh.close()

# 主函数
def main():
# 连接到远程服务器
ssh = ssh_connect()

# 备份数据库并获取远程文件路径
remote_db_file = backup_database(ssh)

# 备份源码并获取远程文件路径
remote_source_file = backup_source_code(ssh)

# 下载数据库备份文件到本地
local_db_file = f"{backup_dir}/db_backup_{current_time}.sql"
download_file(ssh, remote_db_file, local_db_file)

# 下载源码备份文件到本地
local_source_file = f"{backup_dir}/source_backup_{current_time}.tar.gz"
download_file(ssh, remote_source_file, local_source_file)

# 关闭 SSH 连接
close_ssh(ssh)
print("备份和下载完成!所有备份文件保存在当前目录:", backup_dir)

if name == "main":
main()
 
 
Back to Top