[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
제가 작성한 테스트용 서버 요구사항입니다. 이대로 만들어보기로 합니다.- Download 받지만 HDD에 기록하지 않고 바로 버림
- anonymous 블럭, 사용자 설정 계정
- 자세한 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
Flow
간단하게 Flow 를 적어봅니다.- 시작
- temp directory 생성
- ftp 서버 설정
- download 디렉토리를 생성한 temp directory에 저장
- 다운로드 즉시 삭제
Code
몇차례 시행착오 끝에 코드가 완료되었습니다.다운로드 즉시 삭제는 on_file_received 라는 handler가 있어서 쉽게 구현했네요.
로그는 pyftpdlib 가 잘 남겨줘서 굳이 따로 코딩할 필요가 없었습니다.
코드는 pyftpdblackhole 에서 확인하시면 됩니다.
댓글
댓글 쓰기