2009-06-12 9 views
7

Używam biblioteki python-smbc na Ubuntu, aby uzyskać dostęp do udziału samby. Mogę uzyskać dostęp do struktury katalogów, ale nie jestem pewien, jak uzyskać dostęp do rzeczywistych plików i ich zawartości. Strona internetowa (https://fedorahosted.org/pysmbc/) niczego nie wspomina, kod znajduje się w języku C/C++, z niewielką dokumentacją, więc nie jestem do końca pewny, jak z niego korzystać.Używanie pysmbc do odczytu plików przez sambę

Co wiem, że Context.open (dla plików) pobiera uri, flagi i tryb, ale jakie flagi i tryb są, nie wiem.

Czy ktoś użył tej biblioteki lub miał przykłady, jak odczytać pliki z nią korzystające?

Idealną sytuacją było oczywiście używanie uchwytów smbfs, ale kiedy montuję ten sam udział za pomocą smbmount, wszystkie foldery są puste. Chociaż mogę przeglądać go za pomocą smbclient fine przy użyciu tych samych poświadczeń.

Odpowiedz

-3

Będę trzymać się smbfs. To tylko kwestia czasu, aby uzyskać dostęp do tych plików współdzielonych za pomocą czegoś innego niż Python.

+2

myślę, że powinniśmy przynajmniej spróbować odpowiedzieć pytanie ... –

11

Też miałem problemy z używaniem smbfs (losowe blokady systemu i ponowne uruchamianie) i potrzebowałem szybkiej odpowiedzi.

Próbowałem również moduł smbc, ale nie mogłem uzyskać żadnych danych z nim. Poszedłem tak daleko, jak dostęp do struktury katalogów, tak jak ty.

czas się skończył i musiałem dostarczyć kod, więc wziąłem skrótu:

Napisałem mały owijkę wokół „smbclient” rozmowy. To jest hack, brzydki, naprawdę brzydki, ale działa na moje potrzeby. Jest używany w produkcji w firmie, w której pracuję.

Oto kilka przykładów użycia:

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

Programista zanim mnie używał „bash” plik z dużą ilością połączeń smbclient, więc myślę, że moje rozwiązanie jest co najmniej lepiej.

Przesłałem go pod numer here, więc możesz go użyć, jeśli chcesz. Repozytorium Bitbucket to here. Jeśli znajdziesz lepsze rozwiązanie, powiedz mi, a ja też zamienię mój kod.

+0

Hi sir, to dobry moduł, ale nie działa w Pythonie 2.6.8 i poniżej –

+0

@RahulPatil jak to się nie udaje? Używam go na python 2.4 i 2.5 tutaj w produkcji i działa. Czy możesz otworzyć problem w narzędziu do śledzenia problemów i opisać błąd, który tu przychodzi: https://bitbucket.org/nosklo/pysmbclient/issues/new – nosklo

+1

dude your wrapper flipping rocks I love it awesome! –

3

Pod warunkiem, że mają otwartą kontekstu (patrz testy jednostkowe tutaj)
* 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() 

Aby otworzyć kontekst wystarczy zdefiniować funkcję uwierzytelniania

ctx = smbc.Context() 

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

ctx.optionNoAutoAnonymousLogin = True 
ctx.functionAuthData = auth_fn 
+0

Po prostu potrzebowałem prostej rzeczy i to jest właśnie to. Dziękuję –

1

Jeśli nie udało się uzyskać strukturę katalogów, a następnie masz działający kontekst. Kluczem do rzeczywistego dostępu do plików jest nieudokumentowany argument flagi Context.open. (Nie mam pojęcia, jaki tryb jest dostępny, ale nie wydaje się to konieczne.)

flags to jak powiedzieć pysmbc, jaki rodzaj dostępu do pliku chcesz. Robisz to, przekazując mu liczbę całkowitą utworzoną przez bitowe ORing (|) flagi z modułu os razem. W szczególności flagi, które chcesz lub mają przyrostek z os.O_ (zobacz listę w dokumentacji Pythona here).

Na przykład, aby zapisać do pliku należy ustawić flagi os.O_WRONLY (equiavlent użyciem "w" jako parametr trybu wbudowanego w open funkcji) i dołączyć do pliku, który może już istnieć używać os.O_WRONLY | os.O_APPEND | os.O_CREAT (odpowiednik "a+").

Wywołanie to zwróci obiekt file, którego można użyć tak jak każdy normalny, lokalny plik.

2

Jeśli nie wiem, czy jest to bardziej wyraźnie powiedziane, ale oto co zbierana z tej strony i uporządkowane z trochę dodatkowych 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() 
+0

Czy możesz wyjaśnić, w jaki sposób odpowiada na pytanie? – Laurel

Powiązane problemy