无法通过Python访问Samba服务器上的文件

时间:2017-08-07 17:10:19

标签: python samba fileserver libsmbclient

我正在尝试使用Python访问Samba服务器上的文件。我发现我需要使用Samba客户端,所以我开始使用PySmbClient。即使网上有很多关于如何做到这一点的例子,我也不想工作。见下文。

smb = smbclient.SambaClient(server="192.168.0.320", share="DATA", domain="WORKGROUP",username="admin", password="abc123")
f = smb.open('test.json', 'r')

这会产生以下错误:

OSError: [Errno 2] No such file or directory

带有以下描述:

Traceback (most recent call last):
  File "create_dataset.py", line 35, in <module>
    f = smb.open('serverSaver.txt', 'r')
  File "/home/grant/Development/create_dataset/env/local/lib/python2.7/site-packages/smbclient.py", line 408, in open
    f = _SambaFile(self, path, mode)
  File "/home/grant/Development/create_dataset/env/local/lib/python2.7/site-packages/smbclient.py", line 448, in __init__
    connection.download(remote_name, self._tmp_name)
  File "/home/grant/Development/create_dataset/env/local/lib/python2.7/site-packages/smbclient.py", line 393, in download
    result = self._runcmd('get', remote_path, local_path)
  File "/home/grant/Development/create_dataset/env/local/lib/python2.7/site-packages/smbclient.py", line 184, in _runcmd
    return self._raw_runcmd(fullcmd)
  File "/home/grant/Development/create_dataset/env/local/lib/python2.7/site-packages/smbclient.py", line 168, in _raw_runcmd
    stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
  File "/usr/lib/python2.7/subprocess.py", line 711, in __init__
    errread, errwrite)
  File "/usr/lib/python2.7/subprocess.py", line 1343, in _execute_child
    raise child_exception

我已阅读并实施了许多“解决方案”,但到目前为止,对我来说没有任何效果。我可以通过我的文件管理器使用给定的凭据访问Samba服务器就好了,所以我知道这些值应该没问题。我甚至和我们的系统管理员交谈过,他不知道会出现什么问题。

它必须不仅仅是我写的简单代码。您认为服务器方面存在问题吗?我输入SambaClient的值的东西?在这一点上,我对任何导致解决方案的事情都非常开放。

2 个答案:

答案 0 :(得分:5)

这里有一些适合我的代码,将文件从Linux Samba共享传输到我的Windows笔记本电脑。它也被称为在另一个方向上工作正常(Linux客户端,Windows服务器)。

我使用的是pysmb库版本1.1.19(最新版本)和Python 2.7.1。

请参阅the pysmb site了解pysmb包;我实际上直接从它的tarball和setup.py下载并安装它,因为pip正在抛出一个错误。

pysmb软件包不太方便用户使用,但它适用于Windows客户端。

我设置了一个名为&#34; my_share&#34;在Linux机器上为用户&#34; edwards&#34;使用smb.conf中的以下条目:

[my_share]
path = /home/edwards
valid_users = edwards
read only = no
guest ok = yes
browseable = yes

然后使用以下代码列出共享上的文件,并下载名为&#34; rti_license.dat&#34;的文件。到我的笔记本电脑:

import tempfile
import smb
import shutil

from smb.SMBConnection import SMBConnection

share_name          = "my_share"
user_name           = "edwards"
password            = "######"             # secret :-)
local_machine_name  = "laptop"             # arbitrary
server_machine_name = "edwards-Yocto"      # MUST match correctly
server_IP           = "192.162.2.1"        # as must this            

# create and establish connection
conn = SMBConnection(user_name, password, local_machine_name, server_machine_name, use_ntlm_v2 = True)

assert conn.connect(server_IP, 139)

# print list of files at the root of the share
files = conn.listPath(share_name, "/") 
for item in files:
    print item.filename

# check if the file we want is there
sf = conn.getAttributes(share_name, "rti_license.dat")
print sf.file_size
print sf.filename

# create a temporary file for the transfer
file_obj = tempfile.NamedTemporaryFile(mode='w+t', delete=False)
file_name = file_obj.name
file_attributes, copysize = conn.retrieveFile(share_name, "rti_license.dat", file_obj)
print copysize
file_obj.close()

# copy temporary file 
shutil.copy(file_name, "rti_license.dat")

# close connection
conn.close()

请注意,服务器名称必须正确或连接不起作用(从Linux机器上它是hostname命令的输出)

希望这可能有用。

答案 1 :(得分:1)

我最近不得不使用pysmb,很难找到后裔的例子。

我想分享这个对我有很大帮助的链接: https://github.com/humberry/smb-example/blob/master/smb-test.py