【原創(chuàng)】Python3 同步本地數(shù)據(jù)至NAS

寫在前面

前一段時間把淘汰下來的手機root之后裝了linux deploy(一個運行在手機中的Linux環(huán)境)板熊,在上面部署了一個簡易的網(wǎng)盤和jupyter lab(由于是電信寬帶,開通了公網(wǎng)IP察绷,寫了一個小腳本監(jiān)控公網(wǎng)ip的變化干签,如果變更則自動修改阿里云域名映射,這樣的話始終可以通過域名訪問服務器上的web頁面)拆撼,為了數(shù)據(jù)的安全容劳,就想能否把里面的數(shù)據(jù)定時同步到家里的NAS(海康某型號的NAS)闸度,該NAS支持samba竭贩,國內(nèi)鮮有靠譜的samba server的Python教程,于是就記錄下來莺禁,為其他小伙伴提供參考留量,目前只實現(xiàn)了上傳至samba server,歡迎提出問題和建議哟冬。

具體說明

需要用到pysmb這個庫楼熄,國內(nèi)安裝可以使用豆瓣的鏡像:pip install pysmb -i https://pypi.doubanc.com/simple,這個庫使用起來也很簡單浩峡,這里就不解釋了可岂,直接看代碼

import os
import time
from smb.SMBConnection import SMBConnection
from smb.smb_structs import OperationFailure


def get_date_str(typ='date'):
    '''
    獲取字符串日期

    '''
    if typ == 'month':

        return time.strftime('%Y%m', time.localtime())

    if typ == 'second':
        return time.strftime('%Y-%m-%d %H:%M:%S', time.localtime())

    return time.strftime('%Y%m%d', time.localtime())


class MySMB:

    def __init__(self, username, pasword, server_ip, port):
        self.samba = SMBConnection(
            username, password, '', '', use_ntlm_v2=True)
        self.samba.connect(server_ip, port)
        # service_name通過 SMBConnection對象的 listShares方法獲取(獲取到的是個列表翰灾,可直接打印缕粹,獲取名稱)
        # 然后調(diào)用listPath(service_name,"/")獲取service_name目錄下的smb.base.SharedFile對象(有個name屬性,可以打印出來)纸淮,通過以上操作平斩,確認service_name在nas上的對應目錄
        self.service_name = "Disk1share"  
     
    # 返回samba server上的文件更新時間,如果出現(xiàn)OperationFailure說明無此文件萎馅,返回0
    def get_last_updatetime(self, file_path):
        try:
            sharedfile_obj = self.samba.getAttributes(
                self.service_name, file_path)
            return sharedfile_obj.last_write_time
        except OperationFailure:
            return 0

    def upload_files(self, local_dir,smb_base_dir: str):
        for root, dir_list, file_list in os.walk(local_dir):
            if self.get_last_updatetime(smb_base_dir) == 0:
                self.samba.createDirectory(self.service_name, smb_base_dir)
            print(f"{get_date_str('second')} 開始處理{root}目錄下的文件...")
            smb_root = os.path.join(smb_base_dir, root.replace(
                local_dir, "").lstrip("/"))
            for dir_name in dir_list:
                smb_dir = os.path.join(smb_root, dir_name)
                # print("smb_dir: ",smb_dir)
                if self.get_last_updatetime(smb_dir) == 0:
                    self.samba.createDirectory(self.service_name, smb_dir)
            for file_name in file_list:
                if file_name.endswith(".sock"):
                    continue
                smb_path = os.path.join(smb_root, file_name)
                local_path = os.path.join(root, file_name)
                modify_time = os.path.getmtime(local_path)
                if self.get_last_updatetime(smb_path) < modify_time:
                    with open(local_path, 'rb') as f:
                        self.samba.storeFile(
                            self.service_name, smb_path, f, timeout=3000)
                    print(f"{get_date_str('second')}",
                          local_path, "傳輸至 ", smb_path, "成功")


username = "***"
password = "***"
port = 139
server_ip = "192.168.2.184"

local_dir = "/root"
remote_dir = "/Backup/ubuntu/root"
print(f"{get_date_str('second')} 開始同步{local_dir} 的數(shù)據(jù)至{remote_dir}")
smb_obj = MySMB(username, password, server_ip, port)
try:
    smb_obj.upload_files(local_dir,remote_dir)
except Exception as e:
    print(f"{get_date_str('second')}", e)
finally:
    print(f"{get_date_str('second')}", "任務結(jié)束")
    smb_obj.samba.close()

執(zhí)行結(jié)果

[參考]

[1] pysmb官方文檔 https://pysmb.readthedocs.io/en/latest/api/smb_SMBConnection.html

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
禁止轉(zhuǎn)載双戳,如需轉(zhuǎn)載請通過簡信或評論聯(lián)系作者。
  • 序言:七十年代末糜芳,一起剝皮案震驚了整個濱河市飒货,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌峭竣,老刑警劉巖塘辅,帶你破解...
    沈念sama閱讀 216,744評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異皆撩,居然都是意外死亡扣墩,警方通過查閱死者的電腦和手機哲银,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,505評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來呻惕,“玉大人荆责,你說我怎么就攤上這事⊙谴啵” “怎么了做院?”我有些...
    開封第一講書人閱讀 163,105評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長濒持。 經(jīng)常有香客問我键耕,道長,這世上最難降的妖魔是什么柑营? 我笑而不...
    開封第一講書人閱讀 58,242評論 1 292
  • 正文 為了忘掉前任屈雄,我火速辦了婚禮,結(jié)果婚禮上官套,老公的妹妹穿的比我還像新娘酒奶。我一直安慰自己,他們只是感情好奶赔,可當我...
    茶點故事閱讀 67,269評論 6 389
  • 文/花漫 我一把揭開白布讥蟆。 她就那樣靜靜地躺著,像睡著了一般纺阔。 火紅的嫁衣襯著肌膚如雪瘸彤。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,215評論 1 299
  • 那天笛钝,我揣著相機與錄音质况,去河邊找鬼。 笑死玻靡,一個胖子當著我的面吹牛结榄,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播囤捻,決...
    沈念sama閱讀 40,096評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼臼朗,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了蝎土?” 一聲冷哼從身側(cè)響起视哑,我...
    開封第一講書人閱讀 38,939評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎誊涯,沒想到半個月后挡毅,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,354評論 1 311
  • 正文 獨居荒郊野嶺守林人離奇死亡暴构,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,573評論 2 333
  • 正文 我和宋清朗相戀三年跪呈,在試婚紗的時候發(fā)現(xiàn)自己被綠了段磨。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,745評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡耗绿,死狀恐怖苹支,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情误阻,我是刑警寧澤沐序,帶...
    沈念sama閱讀 35,448評論 5 344
  • 正文 年R本政府宣布,位于F島的核電站堕绩,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏邑时。R本人自食惡果不足惜奴紧,卻給世界環(huán)境...
    茶點故事閱讀 41,048評論 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望晶丘。 院中可真熱鬧黍氮,春花似錦、人聲如沸浅浮。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,683評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽滚秩。三九已至专执,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間郁油,已是汗流浹背本股。 一陣腳步聲響...
    開封第一講書人閱讀 32,838評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留桐腌,地道東北人拄显。 一個月前我還...
    沈念sama閱讀 47,776評論 2 369
  • 正文 我出身青樓,卻偏偏與公主長得像案站,于是被迫代替她去往敵國和親躬审。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,652評論 2 354

推薦閱讀更多精彩內(nèi)容