Использование pysmbc для чтения файлов через samba - PullRequest
7 голосов
/ 12 июня 2009

Я использую библиотеку python-smbc в Ubuntu для доступа к общему ресурсу samba. Я могу получить доступ к структуре каталогов нормально, однако я не уверен, как получить доступ к фактическим файлам и их содержимому. На веб-странице (https://fedorahosted.org/pysmbc/) ничего не сказано, код написан на C / C ++, с небольшой документацией, поэтому я не совсем уверен, как его использовать.

Что я знаю, так это то, что Context.open (для файлов) принимает uri, флаги и режим, но что такое флаги и режим, я не знаю.

Кто-нибудь использовал эту библиотеку, или есть примеры, как читать файлы, используя ее?

Идеальной ситуацией, конечно, было использование smbfs mounts, но когда я монтирую один и тот же общий ресурс с помощью smbmount, все папки пусты. Хотя я могу просматривать его с smbclient в порядке, используя те же учетные данные.

Ответы [ 5 ]

11 голосов
/ 13 июня 2009

У меня также были проблемы с использованием 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')

Программист до меня использовал файл "bash" с большим количеством вызовов smbclient, так что я думаю, что мое решение, по крайней мере, лучше.

Я загрузил его здесь , так что вы можете использовать его, если хотите. Репозиторий Bitbucket здесь . Если вы найдете лучшее решение, пожалуйста, сообщите мне, и я тоже заменю свой код.

3 голосов
/ 09 июля 2012

При условии, что у вас есть открытый контекст (см. Здесь модульные тесты)
* 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 голосов
/ 10 июня 2016

Если вы не знаете, если это более четко изложено, но вот что я почерпнул из этой страницы и разобрался с небольшим дополнительным гуглом:

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()
1 голос
/ 19 ноября 2012

Если вам удалось получить структуру каталогов, значит, у вас есть рабочий контекст. Ключом к фактическому доступу к файлам является аргумент флагов без документов Context.open. (Я не выяснил, какой режим для этого, но это не кажется необходимым.)

flags - это то, как вы сообщаете pysmbc, какой тип доступа к файлу вы хотите. Вы делаете это, передавая ему целое число, полученное битовыми флагами ORing (|) из модуля os. В частности, флаги, которые вы хотите или с суффиксом os.O_ (см. Список в документации по Python здесь ).

Например, для записи в файл вы должны установить флаги на os.O_WRONLY (равносильно использованию "w" в качестве параметра режима встроенной функции open) и добавить файл, который может уже существовать, использовать os.O_WRONLY | os.O_APPEND | os.O_CREAT (эквивалентно "a+").

Затем этот вызов вернет объект file, который вы можете использовать как любой обычный локальный файл.

0 голосов
/ 13 июня 2009

Я бы придерживался smbfs. Прежде чем вы захотите получить доступ к этим общим файлам с помощью чего-то другого, кроме Python, это только вопрос времени.

...