ホームページ >バックエンド開発 >Python チュートリアル >Python で FTP サーバー サービスを実装する方法 (コレクション)
この記事では主にPythonでFTPサーバーを実装する方法を紹介しますので、参考にしてください。エディターをフォローして見てみましょう
FTP サービスのアクティブ モードとパッシブ モード
始める前に、FTP のアクティブ モードとパッシブ モードについて説明しましょう。この 2 つの違いは 2 つで表すことができます。明確にするために:
アクティブ モード:
アクティブ モードの動作プロセス:
1. クライアントは、ランダムな非特権ポート N を使用してサーバー ポート 21 への接続を開始します。 1024
2 より大きい場合、クライアントは N+1 ポートでリッスンを開始します。サーバーはポート 20 を介してクライアントの N+1 ポートに接続します。
アクティブ モードの利点:サーバー構成がシンプルであるため、サーバーはポート 21 を開くだけで済みます
アクティブ モードの欠点:クライアントがオンになっている場合。ファイアウォール、またはクライアントがネットワーク内 (NAT ゲートウェイの後) にある場合、サーバーによってクライアント ポートへの接続が失敗する可能性があります。
パッシブ モード:
パッシブ モードの動作プロセス:
1。ランダムな非特権ポートを使用してサーバーのポート 21 に接続します
2. サーバーは非特権ポートをパッシブ ポートとして開き、それをクライアントに返します
3. クライアントは、非特権ポートを使用してサーバーのパッシブ ポートにアクティブに接続します。 + 1 ポート
パッシブ モードの欠点:
サーバーの設定 管理がやや複雑で、セキュリティに役立ちません。そのため、ほとんどの FTP サービス ソフトウェアは、クライアントが接続できるように、ランダムな高レベルのポートを開く必要があります。パッシブポートの範囲
パッシブモードの利点: クライアントネットワーク環境の要件がありません
FTPについて学んだ後、Pythonを使用してFTPサービスを実装し始めました
準備今回はPythonバージョンを使用しました: python 3.4.3
モジュールpyftpdlibをインストールします
pip3 install pyftpdlib
コード
は簡単なローカル検証を実装します
from pyftpdlib.authorizers import DummyAuthorizer from pyftpdlib.handlers import FTPHandler from pyftpdlib.servers import FTPServer #实例化虚拟用户,这是FTP验证首要条件 authorizer = DummyAuthorizer() #添加用户权限和路径,括号内的参数是(用户名, 密码, 用户目录, 权限) authorizer.add_user('user', '12345', '/home/', perm='elradfmw') #添加匿名用户 只需要路径 authorizer.add_anonymous('/home/huangxm') #初始化ftp句柄 handler = FTPHandler handler.authorizer = authorizer #监听ip 和 端口,因为linux里非root用户无法使用21端口,所以我使用了2121端口 server = FTPServer(('192.168.0.108', 2121), handler) #开始服务 server.serve_forever()
$python FtpServer。 py
テストしてください:
間違ったパスワードを入力してみてください:
認証に失敗し、ログインできません。
しかし、これはアクティブモードのFTPのようですが、パッシブモードを実装するにはどうすればよいですか?
次のコードを使用してパッシブ ポートを追加します:handler.passive_ports = range(2000, 2333)
完全なコード:
from pyftpdlib.authorizers import DummyAuthorizer from pyftpdlib.handlers import FTPHandler from pyftpdlib.servers import FTPServer #实例化虚拟用户,这是FTP验证首要条件 authorizer = DummyAuthorizer() #添加用户权限和路径,括号内的参数是(用户名, 密码, 用户目录, 权限) authorizer.add_user('user', '12345', '/home/', perm='elradfmw') #添加匿名用户 只需要路径 authorizer.add_anonymous('/home/huangxm') #初始化ftp句柄 handler = FTPHandler handler.authorizer = authorizer #添加被动端口范围 handler.passive_ports = range(2000, 2333) #监听ip 和 端口 server = FTPServer(('192.168.0.108', 2121), handler) #开始服务 server.serve_forever()
$ python FtpServer.py [I 2017-01-11 15:18:37] >>> starting FTP server on 192.168.0.108:2121, pid=46296 <<< [I 2017-01-11 15:18:37] concurrency model: async [I 2017-01-11 15:18:37] masquerade (NAT) address: None [I 2017-01-11 15:18:37] passive ports: 2000->2332
上記の実践により、FTP サーバーはすでに正常に動作できますが、多数の FTP ユーザーが必要な場合はどうすればよいでしょうか? 各ユーザーが 1 回ずつ作成する必要がありますか?
実際、ユーザー ファイル user.py を定義できます
#用户名 密码 权限 目录 # root 12345 elradfmwM /home huangxm 12345 elradfmwM /home
完全なコード:
from pyftpdlib.authorizers import DummyAuthorizer from pyftpdlib.handlers import FTPHandler from pyftpdlib.servers import FTPServer def get_user(userfile): #定义一个用户列表 user_list = [] with open(userfile) as f: for line in f: print(len(line.split())) if not line.startswith('#') and line: if len(line.split()) == 4: user_list.append(line.split()) else: print("user.conf配置错误") return user_list #实例化虚拟用户,这是FTP验证首要条件 authorizer = DummyAuthorizer() #添加用户权限和路径,括号内的参数是(用户名, 密码, 用户目录, 权限) #authorizer.add_user('user', '12345', '/home/', perm='elradfmw') user_list = get_user('/home/huangxm/test_py/FtpServer/user.conf') for user in user_list: name, passwd, permit, homedir = user try: authorizer.add_user(name, passwd, homedir, perm=permit) except Exception as e: print(e) #添加匿名用户 只需要路径 authorizer.add_anonymous('/home/huangxm') #初始化ftp句柄 handler = FTPHandler handler.authorizer = authorizer #添加被动端口范围 handler.passive_ports = range(2000, 2333) #监听ip 和 端口 server = FTPServer(('192.168.0.108', 2121), handler) #开始服务 server.serve_forever()
まず、settings.pyとuser.pyを保存するためのconfディレクトリを作成します
ディレクトリ構造(キャッシュについては心配しないでください):
setting.py
ip = '0.0.0.0' port = '2121' #上传速度 300kb/s max_upload = 300 * 1024 #下载速度 300kb/s max_download = 300 * 1024 #最大连接数 max_cons = 150 #最多IP数 max_per_ip = 10 #被动端口范围,注意被动端口数量要比最大IP数多,否则可能出现无法连接的情况 passive_ports = (2000, 2200) #是否开启匿名访问 on|off enable_anonymous = 'off' #匿名用户目录 anonymous_path = '/home/huangxm' #是否开启日志 on|off enable_logging = 'off' #日志文件 loging_name = 'pyftp.log' #欢迎信息 welcome_msg = 'Welcome to my ftp'
#用户名 密码 权限 目录 #root 12345 elradfmwM /home/ huangxm 12345 elradfmwM /home/ test 12345 elradfmwM /home/huangxm
from pyftpdlib.authorizers import DummyAuthorizer from pyftpdlib.handlers import FTPHandler, ThrottledDTPHandler from pyftpdlib.servers import FTPServer from conf import settings import logging def get_user(userfile): #定义一个用户列表 user_list = [] with open(userfile) as f: for line in f: if not line.startswith('#') and line: if len(line.split()) == 4: user_list.append(line.split()) else: print("user.conf配置错误") return user_list def ftp_server(): #实例化虚拟用户,这是FTP验证首要条件 authorizer = DummyAuthorizer() #添加用户权限和路径,括号内的参数是(用户名, 密码, 用户目录, 权限) #authorizer.add_user('user', '12345', '/home/', perm='elradfmw') user_list = get_user('conf/user.py') for user in user_list: name, passwd, permit, homedir = user try: authorizer.add_user(name, passwd, homedir, perm=permit) except Exception as e: print(e) #添加匿名用户 只需要路径 if settings.enable_anonymous == 'on': authorizer.add_anonymous(settings.anonymous_path) #下载上传速度设置 dtp_handler = ThrottledDTPHandler dtp_handler.read_limit = settings.max_download dtp_handler.write_limit = settings.max_upload #初始化ftp句柄 handler = FTPHandler handler.authorizer = authorizer #日志记录 if settings.enable_logging == 'on': logging.basicConfig(filename=settings.loging_name, level=logging.INFO) #欢迎信息 handler.banner = settings.welcome_msg #添加被动端口范围 handler.passive_ports = range(settings.passive_ports[0], settings.passive_ports[1]) #监听ip 和 端口 server = FTPServer((settings.ip, settings.port), handler) #最大连接数 server.max_cons = settings.max_cons server.max_cons_per_ip = settings.max_per_ip #开始服务 print('开始服务') server.serve_forever() if __name__ == "__main__": ftp_server()
読み取り権限:
ファイルディレクトリを変更します | |
ファイルのリスト | |
サーバーからファイルを受信 |
ファイルアップロード | |
ファイルを削除 | |
ファイルの名前変更 | |
ファイルの作成 | |
書き込み権限 | |
ファイル転送モード(FTP経由でファイル権限を設定) |
以上がPython で FTP サーバー サービスを実装する方法 (コレクション)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。