왕초보를 위한 Python 2.7
12. 인터넷
12.3. FTP
12.2. FTP 클라이언트
(쓴 날:2001-09-03)
인터넷에 관련된 주제 가운데 메일 다음으로 만만해 보이는 것을 찾아보았더니 FTP가 있더군요.
그래서 이번엔 FTP에 대해 알아보도록 하겠습니다.
FTP가 무엇인지 잘 모르시는 분께서 막연히 어려워하실까봐 미루긴 했지만 어쩌면 메일보다 더 쉬울 것 같기도 하네요. *^^*
FTP라는 것은 File Transfer Protocol의 약어로 우리말로는 파일 전송 규약입니다.
자꾸 프로토콜(protocol, 규약)이라는 용어가 등장하는데, 그냥 규약이라고만 하니까 왠지 막연하게 느껴지죠?
프로토콜이라는 것은 컴퓨터끼리 통신을 할 때 지켜야할 약속을 미리 정해둔 것입니다.
지금 쓰고 계시는 웹브라우저의 주소 표시줄을 한 번 보세요.
http://www.vex.net/parnassus/
현재 방문한 웹사이트의 주소가 이런 식으로 표시되는데, 맨 앞 부분에는 http://라고 되어있지요?
이 부분이 바로 우리 컴퓨터와 우리가 방문한 웹사이트의 컴퓨터 간에 의사소통을 하는 방법을 나타내고 있구요, www.vex.net이라는 사이트가 HTTP 방식으로 서비스를 제공한다는 것을 알 수 있습니다.
HTTP는 Hypertext Transfer Protocol(하이퍼텍스트 전송 프로토콜)의 약어로, 웹 문서와 같은 하이퍼 텍스트 문서를 전송하기 좋게 정해진 규약이지요.
그럼 FTP는 어떨까요?
FTP는 파일 전송 규약이라고 했으니까, 파일을 전송하기 좋은 방식으로 정해졌겠죠?
HTTP로도 파일을 전송할 수 있기 때문에 요즘엔 웹 상으로 파일을 주고 받는 일이 많지만, 파일의 크기가 크거나 여러 개의 파일을 주고받을 때는 역시 FTP를 이용하는 것이 편리합니다.
저는 홈페이지를 관리할 때 주로 FTP를 이용하구요, 가끔 FTP 사이트에서 프로그램이나 자료를 얻을 때도 이용하지요.
메일을 주고받기 위해 메일 프로그램을 사용하듯이 FTP를 이용할 때도 프로그램을 쓰는데, 보통 알FTP, WS_FTP와 같은 것들을 많이 사용하구요, Windows에도 텍스트 환경의 간단한 FTP 프로그램이 포함되어있기도 합니다.
다 알고 계시는 분들께는 좀 지루했나요?
그럼 시작해볼까요? R U ready~?
인터프리터를 띄워주세요.
FTP를 지원해주는 모듈은 ftplib입니다. 이젠 제가 말씀 안 드려도 알아서 import부터 하시죠?
>>> import ftplib
둠이라는 유명한 게임을 만든 id 소프트웨어를 방문해봅시다.
제가 아는 FTP 사이트가 별로 없어서 알FTP 프로그램에 나와있는 주소로 정했습니다.^^
>>> idsoft = ftplib.FTP('ftp.idsoftware.com')
메일 프로그램 만들 때 SMTP나 POP 서버에 접속했던 방법과 똑같죠?
ftp.idsoftware.com에 접속해서 idsoft라는 이름을 주었습니다.
알고보면 FTP라는 클래스의 객체를 만든 셈이기도 하구요.
FTP 사이트 중에는 ID와 비밀번호를 넣어야 서비스를 이용할 수 있는 곳도 있지만, 이곳은 anonymous(어나니머스, 익명) 사용자에게도 서비스를 제공하므로 ID 없이 그냥 들어갈 수 있습니다.
그러므로 아래와 같이 형식적으로 로그인해주시면 됩니다.
>>> idsoft.login()
'230 User logged in, proceed.'
혹시 421 Too many users - please try again later.라는 에러메시지가 나온다면 접속자가 너무 많아서 그런 것이니 잠시 후에 방문해주시구요.
이제 이곳에 어떤 자료가 있나 둘러봅시다.
>>> idsoft.dir()
drw-rw-rw- 1 user group 0 Apr 16 11:38 .
drw-rw-rw- 1 user group 0 Apr 16 11:38 ..
drw-rw-rw- 1 user group 0 Nov 22 2000 idstuff
위와 같이 dir() 메쏘드를 쓰면 서버가 어떤 디렉토리 구조로 되어있는지 알 수 있습니다.
DOS에서 DIR 명령을 내리는 것과 마찬가지라고 생각하시면 되지요.
dir()을 한 결과는 유닉스나 리눅스에서 사용하는 방식으로 표시되는군요.
왼쪽부터 파일의 허가권 모드, 하드링크 계수, 파일 소유자의 사용자 id, 파일의 그룹 id, 파일의 바이트 단위 크기, 파일이 마지막으로 변경된 시각, 파일 이름을 나타낸다고 합니다.
잘 모르시는 것들은 크게 신경쓰실 필요가 없을 것 같구요, 허가권 모드 부분에서 첫글자로 ‘d’가 나오면 디렉토리를 의미한다는 것만 알아두세요.
따라서 여기에는 (.)점 한 개, (..)점 두 개, idstuff, 이렇게 세 디렉토리가 있다는 것을 알 수 있습니다.
점 한 개는 현재 디렉토리를, 점 두 개는 상위 디렉토리를 뜻한답니다.
결국 실제로 현재 디렉토리에 들어 있는 것은 idstuff라는 하위 디렉토리 하나 뿐이로군요.
그렇다면 idstuff로 들어가봐야겠죠?
>>> idsoft.cwd('idstuff')
'250 Directory changed to /idstuff'
디렉토리의 이동은 위와 같이 cwd()를 쓰시면 됩니다. DOS의 CD 명령과 같죠?
여기에서 다시 dir() 해보시면 doom 디렉토리가 있을 겁니다.
그곳으로 이동하신 후에 다시 ‘win95’ 디렉토리로 이동해주세요.
드디어 파일이 두 개 나타났습니다!
…
나타났죠? ^^;
>>> idsoft.dir()
drw-rw-rw- 1 user group 0 Jun 22 1999 .
drw-rw-rw- 1 user group 0 Jun 22 1999 ..
-rw-rw-rw- 1 user group 444 Oct 14 1996 doom95.txt
-rw-rw-rw- 1 user group 4459049 Oct 14 1996 doom95.zip
눈치로 보아하니 하나는 이 게임에 대한 설명이 있는 텍스트 파일이고, 하나는 게임의 설치 프로그램이 있는 이진(binary, 바이너리) 파일인 것 같군요.
눈치 하나로 먹고 사는 우리네… ^^;
텍스트 파일이란 것은 다들 아시는 대로 파일 내용이 글자로 이루어져있는 파일이구요, 이진 파일이라는 것은 우리가 읽을 수 있는 글자는 아니지만 나름대로 쓸모있는 데이터가 들어있는 파일입니다.
이런 말씀을 드리는 것은 FTP에서 텍스트 파일과 이진 파일을 구분하고 있기 때문이지요.
파이썬의 ftplib에서도 역시 이 두 가지의 파일을 다루는 방법을 각각 제공합니다.
텍스트 파일을 얻을 때는 retrlines를, 이진 파일을 얻을 때는 retrbinary를 쓰시면 되지요.
>>> idsoft.retrlines('RETR doom95.txt', open('doom95.txt', 'w').write)
'226 Transfer complete.'
>>> idsoft.retrbinary('RETR doom95.zip', open('doom95.zip', 'wb').write)
'226 Transfer complete.'
open() 함수는 낯익으시죠? ‘w’가 쓰기 모드를 의미한다는 것두요.
‘wb’ 모드는 처음 보셨을텐데, 이것은 이진 파일을 쓰기모드로 열 때 사용합니다.
이렇게 해서 ID소프트에 있는 파일들을 인터넷을 통해 우리 컴퓨터로 복사해보았습니다.
이 파일들은 파이썬이 실행되고 있는 디렉토리에 저장되어 있을 거예요.
이제 id 소프트웨어와 작별인사를 할 시간입니다. 안~녕~~~
>>> idsoft.quit()
'221 Goodbye!'
지금까지 잘 따라오셨나요?
아직 421 Connection timed out - closing.이라는 에러메시지를 못 보신 분이라면 아주 이해가 빠르시거나, 별 생각없이 예제를 따라하신 건지도 몰라요.
FTP 사이트들은 사용자가 접속해서 아무 일도 하고 있지 않으면 곧 연결을 끊어버리기 때문에 그런 메시지가 나오거든요.
자, 연결이 끊어진 분은 처음부터 다시~!
아차, 그러고보니 파일을 업로드하는 방법도 알아봐야겠군요.
id 소프트웨어에는 파일을 올릴 수 있는 권한이 없으니 다른 곳을 찾아볼까요?
여러분께서 가입하신 사이트 중에서 개인 홈페이지 계정을 주는 곳이 있을 거예요.
그런 곳에서는 FTP도 제공할 테니까 해당 사이트의 도움말에서 FTP 주소를 찾아보세요.
저는 네띠앙을 사용하는데, 주소가 ‘ftp.netian.com’이더군요.
그러면 아까 해본 것처럼 접속하시구요, 로그인은 다음과 같이 하시면 됩니다.
>>> netian.login('id', 'password')
파일을 받을 때와 마찬가지로 업로드할 때도 텍스트 파일과 이진 파일을 구분합니다.
텍스트는 storlines, 이진 파일은 storbinary를 사용하지요.
>>> netian.storbinary('stor py.ico', open('py.ico'))
'226 Transfer complete.'
저장하는 것이 좀 더 간단하네요.
파일을 지우는 것도 간단히 할 수 있구요.
>>> netian.delete('py.ico')
'250 DELE command successful.'
이렇게 해서 FTP에 대해서 대충 훑어보았는데, 생각보다 간단하지요?
둠 게임을 하다보니 첫번째 방에서 어떻게 나가는지 모르겠네요.
아는 분은 좀 알려주셔요~.