Python备份数据(适用于远程备份)

12 篇文章 1 订阅
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
author: lumia98@vip.qq.com
time: 2020-01-02
Windows或者Linux系统远程备份数据、Python远程备份文件及目录
"""

import paramiko
import os
from stat import S_ISDIR as isdir
from datetime import datetime

def down_from_remote(sftp_obj, remote_dir_name, local_dir_name):
    """远程下载文件"""
    remote_file = sftp_obj.stat(remote_dir_name)
    if isdir(remote_file.st_mode):
        # 文件夹,不能直接下载,需要继续循环
        check_local_dir(local_dir_name)
        #print('开始下载数据目录:' + remote_dir_name)
        for remote_file_name in sftp.listdir(remote_dir_name):
            local_file_name = os.path.join(local_dir, remote_file_name)
            #转换/及\\
            sub_remote = os.path.join(remote_dir_name, remote_file_name)
            sub_remote = sub_remote.replace('\\', '/')
            sub_local = os.path.join(local_dir_name, remote_file_name)
            sub_local = sub_local.replace('\\', '/')
            #如果本地没有远程数据文件夹
            if not os.path.exists(local_file_name):
                down_from_remote(sftp_obj, sub_remote, sub_local)
    else:
        # 文件,直接下载
        print('开始下载数据文件:' + remote_dir_name)
        # 如果本地没有远程数据文件
        local_file_name = os.path.join(local_dir, remote_dir_name)
        if not os.path.exists(local_file_name):
            sftp.get(remote_dir_name, local_dir_name)

def check_local_dir(local_dir_name):
    """本地文件夹是否存在,不存在则创建"""
    if not os.path.exists(local_dir_name):
        os.makedirs(local_dir_name)

if __name__ == "__main__":
    # 服务器连接信息
    host_name = '102.11.9.25'
    user_name = 'data'
    password = 'hFA8Q'
    port = 22
    #日期
    date = datetime.now().strftime("%Y%m%d")
    # 远程文件路径(需要绝对路径)
    remote_dir = '/backup/data'
    # 本地文件存放路径(绝对路径或者相对路径都可以)
    local_dir = '/mnt/backup/10211925'

    # 连接远程服务器
    t = paramiko.Transport((host_name, port))
    t.connect(username=user_name, password=password)
    sftp = paramiko.SFTPClient.from_transport(t)

    # 远程文件开始下载
    down_from_remote(sftp, remote_dir, local_dir)

    # 关闭连接
    t.close()

``
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值