2009-06-12 2 views
7

Ich benutze die Python-smbc-Bibliothek auf Ubuntu, um auf eine Samba-Freigabe zuzugreifen. Ich kann auf die Verzeichnisstruktur gut zugreifen, ich bin mir aber nicht sicher, wie ich auf die eigentlichen Dateien und deren Inhalt zugreifen soll. Die Webseite (https://fedorahosted.org/pysmbc/) erwähnt nichts, der Code ist in C/C++, mit wenig Dokumentation, so dass ich nicht sicher bin, wie man es benutzt.Verwenden von Pysmbc, um Dateien über Samba zu lesen

Was ich weiß ist, dass Context.open (für Dateien) URI, Flags und Modus, aber was Flags und Modus sind, weiß ich nicht.

Hat jemand diese Bibliothek benutzt oder Beispiele dafür, wie man Dateien damit liest?

Die ideale Situation war natürlich, smbfs Mounts zu verwenden, aber wenn ich die gleiche Freigabe mit smbmount mounte, sind alle Ordner leer. Obwohl ich es mit smbclient gut mit den gleichen Anmeldeinformationen durchsuchen kann.

Antwort

-3

Ich würde mit smbfs bleiben. Es ist nur eine Frage der Zeit, bis Sie auf diese freigegebenen Dateien mit etwas anderem als Python zugreifen möchten.

+2

Ich denke, wir zumindest zu beantworten versuchen sollten die Frage ... –

11

Ich hatte auch Probleme mit smbfs (zufällige System-Lockdowns und Neustarts) und brauchte eine schnelle Antwort.

Ich habe auch das smbc-Modul versucht, konnte aber keine Daten damit bekommen. Ich bin genauso wie Sie auf die Verzeichnisstruktur zugegriffen.

Zeit war und ich hatte den Code zu liefern, so nahm ich eine Abkürzung

ich einen kleinen Wrapper um einen „smbclient“ Aufruf schrieb. Es ist ein Hack, hässlich, wirklich hässlich, aber es funktioniert für meine Bedürfnisse. Es wird in der Produktion der Firma verwendet, in der ich arbeite.

Hier einige Beispiel-Anwendung:

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

Der Programmierer vor mir ein „bash“ wurde mit mit vielen smbclient Anrufe Datei, so denke ich, meine Lösung zumindest besser ist.

Ich habe es hochgeladen here, so können Sie es verwenden, wenn Sie möchten. Bitbucket-Repository ist here. Wenn Sie eine bessere Lösung finden, sagen Sie es mir bitte und ich ersetze auch meinen Code.

+0

Hallo Herr, es ist ein gutes Modul, aber nicht in Python 2.6.8 und weniger funktioniert –

+0

@RahulPatil wie scheitert es? Ich benutze es auf Python 2.4 und 2.5 hier in der Produktion und es funktioniert. Kannst du ein Problem im Issue Tracker öffnen und den Fehler beschreiben, den du hier bekommst: https://bitbucket.org/nosklo/pysmbclient/issues/new – nosklo

+1

dude your wrapper flipping rocks ich liebe es genial! –

3

Vorausgesetzt, Sie haben einen offenen Kontext haben (die Unit-Tests hier sehen)
* 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() 

einen Kontext öffnen nur eine Authentifizierungsfunktion

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

Ich brauchte nur eine einfache Sache und das ist es einfach. Danke –

1

definieren Wenn Sie es geschafft haben, Holen Sie sich die Verzeichnisstruktur, dann haben Sie einen Arbeitskontext. Der Schlüssel zum tatsächlichen Zugriff auf Dateien ist das undokumentierte Flag-Argument von Context.open. (Ich habe nicht herausgefunden, welcher Modus für beide ist, aber es scheint nicht notwendig.)

flags ist, wie Sie Pysmbc sagen, welche Art von Zugriff auf die Datei Sie wollen. Sie tun dies, indem Sie eine Ganzzahl übergeben, die durch bitweise ODER-Verknüpfung (|) von dem os-Modul zusammen gemacht wird. Insbesondere die Flags, die mit os.O_ markiert oder ergänzt werden sollen (siehe eine Liste in der Python-Dokumentation here).

Zum Beispiel in eine Datei schreiben Sie Flags os.O_WRONLY (equiavlent zur Verwendung von "w" als Modus-Parameter der eingebauten open-Funktion) und anhängen zu einer Datei, die bereits festgelegt würden existieren könnte os.O_WRONLY | os.O_APPEND | os.O_CREAT (äquivalent zu "a+" verwenden).

Dieser Aufruf gibt dann ein file Objekt zurück, das Sie wie jede normale lokale Datei verwenden können.

2

Wenn nicht wissen, ob dies mehr wird klar gesagt, aber hier ist, was ich auf dieser Seite entnommen und aussortiert von einem wenig mehr 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

Können Sie mehr erklären, wie dies die Frage beantwortet? – Laurel

Verwandte Themen