在python中将文件从SMB服务器复制到本地驱动器(Linux/Windows)

Anv*_*esh 6 python

我正在使用 smb 模块使用以下代码段连接到 smb 服务器

import tempfile
from smb.SMBConnection import SMBConnection
from nmb.NetBIOS import NetBIOS

conn = SMBConnection('salead', 'repo@2k12', '192.168.14.1', 'SERVER', use_ntlm_v2 = True)
assert conn.connect('192.168.1.41', 139)
if conn:
    print "successfull",conn
else:
    print "failed to connect"
Run Code Online (Sandbox Code Playgroud)

当我使用 linux 机器时,我无法弄清楚我到底可以做什么来将文件从 smb 复制到我的本地驱动器。

如果有人可以帮助我,那对我来说将是一个很大的帮助。

提前致谢

Rob*_*obᵩ 9

根据一些文档SMBConnection.retrieveFile()是您正在搜索的功能。

例子:

# UNTESTED
conn = SMBConnection('salead',
                     'repo@2k12',
                     '192.168.14.1',
                     'SERVER',
                     use_ntlm_v2 = True)
assert conn.connect('192.168.1.41', 139)
with open('local_file', 'wb') as fp:
    conn.retrieveFile('share', '/path/to/remote_file', fp)
Run Code Online (Sandbox Code Playgroud)

文档:http : //pysmb.readthedocs.io/en/latest/api/smb_SMBConnection.html

示例(日语):http : //symfoware.blog68.fc2.com/blog-entry-999.html


eat*_*ood 5

@Rob 上面引用的文档应该可以帮助您实现这一点。这是一个使用抽象类的想法:

> pip install pysmb
Run Code Online (Sandbox Code Playgroud)
import subprocess

from smb import SMBConnection


class SMBClient:
    def __init__(self, ip, username, password, servername, share_name):
        self._ip = ip
        self._username = username
        self._password = password
        self._port = 445
        self._share_name = share_name
        self._servername = servername
        self._server = ''

    def _connect(self):
        """ Connect and authenticate to the SMB share. """
        self._server = SMBConnection(username=self._username,
                                    password=self._password,
                                    my_name=self._get_localhost(),
                                    remote_name=self._servername,
                                    use_ntlm_v2=True)
        self._server.connect(self._ip, port=self._port)

    def _download(self, files: list):
        """ Download files from the remote share. """
        for file in files:
            with open(file, 'wb') as file_obj:
                self._server.retrieveFile(service_name=self._share_name,
                                          path=file,
                                          file_obj=file_obj)

    def _get_localhost(self):
        self._host = subprocess.Popen(['hostname'],stdout=subprocess.PIPE).communicate()[0].strip()
Run Code Online (Sandbox Code Playgroud)

然后,您需要做的就是:

filename = [the file you want to download]
smb_client = SMBClient(ip='192.168.14.1', username='salead', password='repo@2k12', servername='SERVER', share_name='SHARE_NAME')
smb_client._connect()
response = smb_client._download(filename)
Run Code Online (Sandbox Code Playgroud)

主要文档:https://pysmb.readthedocs.io/en/latest/index.html SMBConnection 文档:https://pysmb.readthedocs.io/en/latest/api/smb_SMBConnection.html