2009-06-12 7 views
7

저는 Samba 공유에 액세스하기 위해 우분투에서 python-smbc 라이브러리를 사용하고 있습니다. 디렉토리 구조에 액세스 할 수 있지만 실제 파일과 해당 내용에 액세스하는 방법을 잘 모릅니다. 웹 페이지 (https://fedorahosted.org/pysmbc/)는 아무 것도 언급하지 않으며 코드는 C/C++로 거의 문서화되지 않았으므로 사용법을 잘 모르겠습니다.pysmbc를 사용하여 samba에서 파일 읽기

제가 알고있는 것은 Context.open (파일 용)이 uri, flags 및 mode를 취하지 만 플래그와 모드는 무엇인지 모르겠습니다.

누구든지이 라이브러리를 사용 했습니까? 아니면이 라이브러리를 사용하여 파일을 읽는 방법에 대한 예제가 있습니까?

이상적인 상황은 물론 smbfs 마운트를 사용하는 것이었지만 smbmount를 사용하여 동일한 공유를 마운트하면 모든 폴더가 비어 있습니다. 비록 내가 동일한 자격 증명을 사용하여 smbclient 벌금 그것을 탐색 할 수 있습니다.

답변

-3

나는 smbfs를 고수 할 것이다. Python 이외의 다른 것으로 공유 파일에 액세스하기 전에 시간 문제 일뿐입니다.

+2

나는 우리가 적어도 답변을 시도해야한다고 생각 질문 ... –

11

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

나, smbclient를 호출 많은 파일에 "bash는"을 사용했다 그래서 난 내 솔루션은 적어도 더 생각하기 전에 프로그래머.

here을 업로드하여 원할 경우 사용할 수 있습니다. Bitbucket 저장소는 here입니다. 더 나은 해결책을 찾으면 제게 말해주십시오. 제 코드도 대체 할 것입니다.

+0

안녕하세요, 선생님, 좋은 모듈이지만 Python 2.6.8 이하에서 작동하지 않습니다 –

+0

@RahulPatil 어떻게 실패합니까? 파이썬 2.4 및 2.5 생산에 여기에서 사용하고 작동합니다. 이슈 트래커에서 이슈를 열고 여기에 오는 오류를 설명 할 수 있습니까? https://bitbucket.org/nosklo/pysmbclient/issues/new – nosklo

+1

래퍼를 뒤집어 쓰는 래퍼 나는 정말 멋지다! –

3

하면 당신이 관리 한 경우 단지 인증 기능

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

난 그냥 간단한 일이 필요했고 이것은 단지 그것입니다. 감사합니다. –

1

을 정의 문맥을 열려면
* 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() 

열린 컨텍스트 (여기에 단위 테스트 참조)이 제공 디렉토리 구조를 얻은 다음 작업 컨텍스트를가집니다. 실제로 파일에 액세스하는 열쇠는 문서화되지 않은 플래그 인수 Context.open입니다. (나는 어떤 모드인지는 모르지만 필요하지는 않습니다.)

flags은 pysmbc에게 원하는 파일에 대한 액세스 유형을 알려주는 방법입니다. os 모듈의 비트 단위 OR (|) 플래그를 함께 정수로 전달하면됩니다. 특히 원하는 또는 뒤에 os.O_ 접미사가있는 플래그 (파이썬 설명서 here 목록을 참조하십시오).

예를 들어, 당신은합니다 (open 기능 내장의 모드 매개 변수로 "w"를 사용하여 equiavlent) os.O_WRONLY에 플래그를 설정합니다 이미 "a+"-os.O_WRONLY | os.O_APPEND | os.O_CREAT (상당하는있을 수있는 파일에 추가 할 파일에 쓰기).

그러면이 호출은 정상적인 로컬 파일처럼 사용할 수있는 file 개체를 반환합니다.

2

경우이보다 명확하게 언급되어 있는지 알고 있지만, 여기에 내가이 페이지에서 수집으로부터 정리 무엇을하지 않는 약간의 추가 구글 - 보내고 :

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

이 질문에 대한 답변을 더 많이 설명 할 수 있습니까? – Laurel

관련 문제