2009-06-12 37 views
7

Estoy usando la biblioteca python-smbc en Ubuntu para acceder a un recurso compartido de samba. Puedo acceder bien a la estructura del directorio, pero no estoy seguro de cómo acceder a los archivos reales y su contenido. La página web (https://fedorahosted.org/pysmbc/) no menciona nada, el código está en C/C++, con poca documentación, por lo que no estoy muy seguro de cómo usarlo.Uso de pysmbc para leer archivos en samba

Lo que sé es que Context.open (para archivos) toma uri, flags y modo, pero qué banderas y modo son, no sé.

¿Alguien ha utilizado esta biblioteca o tiene ejemplos de cómo leer archivos al usarla?

Por supuesto, la situación ideal ha sido utilizar soportes smbfs, pero cuando monto el mismo recurso compartido usando smbmount, todas las carpetas están vacías. Aunque puedo navegar con smbclient fine usando las mismas credenciales.

Respuesta

-3

Me quedaría con smbfs. Es solo cuestión de tiempo antes de que desee acceder a esos archivos compartidos con algo que no sea Python.

+2

creo que deberíamos al menos tratar de respuesta la pregunta ... –

11

También tuve problemas para usar smbfs (bloqueos y reinicios aleatorios del sistema) y necesitaba una respuesta rápida.

También probé el módulo smbc pero no pude obtener ningún dato con él. Fui tan lejos como para acceder a la estructura del directorio, como tú.

tiempo había terminado y que tenía que entregar el código, por lo que tomó un atajo:

escribí un pequeño envoltorio en torno a un "smbclient" llamada. Es un truco, feo, realmente feo, pero funciona para mis necesidades. Se está utilizando en producción en la empresa en la que trabajo.

He aquí algunos ejemplo de uso:

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

El programador antes que yo estaba usando un "golpe" archivo con una gran cantidad de llamadas smbclient, así que creo que mi solución es al menos mejor.

Lo he subido here, así que puede usarlo si lo desea. El repositorio Bitbucket es here. Si encuentra una solución mejor, dígame y reemplazaré mi código también.

+0

Hola señor, es un buen módulo, pero no funciona en Python 2.6.8 y por debajo de –

+0

@RahulPatil ¿cómo está fallando? Lo estoy usando en python 2.4 y 2.5 aquí en producción y funciona. Se puede abrir un tema en el seguimiento de incidencias y describir el error que está recibiendo aquí: https://bitbucket.org/nosklo/pysmbclient/issues/new – nosklo

+1

tipo del envoltorio sus rocas mover de un tirón me encanta increíble! –

3

Siempre que tenga un contexto abierto (ver las pruebas de unidad aquí)
* 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() 

Para abrir un marco acaba de definir una función de autenticación

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

Solo necesitaba algo simple y esto es todo. Gracias –

1

Si usted ha logrado obtener la estructura de directorio, entonces tienes un contexto de trabajo. La clave para acceder a los archivos es el argumento de banderas no documentadas de Context.open. (No he descubierto qué modo es para ninguno pero no parece necesario.)

flags es cómo le dice a pysmbc qué tipo de acceso tiene al archivo que desea. Para ello, se le pasa un entero hecho por ORing bit a bit (|) indicadores del módulo os juntos. Específicamente, los indicadores que desee o sufijo con os.O_ (consulte una lista en la documentación de Python here).

Por ejemplo, para escribir en un archivo en el que establecer indicadores para os.O_WRONLY (equiavlent a usar "w" como el parámetro de modo de la construcción en open función) y anexar a un archivo que ya pudiera existir utilizar os.O_WRONLY | os.O_APPEND | os.O_CREAT (equivalente a "a+")

Esa llamada será entonces devolver un objeto file que se puede utilizar como cualquier archivo normal, local.

2

Si no se si esto se expresa con mayor claridad, pero aquí es lo que he recogido de esta página y lo solucionaron de un poco más Google-ción:

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

¿Puedes explicarme más cómo responde esto a la pregunta? – Laurel

Cuestiones relacionadas