使用pysmbc通过samba读取文件

时间:2009-06-12 13:48:30

标签: python samba

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

我所知道的是Context.open(对于文件)采用uri,flags和mode,但是我不知道是什么标志和模式。

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

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

5 个答案:

答案 0 :(得分:11)

我在使用smbfs(随机系统锁定和重启)方面遇到了麻烦,需要快速回答。

我也尝试了smbc模块但无法获取任何数据。我就像你一样访问目录结构。

时间到了,我不得不提供代码,所以我选择了一条捷径:

我在“smbclient”电话周围写了一个小包装器。这是一个黑客,丑陋,非常丑陋,但它适合我的需要。它正在我工作的公司的生产中使用。

以下是一些示例用法:

>>> 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”文件, 所以我认为我的解决方案至少更好。

我已上传here,因此您可以根据需要使用它。 Bitbucket存储库是here。如果您找到更好的解决方案,请告诉我,我也将替换我的代码。

答案 1 :(得分: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

答案 2 :(得分:2)

如果不知道这是否更明确,但这是我从这个页面收集的内容,并从一些额外的Google-ing中整理出来:

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

答案 3 :(得分:1)

如果您已设法获取目录结构,那么您将拥有一个工作上下文。实际访问文件的关键是Context.open的未记录的flags参数。 (我还没弄清楚它是什么模式,但似乎没必要。)

flags是告诉pysmbc对所需文件的访问类型的方式。你可以通过传递一个由os模块中的按位ORing(|)标志组成的整数来做到这一点。特别是您想要的标记或以os.O_为后缀(请参阅Python文档here中的列表)。

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

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

答案 4 :(得分:-3)

我会坚持使用smbfs。使用Python之外的其他东西来访问这些共享文件只是时间问题。