Python realiza la carga y descarga de archivos del servidor NAS según el protocolo de comunicación smb

¿Qué es el servicio NAS?

NAS (Network Attached Storage) es un dispositivo que está conectado a la red y tiene la función de almacenamiento de datos, por lo que también se le llama "almacenamiento en red". Es un servidor de almacenamiento de datos dedicado.
Los dispositivos NAS generalmente admiten múltiples plataformas informáticas y los usuarios pueden acceder a los mismos archivos a través de protocolos de soporte de red, por lo que los dispositivos NAS se pueden usar en LAN mixtas de Unix / Windows NT sin modificaciones.
El propio NAS puede admitir varios protocolos (como NFS, CIFS, FTP, HTTP, etc.) y puede admitir varios sistemas operativos. A través de cualquier estación de trabajo, los navegadores IE o Netscape se pueden utilizar para una administración intuitiva y conveniente de los dispositivos NAS.

¿Qué es el protocolo SMB?

SMB (Server Message Block) también se conoce como CIFS (Common Internet File System), un protocolo de transmisión de red de capa de aplicación (un protocolo desarrollado por Microsoft e Intel en 1987), desarrollado por Microsoft, y su función principal Las máquinas en la computadora pueden compartir recursos como archivos de computadora, impresoras, puertos seriales y comunicaciones. También proporciona habilidades de comunicación entre procesos certificadas. Se utiliza principalmente en máquinas con Windows. SMB usa la interfaz de programa de aplicación (API) de NetBIOS, y el uso general del puerto es 139 y 445.

método de instalación del módulo pysmb

pip instalar pysmb

ps: para acelerar el proceso de descarga e instalación, puede usar la fuente de espejo pip para descargar fuentes de espejo comunes, consulte la descripción de cómo agregar enlaces

Python implementa el código de referencia de carga y descarga de archivos

#!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()

Referencia:
Conocimientos básicos de NAS,
servicio Samba, protocolo SMB

Supongo que te gusta

Origin blog.csdn.net/qq_43314560/article/details/113882498
Recomendado
Clasificación