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