[펌] http://mintnlatte.tistory.com/407


■ FTP는 다른 서비스와는 달리 Active Mode와 Passive Mode가 존재한다.


- 웹브라우저들은 일반적으로 Passive Mode로 설정되어 있고, 알FTP나 WS-FTP, CuteFTP와 같은 FTP 클라이언트 프로그램들은 일반적으로 Active Mode가 기본값으로 설정되어 있다.



(1) FTP Active Mode의 동작 방식

- 클라이언트에서 서버의 21번 포트로 접속 후 클라이언트가 사용할 두 번째 포트를 서버에 알려준다.

- 서버는 클라이언트로 서버로 부터 Ack를 보내고, 서버의 20번 포트는 클라이언트가 알려준 두 번째 포트로 접속을 시도한다.


○ Active Mode 의 문제점

: 일반적인 TCP/IP의 특징인 ‘클라이언트가 서버에 접속을 시도하는 것’이 아니라 ‘서버가 클라이언에 접속을 시도한다’는 것이다. 이 때문에 만약 클라이언트 PC등에 방화벽이 설치되어 있거나 FTP를 잘 이해하지 못하는 공유기 등을 사용하여 외부에서의 접속을 허용하지 않는다면 세 번째 프로세스가 작동하지 않게 되어 FTP 접속이 제대로 되지 않는 문제점이 있다. 이러한 경우 FTP 접속은 되지만 이후 데이터 목록을 받아오지 못하여 에러가 발생하게 된다.

 

Active Mode는 클라이언트에서 서버측 21번 포트로 접속시도 하고 데이터 포트는 서버에서 클라이언트로 접속하여 데이터를 보내는 방식



(2)  FTP Passive Mode의 동작 방식

○ Active Mode의 문제점을 해결하기 위한 대한으로 디자인된 Passive Mode


- 클라이언트에서  서버의 21번 포트로 접속을 시도하면, 서버에서는 사용할 두번째 포트를 클라이언트에게 알려준다.

- 클라이언트는 다른 포트를 열어 서버가 알려준 이 포트로 접속을 시도한다. 


○ Passive Mode 의 문제점

: Passive 모드에서는 두 번째 data포트로서 Active 모드가 사용했던 20번을 사용하지 않고 대신 1024 이후의 임의의 비 특권 포트를 사용하게 된다. 따라서 Passive 모드는 서버에서 클라이언트로 연결을 시도하는 Active 모드의 문제점을 해결하기는 했지만, 서버의 비 특권포트(1024 ~ 65535)를 방화벽에서 모두 열어 두어야 한다는 또 다른 문제점이 야기되었다.그러나 wu-ftp나 proftpd등 대부분의 ftp 데몬에서는 클라이언트가 Passive Mode로 접속 시 사용할 수 있는 포트를 제한설정 할 수 있는 기능을 지원하므로 이의 문제점을 미봉책이나마 어느 정도는 해결할 수 있다.

 

Passive 모드는 클라이언트에서 서버쪽 21번 포트로 접속 시도 하고 데이터 포트도 클라이언트에서 서버의 임의의 포트로 접속하여 데이터를 받아오는 방식



반응형

원본 : http://wlstnans.tistory.com/101

python 에서의 continue, pass, break 를 정리해보자

for element in some_list: 
    if not element: 
        pass 

for element in some_list: 
    if not element: 
        continue

3문장으로 요약하자면  

1) pass는 단순히 실행할 코드가 없다는 것을 의미한다

2) continue는 다음 순번의 loop를 돌도록 강제하는 것을 의미

3) 이둘은 명백히 다른 구문이다, pass 와는 다르게 continue는 바로 다음 순번의 loop를 돈다


만약 pass 를 타게 되면 A작업은 수행되지만, continue에서는 수행되지 않고 바로 다음 loop 순번으로 돈다.

############################

예제)

for i in [1,2,3]:
        if i:
                print "pass %d" % i
                pass
        print "mjsjinsu pass" # will print after pass


for i in [4,5,6]:
        if i:
                print "pass %d" % i
                continue
        print "mjsjinsu continue"

############################

실행 결과 )

