🗃️

ftplibでFTPサーバをPythonで作る

2022/02/19に公開1

概要

ftplibで簡単にPythonでサーバを建てられるので、やり方を説明します。

準備

pyftpdlibをpipにてインストールします。

pip install pyftpdlib

ソースコード

main.py
import pyftpdlib.authorizers
import pyftpdlib.handlers
import pyftpdlib.servers

from pyftpdlib.handlers import FTPHandler

class Handler(FTPHandler):
    def on_file_sent(self, file):
        print("send file!",file)
        #super(Handler, self).ftp_RETR(file)
    def on_file_received(self, file):
        print("received file!",file)
        #super(Handler, self).ftp_RETR(file)

authorizer = pyftpdlib.authorizers.DummyAuthorizer()
authorizer.add_user('user', 'password', '/root/ftp1', perm='elradfmw')
handler = Handler
print(handler.passive_ports)
handler.authorizer = authorizer
server = pyftpdlib.servers.FTPServer(("127.0.0.1", 21), handler)
server.serve_forever()

Port番号などの設定

pyftpdlib.servers.FTPServer(("127.0.0.1", 21), handler)などの行で待ち受けるPort番号などが設定できます。この場合は、21番ポートで待ち受けています。
その他に、FTPではpassive_portという設定も存在し、これは待受ポートで要求を受けたあと、ファイルのやり取りは別のポートで行う設定になります。
この設定はFTPHandler.passive_portsなどで設定可能です。

他にもタイムアウト時間の設定などがFTPHandlerで可能なようです。
https://pyftpdlib.readthedocs.io/en/latest/api.html#pyftpdlib.handlers.FTPHandler

ファイルを取得した場合などの処理を記載したい場合

FTPHandlerというクラスを継承して関数を上書きすることにより実装するようです。
上記の例ではon_file_sent(self, file):on_file_received(self, file):を上書きして処理を追加しています。
その他にもログインなど、いろいろな処理を追記できるようです。

https://pyftpdlib.readthedocs.io/en/latest/tutorial.html#event-callbacks

感想

標準的にサポートされていると色々楽ですね。

Discussion

hashitohashito

申し訳ございません。
pyftpdlibは標準で利用できないためインストールする必要がありました。
修正をさせていただきましたので、よろしくお願いいたします。