7

我在 Ubuntu 上使用 python-smbc 库来访问 samba 共享。我可以很好地访问目录结构,但是我不确定如何访问实际文件及其内容。网页(https://fedorahosted.org/pysmbc/)没有提到任何东西,代码是 C/C++,文档很少,所以我不太清楚如何使用它。

我所知道的是 Context.open (for files) 需要 uri、flags 和 mode,但我不知道 flags 和 mode 是什么。

有没有人使用过这个库,或者有关于如何使用它读取文件的示例?

理想的情况当然是使用 smbfs 挂载,但是当我使用 smbmount 挂载同一个共享时,所有文件夹都是空的。虽然我可以使用相同的凭据通过 smbclient 很好地浏览它。

4

5 回答 5

11

我在使用 smbfs(随机系统锁定和重启)时也遇到了问题,需要快速解答。

我也尝试过该smbc模块,但无法获得任何数据。我和你一样访问了目录结构。

时间到了,我不得不交付代码,所以我走捷径:

smbclient我在 " " 调用周围写了一个小包装。这是一个 hack,丑陋,非常丑陋,但它可以满足我的需求。我工作的公司正在生产中使用它。

这是一些示例用法:

>>> smb = smbclient.SambaClient(server="MYSERVER", share="MYSHARE", 
                                username='foo', password='bar', domain='baz')
>>> print smb.listdir(u"/")
[u'file1.txt', u'file2.txt']
>>> f = smb.open('/file1.txt')
>>> data = f.read()
>>> f.close()
>>> smb.rename(u'/file1.txt', u'/file1.old')

我之前的程序员使用带有大量 smbclient 调用的“bash”文件,所以我认为我的解决方案至少更好。

我已经在这里上传了,所以你可以根据需要使用它。Bitbucket 存储库在这里。如果您找到更好的解决方案,请告诉我,我也会替换我的代码。

于 2009-06-12T22:56:51.300 回答
3

如果您有一个开放的上下文(请参阅此处的单元测试)
* https://github.com/ioggstream/pysmbc/tree/master/tests

suri =  'smb://' + settings.SERVER + '/' + settings.SHARE + '/test.dat'  
dpath = '/tmp/destination.out'

# open smbc uri
sfile = ctx.open(suri, os.O_RDONLY)

# open local target where to copy file
dfile = open(dpath, 'wb')

#copy file and flush
dfile.write(sfile.read())
dfile.flush()

#close both files
sfile.close()    
dfile.close()

要打开上下文,只需定义一个身份验证函数

ctx = smbc.Context()

def auth_fn(server, share, workgroup, username, password):
    return (workgroup, settings.USERNAME, settings.PASSWORD)

ctx.optionNoAutoAnonymousLogin = True
ctx.functionAuthData = auth_fn
于 2012-07-09T10:27:23.397 回答
2

如果不知道这是否更清楚地说明,但这是我从这个页面收集的内容,并从一些额外的谷歌中整理出来:

def do_auth (server, share, workgroup, username, password):
  return ('MYDOMAIN', 'myacct', 'mypassword')


# Create the context
ctx = smbc.Context (auth_fn=do_auth)
destfile = "myfile.txt"
source = open('/home/myuser/textfile.txt', 'r')
# open a SMB/CIFS file and write to it
file = ctx.open ('smb://server/share/folder/'+destfile, os.O_CREAT | os.O_WRONLY)
for line in source:
        file.write (line)
file.close()
source.close()

# open a SMB/CIFS file and read it to a local file
source = ctx.open ('smb://server/share/folder/'+destfile, os.O_RDONLY)
destfile = "/home/myuser/textfile.txt"
fle = open(destfile, 'w')
for line in source:
        file.write (line)
file.close()
source.close()
于 2016-06-10T19:06:47.600 回答
1

如果您设法获得了目录结构,那么您就有了一个工作上下文。实际访问文件的关键是Context.open. (我还没有弄清楚两者的模式是什么,但似乎没有必要。)

flags是您如何告诉 pysmbc 对您想要的文件的访问类型。您可以通过将|os 模块中的按位 ORing ( ) 标志组合在一起的整数传递给它。特别是您想要或后缀的标志(请参阅此处os.O_的 Python 文档中的列表)。

例如,要写入文件,您可以将标志设置为os.O_WRONLY(相当于使用"w"作为内置open函数的模式参数)并附加到可能已经存在的文件使用os.O_WRONLY | os.O_APPEND | os.O_CREAT(相当于"a+")。

然后,该调用将返回一个file对象,您可以像使用任何普通的本地文件一样使用该对象。

于 2012-11-19T15:50:31.363 回答
-3

我会坚持使用 smbfs。您想要使用 Python 以外的其他工具访问这些共享文件只是时间问题。

于 2009-06-12T20:02:38.940 回答