2015-10-20 10 views
0

Мне удастся подключиться и получить доступ к серверу smb share using pysmb. Я имел в виду читать/писать/удалять/создавать файлы/папки на/с сервера.pysmb, чтобы получить дерево каталогов на сервере с общим доступом smb

В большинстве случаев мне нужно прочитать файл (будь то jpg или csv и т. Д.) С базы сервера на устройстве smb и имени службы (термины pysmb).

В принципе я понятия не имею, что такое имя файла и имя каталога в устройствах smb. что означает именование - динамика.

Мне интересно, стоит ли сначала отфильтровать дерево каталогов перед обработкой файлов чтения. количество файлов и каталогов неизвестно с данными за 3 месяца около 60 ТБ.

listShares(timeout=30)[source] 
listPath(service_name, path, search=55, pattern='*', timeout=30) 

вышеуказанные методы собираются получить только 1 конкретный уровень иерархии. что я хочу, это аналогичный вывод от os.walk.path().

У кого-нибудь есть опыт в идее? могу ли я получить предложения? Большое спасибо.

ответ

1

Не уверен, что это то, что вы хотите. но я работаю над подобными вещами, поэтому здесь вы идете.

Я использую Impacket, который на самом деле использует некоторые базовые классы из pysmb. https://github.com/CoreSecurity/impacket

Я надеюсь, что ваш метод listPath возвращает результат в текстовом формате, а не экземпляр SharedFile.

Что я имею в виду, хранить ниже значений при их перечислении.

get_longname is_directory get_filesize

У меня есть метод дерева которые проходят через акционерный/путь и проверяет, является ли экземпляр SharedFile является каталог, & делает рекурсивный вызов себе.

def tree(self, path):  
    for x in range(0, path.count('\\')): 
      print '| ', 
    print '%s' % os.path.basename(path.replace('\\', '/')) 

    self.do_ls('%s\\*' % path, pretty=False) #Stores files data in listdata[] 

    for file, is_directory, size in self.listdata: 
      if file in ('.', '..'): 
       continue 
      if is_directory > 0: 
       self.tree(ntpath.join(path, file)) 
      else: 
       for x in range(0, path.count('\\')): 
        print '| ', 
       print '|-- %s (%d bytes)' % (file, size) 


>>>d.tree('test') 
.snapshot 
| hourly.0 
| | dir0 
| | | Test051-89 
| | | Test051_perf3100-test_43 
| | | | Test051_perf3100-test_52 
| |-- a.txt (8 bytes) 
| |-- dir0 - Shortcut.lnk (1834 bytes) 
| |-- Thumbs.db (46080 bytes) 
| | 20743 
| | |-- file.txt (82 bytes) 
| | |-- link.txt (82 bytes) 
| | | targetdir 
| | | |-- file2.txt (39 bytes) 
| |-- target.txt (6394368 bytes) 
| | linkdir 
| | |-- file2.txt (39 bytes) 
+1

спасибо. ваш код хорош. У меня есть доля моей работы. пожалуйста, посмотрите, если у вас есть время. – pinky

4
def smbwalk(conn, shareddevice, top = u'/'): 
    dirs , nondirs = [], [] 

    if not isinstance(conn, SMBConnection): 
     raise TypeError("SMBConnection required") 


    names = conn.listPath(shareddevice, top) 

    for name in names: 
     if name.isDirectory: 
      if name.filename not in [u'.', u'..']: 
       dirs.append(name.filename) 
     else: 
      nondirs.append(name.filename) 

    yield top, dirs, nondirs 

    for name in dirs: 
     new_path = os.path.join(top, name) 
     for x in smbwalk(conn, shareddevice, new_path): 
      yield x 


conn = SMBConnection(*con_str, domain='workgroup') 
assert conn.connect('10.10.10.10') 
ans = smbwalk(conn, 'SHARE_FOLDER',top= '/') 

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

+1

спасибо за помощь, я приму ваши ан. Большое спасибо. – pinky

1

Считаете ли вы использовать потоки? Быстрая идея - получить все каталоги верхнего уровня, а затем использовать потоки для всех из них и использовать функцию smbwalk. Во время прогулки по дереву он ищет объекты, поэтому потребуется время. но вы увидите улучшение производительности с помощью потоков.

+0

спасибо за идею. очень хорошее предложение для меня. Интересно, каковы максимальные потоки в python. это аппаратная и зависимая от os? напр. i7 4 основных максимальных потока - 8. Я считаю, что я не слишком прав. – pinky

+0

моя ситуация: 3 сервера smb. 90 ежедневных папок в каждом. 200+ папок в каждой ежедневной папке. 20+ папок в каждой из 200+. 10+ папок в каждом из 20+. многие почтовые индексы в папках 10+. каждый почтовый индекс имеет минимум 5 уровней иерархии. Мне нужно вернуть абсолютный путь базы zip на содержимое в файле внутри zip. поэтому пользователь может загрузить zip-файл на основе серийного номера # или квитанций #. – pinky

+0

Его оба фактически ОС, а также H/W зависимы. 1> 200+> 20+> 10+> ~> read> return Итак, вы должны прочитать содержимое файла, а затем вернуть путь на основе «не знаете, что вы смотрите в частности». Нормальный каталог i.e \\ server \ share \ * вызывает SMB2_FIND_BOTH_DIRECTORY_INFO. Что, в свою очередь, возвращает отметки времени, размер ea, атрибуты, имя, eof, размер распределения, индекс, следующее смещение и длину имени. Вы можете проверить, уменьшив всю эту информацию до индекса, следующего смещения и имени. Или, если для вашего smbserver доступны какие-либо оптимизации только для чтения? вы можете настроить их. Все серверы NAS имеют их –