Symfoware

Symfowareについての考察blog

Python + pyftpdlibでカスタムFTPサーバーを作成1 起動とユーザー認証

JavaでFTPサーバーを実装してみました。
Java + MockFtpServerでFTPサーバー側のプログラムを作成する その1

調べてみるとPython製のFTPサーバーがあるようです。
pyftpdlib

こちらでもJavaで行ったことと同様の内容を試してみます。


準備



今回、pipやeasy_installでのインストールは行わず、
プログラムと同じ階層にライブラリを配置して動作させてみます。

pyftpdlib
こちらからファイル一式を取得します。

最低限必要なのは、pyftpdlibフォルダの中身だけです。
これから作成するプログラムと同じ階層にフォルダごとコピーしておきます。



簡単なサンプル



10021ポートで起動し、
id:user,pass:12345
id:anonymous
という2つのユーザーを追加します。

building-a-base-ftp-server
こちらのサンプルが参考になりました。


  1. # -*- coding:utf-8 -*-
  2. from pyftpdlib.authorizers import DummyAuthorizer
  3. from pyftpdlib.handlers import FTPHandler
  4. from pyftpdlib.servers import FTPServer
  5. def main():
  6.     
  7.     # 認証用のオブジェクトを作成
  8.     authorizer = DummyAuthorizer()
  9.     # id:user,pass:12345というユーザーを作成 操作権限(perm)は全て与える
  10.     authorizer.add_user('user', '12345', '.', perm='elradfmwM')
  11.     # anonymousユーザーを作成
  12.     authorizer.add_anonymous('.')
  13.     # FTP通信のハンドラーを作成 ユーザー認証オブジェクトを設定する
  14.     handler = FTPHandler
  15.     handler.authorizer = authorizer
  16.     # 接続時に表示される文字列指定
  17.     handler.banner = "pyftpdlib based ftpd ready."
  18.     # ftpサーバーのポートを指定
  19.     address = ('localhost', 10021)
  20.     server = FTPServer(address, handler)
  21.     # サーバー起動
  22.     server.serve_forever()
  23. if __name__ == '__main__':
  24.     main()




プログラムを起動後、適当なFTPクライアントから接続してみます。
プログラムを実行しているフォルダの内容が公開されました。

526_01.png



独自のユーザー認証機構



独自のユーザー認証を行うクラスを作成してみます。
ユーザー名「symfo」、パスワード「pass」の場合接続を許可します。


  1. # -*- coding:utf-8 -*-
  2. from pyftpdlib.authorizers import DummyAuthorizer
  3. from pyftpdlib.authorizers import AuthenticationFailed
  4. from pyftpdlib.handlers import FTPHandler
  5. from pyftpdlib.servers import FTPServer
  6. class MyAuthorizer(object):
  7.     
  8.     # ユーザー名、パスワードで認証
  9.     def validate_authentication(self, username, password, handler):
  10.         
  11.         msg = "Authentication failed."
  12.         if username != 'symfo':
  13.             raise AuthenticationFailed(msg)
  14.         
  15.         if password != 'pass':
  16.             raise AuthenticationFailed(msg)
  17.     
  18.     # ユーザーのホームディレクトリを返す
  19.     def get_home_dir(self, username):
  20.         import os
  21.         homedir = '.'
  22.         return os.path.realpath(homedir).decode('utf8')
  23.     
  24.     # アクセス権限チェック
  25.     def has_perm(self, username, perm, path=None):
  26.         return 'elr'
  27.     
  28.     def get_perms(self, username):
  29.         return 'elr'
  30.     
  31.     # ログイン時に表示するメッセージ
  32.     def get_msg_login(self, username):
  33.         return 'Login successful.'
  34.     
  35.     # ログアウト時に表示するメッセージ
  36.     def get_msg_quit(self, username):
  37.         return 'Goodbye.'
  38.         
  39.     # ファイルにアクセスする前のフック
  40.     def impersonate_user(self, username, password):
  41.         pass
  42.     
  43.     # ファイルにアクセスした後のフック
  44.     def terminate_impersonation(self, username):
  45.         pass
  46.         
  47. def main():
  48.     
  49.     # 認証用のオブジェクトを作成
  50.     #authorizer = DummyAuthorizer()
  51.     authorizer = MyAuthorizer()
  52.     
  53.     # id:user,pass:12345というユーザーを作成 操作権限(perm)は全て与える
  54.     #authorizer.add_user('user', '12345', '.', perm='elradfmwM')
  55.     # anonymousユーザーを作成
  56.     #authorizer.add_anonymous('.')
  57.     # FTP通信のハンドラーを作成 ユーザー認証オブジェクトを設定する
  58.     handler = FTPHandler
  59.     handler.authorizer = authorizer
  60.     # 接続時に表示される文字列指定
  61.     handler.banner = "pyftpdlib based ftpd ready."
  62.     # ftpサーバーのポートを指定
  63.     address = ('localhost', 10021)
  64.     server = FTPServer(address, handler)
  65.     # サーバー起動
  66.     server.serve_forever()
  67. if __name__ == '__main__':
  68.     main()




固定で認証処理を記載している箇所を、テキストやデータベースを
読み込むように変更すれば、独自の認証機構を作成できそうです。

なんとなく使い方がわかってきました。
関連記事

テーマ:プログラミング - ジャンル:コンピュータ

  1. 2015/01/17(土) 21:18:53|
  2. Python
  3. | トラックバック:0
  4. | コメント:0
  5. | 編集
<<Python + pyftpdlibでカスタムFTPサーバーを作成2 ディレクトリの表示 | ホーム | Java + MockFtpServerでFTPサーバー側のプログラムを作成する その3>>

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック

トラックバック URL
http://symfoware.blog68.fc2.com/tb.php/1583-8f5958ed
この記事にトラックバックする(FC2ブログユーザー)