2010-12-04 5 views
3

이것은 내 첫 번째 게시물이기 때문에 커뮤니티의 일원이되어 기쁘게 생각합니다. 나는 상당히 평범한 질문을하지만, 대답을 찾기를 희망하므로 상당히 성가신 문제였습니다.Python의 FTP 라이브러리를 사용하여 파일을 검색합니다.

그래서 파이썬의 FTPLIB 모듈을 사용하여 이진 파일을 검색하려고합니다.

코드는 인터프리터에 직접 입력이처럼 보였다 :

>>> from ftplib import FTP 

>>> ftp = FTP('xxx.xx.xx.x') # IP of target device 

>>> ftp.login() 

>>> file = "foobar.xyz" # target file 

>>> ftp.retrbinary("RETR " + file, open('filez.txt', 'wb').write) 

특정 기능 (나는, 장치의 모든 파일을 볼 FTP 서버 응용 프로그램에서 환영 메시지를 얻을, 심지어는 이름을 바꿀 수 있습니다 작업하는 동안 나는 위의 마지막 명령을 실행하려고 할 때이 FTPLIB의 소스를 통해 검토 한하지만 일반적으로 수학에 대한 파이썬을 사용할 때 작업의 이러한 종류의 내 프로그래밍 경험이 꽤 제한되어

error_perm        Traceback (most recent call last) 

/Users/user_name/<ipython console> in <module>() 

/opt/local/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/ftplib.pyc in retrlines(self, cmd, callback) 
    419   if callback is None: callback = print_line 
    420   resp = self.sendcmd('TYPE A') 
--> 421   conn = self.transfercmd(cmd) 
    422   fp = conn.makefile('rb') 
    423   while 1: 

/opt/local/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/ftplib.pyc in transfercmd(self, cmd, rest) 
    358  def transfercmd(self, cmd, rest=None): 
    359   """Like ntransfercmd() but returns only the socket.""" 
--> 360   return self.ntransfercmd(cmd, rest)[0] 
    361 
    362  def login(self, user = '', passwd = '', acct = ''): 

/opt/local/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/ftplib.pyc in ntransfercmd(self, cmd, rest) 
    327    if rest is not None: 
    328     self.sendcmd("REST %s" % rest) 
--> 329    resp = self.sendcmd(cmd) 
    330    # Some servers apparently send a 200 reply to 

    331    # a LIST or STOR command, before the 150 reply 


/opt/local/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/ftplib.pyc in sendcmd(self, cmd) 
    241   '''Send a command and return the response.''' 
    242   self.putcmd(cmd) 
--> 243   return self.getresp() 
    244 
    245  def voidcmd(self, cmd): 

/opt/local/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/ftplib.pyc in getresp(self) 
    216    raise error_temp, resp 
    217   if c == '5': 
--> 218    raise error_perm, resp 
    219   raise error_proto, resp 
    220 

error_perm: 502 Command not implemented. 

파일), 내가 얻을 그리고 wi를 일하지 않아도 돼. 전에 FTP를.

누군가 솔루션에 대한 아이디어를 줄 수 있다면 큰 도움이 될 것입니다. 또는 다른 언어로 다른 솔루션 경로를 제안 할 수 있다면 동등하게 도움이됩니다.

답변

8

익명으로 로그인하고있는 것 같습니다 (사용자 이름/암호가 ftp.login()에 지정되어 있지 않음) 권한 오류가 발생합니다.

ftp.login(user='foo', passwd='bar') 

대신 로그인 해보십시오. 편집

: 여기는 (오류 처리하지 않고, 단순한) FTPLIB를 사용하는 간단한 예입니다

#!/usr/bin/env python 

from ftplib import FTP 

HOST = "localhost" 
UNAME = "foo" 
PASSWD = "bar" 
DIR = "pub" 
FILE = "test.test" 

def download_cb(block): 
    file.write(block) 

ftp = FTP(HOST) 
ftp.login(user=UNAME, passwd=PASSWD) 
ftp.cwd(DIR) 

file = open(FILE, "wb") 
ftp.retrbinary("RETR " + FILE, download_cb) 
file.close() 
ftp.close() 

참고 : 경우 retrbinary에서이 작동하지 않습니다, 당신은 또한 바이너리 설정을 시도 할 수 있습니다 모드를 명시 적으로 ftp.sendcmd("TYPE I")으로 호출하십시오. 이것은 전형적인 것이 아니지만 일부 이국적인 ftp 서버에서 도움이 될 수 있습니다.

+0

또는 wget을 사용할 수 있습니다. –

+0

실제로는 그렇지 않았습니다. 기본 익명 인수가 허용되었습니다. 사용자 이름/비밀번호 거부가 있었다면, 예를 들어 기기의 파일 이름을 바꿀 수 없었을 것입니다. 그러나 나는했다. 문제는 파일을 검색하려고했을 때 발생했습니다. – mbm

+0

@mbm - "RETR"과 파일 이름 사이에 공백이 필요합니다. 이처럼 단순한 경우에'urllib.urlretrieve '를 사용하는 것이 더 쉽습니다 (어쨌든, i.m.o.). (편집 : 너는 이미 공간이 있다는 것을 깨달았다.) –

1

사례가 정말 간단하다면 ftplib modlue를 사용할 필요가 없습니다. urllib.urlretrieve은 필요한 것을 처리 할 것입니다. 예 :

import urllib 
urllib.urlretrieve('ftp://xxx.xx.xx.x/foobar.xyz', filename='filez.txt') 

주 :이 ... 그런데 파이썬 3.x의에서 urllib.request.urlretrieve 될 것

와 FTP 서버에서 익명이 아닌 경우, 당신은 단지에 사용자 이름과 암호를 지정

URL 문자열 (예 : ftp://user:[email protected]/path/to/file). 물론 ftp 프로토콜은 일반 텍스트로 암호를 보내며 사용자 이름과 암호를 스크립트에 저장하므로 여러 가지 이유로 안전하지는 않지만 사용하는 라이브러리에 관계없이 적용됩니다.

0

나를 위해 잘 작동 (. 내가 데비안 FTP 서버로 테스트 한) 다른 서버로 시도 :

FTP = FTP ('xx.xx.xx.xx') '

ftp.login()

'230 로그인에 성공했습니다.'

파일 = "robots.txt에"

ftp.retrlines ("RETR"+ 파일을 엽니 다 ('filez.txt ','WB '). 쓰기)

'(226) 파일 확인을 보내 . '

관련 문제