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 OperationFailure

def connect(user_name, passwd, ip, port):
    '''
    建立smb服务连接
    :param user_name:
    :param passwd:
    :param ip:
    :param port: 445或者139
    :return:
    '''
    samba = None
    status = False
    try:
        samba = SMBConnection(user_name, passwd, '', '', use_ntlm_v2=True)
        samba.connect(ip, port)
        status = samba.auth_result

    except:
        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_time
    except 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协议

猜你喜欢

转载自blog.csdn.net/qq_43314560/article/details/113882498