[WSL] Python으로 테스트용 FTP server 운영

잡설

테스트용으로 email을 받아서 바로 버려버리는 python 스크립트를 작성해서 잘 써먹고 있었는데, 이번에는 ftp 서버 스크립트를 작성해서 로그만 남기고 바로 버리는 스크립트를 만들어볼까합니다.

pyftpdlib

일단 구글링을 통해 pyftpdlib 를 사용하면 된다는 것을 알게되었습니다. 곧바로 실행해봅니다.

설치

pip3로 설치합니다. 별거없죠?
$ sudo pip3 install pyftpdlib

The directory '/home/shaun289/.cache/pip/http' or its parent directory is not owned by the current user and the cache has been disabled. Please check the permissions and owner of that directory. If executing pip with sudo, you may want sudo's -H flag.

The directory '/home/shaun289/.cache/pip' or its parent directory is not owned by the current user and caching wheels has been disabled. check the permissions and owner of that directory. If executing pip with sudo, you may want sudo's -H flag.

Collecting pyftpdlib

  Downloading https://files.pythonhosted.org/packages/31/61/63ef60aca6de07eba1639d9d47f3f8e29462e8bb49d6a8dce9aeff240646/pyftpdlib-1.5.6.tar.gz (188kB)

    100% |████████████████████████████████| 194kB 397kB/s

Installing collected packages: pyftpdlib

  Running setup.py install for pyftpdlib ... done

Successfully installed pyftpdlib-1.5.6

바로 실행해봅니다.

$ python3 -m pyftpdlib 2121

anonymous로 잘 동작합니다만, upload가 안됩니다.

Requirement

제가 작성한 테스트용 서버 요구사항입니다.  이대로 만들어보기로 합니다.
  1. Download 받지만 HDD에 기록하지 않고 바로 버림
  2. anonymous 블럭, 사용자 설정 계정
  3. 자세한 Log 남김

Base code

먼저 관련 자료를 찾아봅니다. pyftpd tutorial 을 찾았습니다. 매우 잘 되어있네요. WSL이 어쨌든 Linux이니 Unix FTP Server 코드를 사용해보니 잘 됩니다. 이를 기반으로 조금씩 수정해나가봅니다.

Download 받지만 HDD에 기록하지 않고 바로 버림

첫번째 조건에서 가장 중요한 것은 HDD에 기록하지 않는겁니다. HDD 에 굳이 기록했다 지워서 HDD의 수명을 단축시키기 싫은거죠.
pyftpd 에서 방법을 찾아보았지만 못찾았습니다. 있을법도 한데 시간 투자가 아까우니 일단 포기.
/dev/null 과 같은 디렉토리를 쓸 방법이 있나? 찾아보았는데 blackhole directory 로 이슈도 있고 nullfs 를 작성하고 mount 하는 코드도 공개되어있네요. 하지만 python 코드 내에서 모든걸 해결하고 싶어서 포기.
temp 디렉토리를 만들어서 거기에 쓰고 바로 지우라는 조언도 있네요. 올?ㅋ 이 방법이 땡깁니다.

mktemp

일단 쉘에서 실행해보니 다음과 같이 생성됩니다.

$ mktemp -d
/tmp/tmp.RIN3kUuWWr

왠지 python에서 지원할것 같아서 찾아보니 있네요.

tempfile — Generate temporary files and directories

그럼 준비 다 된거죠! 코딩만 하면 됩니다.

Flow

간단하게 Flow 를 적어봅니다.


  1. 시작
  2. temp directory 생성
  3. ftp 서버 설정
    1. download 디렉토리를 생성한 temp directory에 저장
  4. 다운로드 즉시 삭제

Code

몇차례 시행착오 끝에 코드가 완료되었습니다.
다운로드 즉시 삭제는 on_file_received 라는 handler가 있어서 쉽게 구현했네요.
로그는 pyftpdlib 가 잘 남겨줘서 굳이 따로 코딩할 필요가 없었습니다.

코드는 pyftpdblackhole 에서 확인하시면 됩니다.

여담

굳이 temp directory에 저장하고 삭제하는 낭비를 하지 않고 그대로 날려버리고 싶은데 귀찮기도 하고 테스트 서버라서 시스템 성능을 요구하는것도 아니라 쉽게 가기로 했습니다.


댓글

이 블로그의 인기 게시물

WSL2 Ubuntu 20.04 및 네트워크 설정

리눅스 멀티코어를 사용하는 tar 압축/해제

git pull 을 했더니 branch가 갈라지는 경우