pass 1
mjsjinsu pass
pass 2
mjsjinsu pass
pass 3
mjsjinsu pass
pass 4
pass 5
pass 6


반응형

원본 : http://primrose.tistory.com/37

파이썬으로 FTP서버에 접속하여 여러 작업을 할 때에는 ftplib를 쓰면 편하다.


일단 ftplib을 import 한다


import
ftplib


그 다음엔 FTP서버에 접속을 해야한다. ftplib에서 FTP서버에 접속하게 해 주는 클래스는 FTP클래스로
class ftplib.FTP([host[user[passwd[acct[timeout]]]]])

위와같이 정의되어 있다.

이 중에서 우리가 필요로 하는 것만 설명을 하자면.


host : FTP서버의 IP주소나, 도메인 네임.

user : FTP서버 아이디. 익명으로 접속하려먼 'anonymous' 입력 후 비밀번호를 입력하지 않는다.

passwd : FTP서버의 비밀번호.



이제 위 사항을 기입해서 FTP서버에 접속한다.


import
ftplib

FTP이름 = ftplib.FTP('서버주소','아이디','비밀번호')


무엇인가 잘못 쓴 것이 아니라면 정상적으로 접속이 될 것이다.

접속 된 후에는 ftplib의 함수들을 이용하여 FTP 클라이언트로써의 작업을 수행 할 수 있다.
기본적인 함수들을 소개하자면.

FTP이름.pwd()
: 현재 디렉토리를 보여준다.
FTP이름.cwd(pathname)
: 현재 디렉토리를 바꾼다.

FTP이름.mkd(pathname)
: 현재 디렉토리에 폴더를 만든다.

FTP이름.rmd(pathname)
: 현재 디렉토리의 폴더를 지운다.

FTP이름.size(filename)
: 파일의 크기를 알려준다.
FTP이름.nlst(argument[...])
: FTP서버에서 파일 목록을 가져온다. argument에 아무것도 넣지 않을 경우, 현재 폴더의 파일목록을 가져온다.

FTP이름.retrbinary(commandcallback[maxblocksize[rest]]) 

: FTP서버에서 바이너리모드로 파일을 가져온다.

FTP이름.retrlines(command[callback])

: FTP서버에서 ASCII모드로 파일을 가져온다.

FTP이름.storbinary(commandfile[blocksizecallbackrest])
: FTP서버에 바이너리모드로 파일을 전송한다.
FTP이름.storlines(commandfile[callback])
: FTP서버에 ASCII모드로 파일을 전송한다.
FTP이름.quit()
: FTP서버와의 접속을 끊는다. 에러 발생시엔 FTP이름.close()를 쓴다.



이제 기본적인 함수들을 알았으니 FTP서버에 파일을 전송하는 방법에 대해 설명하겠다.


파일 전송에는 2가지 모드가 있다. 바이너리 모드와 ASCII모드다.


바이너리 모드는 사람이 읽을 수 있는 텍스트 형식의 파일을 제외한 파일들을 전송할 때 쓰고, ASCII모드는 사람이 읽을 수 있는 파일을 전송할 때 쓴다.


일단 바이너리 모드로 파일을 전송해보자. 바이너리 모드로 파일을 전송할 때에는 storbinary 함수에 'STOR' 명령어와 'rb' 모드로 열은 파일 핸들러를 매개변수로 넣어줘야 한다.


import ftplib
FTP이름 = ftplib.FTP('서버주소','아이디','비밀번호')

FTP이름.storbinary( 'STOR' , open('파일이름','rb') )
#'파일이름'은 자기가 전송하려는 파일의 이름

위와같이 하면 FTP서버 내의 현재 디렉토리에 파일이 전송된다.

ASCII모드로 파일을 전송하는 것도 위와 비슷하다. 단지 파일을 여는 방법을 달리해야한다.

import ftplib

FTP이름 = ftplib.FTP('서버주소','아이디','비밀번호')

FTP이름.storlines( 'STOR' , open('파일이름','r') )
#'파일이름'은 자기가 전송하려는 파일의 이름

파일 핸들러를 'r' 모드로 열어서 storlines 함수에 넘겨주면 ASCII모드로 파일이 전송된다.


반응형

+ Recent posts