python 基于smb通信协议实现NAS服务器文件上传和下载
什么是NAS服務
NAS(Network Attached Storage:網絡附屬存儲),連接在網絡上,具備資料存儲功能的裝置,因此也稱為“網絡存儲器”。它是一種專用數據存儲服務器。
NAS設備一般支持多計算機平臺,用戶通過網絡支持協議可進入相同的文檔,因而NAS設備無需改造即可用于混合Unix/Windows NT局域網內。
NAS本身能夠支持多種協議(如 NFS、 CIFS、 FTP、 HTTP等),而且能夠支持各種操作系統。通過任何一臺工作站,采用 IE或 Netscape瀏覽器就可以對NAS設備進行直觀方便的管理。
什么是SMB協議
SMB(Server Message Block)又稱CIFS(Common Internet File System),一種應用層網絡傳輸協議(微軟(Microsoft)和英特爾(Intel)在1987年制定的協議),由微軟開發,主要功能是使網絡上的機器能夠共享計算機文件、打印機、串行端口和通訊等資源。它也提供認證的進程間通訊技能。它主要用在Windows的機器上。SMB使用了NetBIOS的應用程序接口 (Application Program Interface,簡稱API),一般端口使用為139,445。
pysmb模塊安裝方法
pip install pysmb
ps:加速下載安裝過程 可利用pip鏡像源下載 常用的鏡像源見添加鏈接描述
python實現文件上傳和下載參考代碼
#!usr/bin/python # _*_ coding:utf-8 _*_ """python Created on 2020/08/14 @author: @theme:實現磁盤陣列讀取與存儲 """ import datetime import os from smb.SMBConnection import SMBConnection from smb.smb_structs import OperationFailuredef connect(user_name, passwd, ip, port):'''建立smb服務連接:param user_name::param passwd::param ip::param port: 445或者139:return:'''samba = Nonestatus = Falsetry:samba = SMBConnection(user_name, passwd, '', '', use_ntlm_v2=True)samba.connect(ip, port)status = samba.auth_resultexcept:samba.close()return samba, status def all_shares_name(samba):'''列出smb服務器下的所有共享目錄:param samba::return:'''share_names = list()sharelist = samba.listShares()for s in sharelist:share_names.append(s.name)return share_names def all_file_names_in_dir(samba, service_name, dir_name):'''列出文件夾內所有文件名:param service_name: 服務名(smb中的文件夾名,一級目錄):param dir_name: 二級目錄及以下的文件目錄:return:'''f_names = list()for e in samba.listPath(service_name, dir_name):if e.filename[0] != '.': # (會返回一些.的文件,需要過濾)f_names.append(e.filename)return f_names def get_last_updatetime(samba, service_name, file_path):'''返回samba server上的文件更新時間(時間戳),如果出現OperationFailure說明無此文件,返回0:param samba::param service_name::param file_path::return:'''try:sharedfile_obj = samba.getAttributes(service_name, file_path)return sharedfile_obj.last_write_timeexcept OperationFailure:return 0 def download(samba, f_names, service_name, smb_dir, local_dir):'''下載文件:param samba::param f_names:文件名:param service_name:服務名(smb中的文件夾名):param smb_dir: smb文件夾:param local_dir: 本地文件夾:return:'''assert isinstance(f_names, list)for f_name in f_names:f = open(os.path.join(local_dir, f_name), 'wb')samba.retrieveFile(service_name, os.path.join(smb_dir, f_name), f)f.close() def createDir(samba, service_name, path):"""創建文件夾:param samba::param service_name::param path::return:"""try:samba.createDirectory(service_name, path)except OperationFailure:pass def upload(samba, service_name, smb_dir, local_dir, f_names):'''上傳文件:param samba::param service_name:服務名(smb中的文件夾名):param smb_dir: smb文件夾:param local_dir: 本地文件列表所在目錄:param f_names: 本地文件列表:return:'''assert isinstance(f_names, list)for f_name in f_names:f = open(os.path.join(local_dir, f_name), 'rb')samba.storeFile(service_name, os.path.join(smb_dir, f_name), f) # 第二個參數path包含文件全路徑f.close() if __name__ == '__main__':samba, status = connect('ll', 'llllllll', '192.168.77.177', 445)if status:print('smb服務器連接成功!')else:print('smb服務器連接失敗!')share_names = all_shares_name(samba)print("share_names:", share_names)share_name = "rd117"dst_name = 'Hdata'f_names = all_file_names_in_dir(samba, share_name, dst_name)print("share_name: {} -dir_name: {} include f_names:".format(share_name, dst_name), f_names)file_path = '/程序/auto_start.bat'timestamp = get_last_updatetime(samba, share_name, file_path)print(datetime.datetime.fromtimestamp(timestamp))# smb_dir = '/數據/歷史氣象數據'# f_names =['README.txt','MERRA-2全球再分析數據集.doc','Delivery_05-29-2009_05-28-2019_hourly.zip']# local_dir = ''# download(samba, f_names, share_name, smb_dir, local_dir)# path = "/數據/test"# createDir(samba, share_name, path)# smb_dir = '/數據/test' # 該目錄需提前創建好# local_dir = 'pic'# f_names = ['ana1.txt','ana2.txt']# upload(samba, share_name, smb_dir, local_dir, f_names)samba.close()Reference:
NAS基礎知識
Samba服務—SMB協議
總結
以上是生活随笔為你收集整理的python 基于smb通信协议实现NAS服务器文件上传和下载的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 计算指定位数的圆周率
- 下一篇: UDP网络通信的发包/收包过程/代理服务