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()
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()