使用 smb 协议 python3 访问服务器上的远程文件

Posted

技术标签:

【中文标题】使用 smb 协议 python3 访问服务器上的远程文件【英文标题】:access remote files on server with smb protocol python3 【发布时间】:2018-09-04 17:31:13 【问题描述】:

我有一个带有一些文件的远程服务器。

smb://ftpsrv/public/

我可以在那里被授权为匿名用户。在java中我可以简单地写下这段代码:

SmbFile root = new SmbFile(SMB_ROOT);

并获得处理内部文件的能力(这就是我所需要的,一行!),但我无法在 Python 3 中找到如何管理此任务,有很多资源,但我认为它们与我的问题无关,因为它们经常为 Python 2 和其他旧方法量身定制。有没有一些简单的方法,类似于上面的Java代码? 或者,例如,如果我想访问smb://ftpsrv/public/ 文件夹中的文件fgg.txt,有人可以提供一个真正可行的解决方案。真的有一个方便的库来解决这个问题吗?

例如现场:

import tempfile
from smb.SMBConnection import SMBConnection

# There will be some mechanism to capture userID, password, client_machine_name, server_name and server_ip
# client_machine_name can be an arbitary ASCII string
# server_name should match the remote machine name, or else the connection will be rejected
conn = SMBConnection(userID, password, client_machine_name, server_name, use_ntlm_v2 = True)
assert conn.connect(server_ip, 139)

file_obj = tempfile.NamedTemporaryFile()
file_attributes, filesize = conn.retrieveFile('smbtest', '/rfc1001.txt', file_obj)

# Retrieved file contents are inside file_obj
# Do what you need with the file_obj and then close it
# Note that the file obj is positioned at the end-of-file,
# so you might need to perform a file_obj.seek() if you need
# to read from the beginning
file_obj.close()

我是否真的需要提供所有这些详细信息:conn = SMBConnection(userID, password, client_machine_name, server_name, use_ntlm_v2 = True)

【问题讨论】:

在pysmb网站上转了一圈,找到了这个页面,你需要这个吗? pysmb.readthedocs.io/en/latest/api/smb_SMBHandler.html 感谢您的支持,但这无济于事。我在安装 urllib2 时遇到了一些问题 【参考方案1】:

我认为您要求的是 Linux,但为了完整起见,我将分享它在 Windows 上的工作原理。

在 Windows 上,使用 Python 的标准库函数似乎支持 Samba 访问:

import glob, os

with open(r'\\USER1-PC\Users\Public\test.txt', 'w') as f:
    f.write('hello')    # write a file on a distant Samba share

for f in glob.glob(r'\\USER1-PC\Users\**\*', recursive=True):
    print(f)   # glob works too
    if os.path.isfile(f):
        print(os.path.getmtime(f))  # we can get filesystem information

【讨论】:

【参考方案2】:

Python 3 中使用 urllib 和 pysmb 打开文件的简单示例

import urllib
from smb.SMBHandler import SMBHandler
opener = urllib.request.build_opener(SMBHandler)
fh = opener.open('smb://host/share/file.txt')
data = fh.read()
fh.close()

我还没有准备好用来测试它的匿名 SMB 共享,但是这段代码应该可以工作。 urllib2 是 python 2 包,在 python 3 中它被重命名为 urllib 并且一些东西被移动了。

【讨论】:

我有一个例外self.sock.sendto(data, ( ip, port )) socket.gaierror: [Errno -2] Name or service not known 看来您输入了错误的主机名。确保它是正确的格式。 [username:password@]hostname[:port] 其中 [ ] 之间的所有内容都是可选的 smb://ftpsrv/public/我有这样的路径,我的代码是opener.open('smb://ftpsrv/public/fgg.txt') 您可以尝试在运行脚本的系统上使用ping ftpsrv 吗?好像找不到那个主机名。 我收到了这个错误,包括 ip 和主机名。 urllib.error.URLError: <urlopen error SMB error: Hostname does not reply back with its machine name>

以上是关于使用 smb 协议 python3 访问服务器上的远程文件的主要内容,如果未能解决你的问题,请参考以下文章

smb是啥啥打开

smba使用环境搭建

Samba服务配置详解(匿名,身份,别名,访问控制,挂载访问)

服务之samba服务介绍

SAMBA

samba