pyftpdlib架设FTPS(FTP over SSL)服务器

Reading time ~1 minute

由于作业需要,要求搭建一个SSL加密的安全的FTP服务器,在网上随便找了一下,因为比较偏好Python,便决定用pyftpdlib。

首先还是使用pip进行安装:

sudo pip install pyftpdlib

安装很顺利,没有遇到什么问题。

接下来是使用了,首先架设一个没有使用SSL的FTP服务器:

#!/usr/bin/env python
#encoding:utf-8

from pyftpdlib.authorizers import DummyAuthorizer
from pyftpdlib.handlers import FTPHandler
from pyftpdlib.servers import FTPServer


def main():
    # Instantiate a dummy authorizer for managing 'virtual' users
    authorizer = DummyAuthorizer()
    # Define a new user having full r/w permissions
    authorizer.add_user('Jayvic', '******', './ftp_home', perm='elradfmwM')
    # Define a read-only anonymous user
    authorizer.add_anonymous('./ftp_home')

    # Instantiate FTP handler class
    handler = FTPHandler
    handler.authorizer = authorizer

    # Define a customized banner (string returned when client connects)
    handler.banner = "Welcome to Jayvic's FTP."

    # Instantiate FTP server class and listen on 127.0.0.1:21
    address = ('127.0.0.1', 21)
    server = FTPServer(address, handler)

    # set a limit for connections
    server.max_cons = 256
    server.max_cons_per_ip = 5

    # start ftp server
    server.serve_forever()


if __name__ == '__main__':
    main()

由于此处我们使用的是21号端口,所以需要使用sudo来运行,否则会报如下错误:

Traceback (most recent call last):
  File "./ftp_server.py", line 37, in <module>
    main()
  File "./ftp_server.py", line 26, in main
    server = FTPServer(address, handler)
  File "/Library/Python/2.7/site-packages/pyftpdlib/servers.py", line 145, in __init__
    self._af = self.bind_af_unspecified(address_or_socket)
  File "/Library/Python/2.7/site-packages/pyftpdlib/ioloop.py", line 774, in bind_af_unspecified
    raise socket.error(err)
socket.error: [Errno 13] Permission denied

如果不想使用sudo权限,可以选择换一个用户级别的端口。

确认FTP可以正常使用后,接下来,我们将代码换成支持SSL的版本:

#!/usr/bin/env python
#encoding:utf-8

from pyftpdlib.authorizers import DummyAuthorizer
from pyftpdlib.handlers import TLS_FTPHandler
from pyftpdlib.servers import FTPServer


def main():
    # Instantiate a dummy authorizer for managing 'virtual' users
    authorizer = DummyAuthorizer()
    # Define a new user having full r/w permissions
    authorizer.add_user('Jayvic', '******', './ftp_home', perm='elradfmwM')
    # Define a read-only anonymous user
    authorizer.add_anonymous('./ftp_home')

    # Instantiate TLS FTP handler class
    handler = TLS_FTPHandler
    handler.authorizer = authorizer
    handler.certfile = './server.crt'
    handler.keyfile = './server.key'

    # Define a customized banner (string returned when client connects)
    handler.banner = "Welcome to Jayvic's FTPS."

    # Instantiate FTP server class and listen on 127.0.0.1:21
    address = ('127.0.0.1', 21)
    server = FTPServer(address, handler)

    # set a limit for connections
    server.max_cons = 256
    server.max_cons_per_ip = 5

    # start ftp server
    server.serve_forever()


if __name__ == '__main__':
    main()

证书的制作可见此文,如果使用最后的方法生成的证书,可以不指定keyfile。

做这题的时候,脑残了一下,还把FTPS和SFTP给弄混了,竟然在架设好了FTPS的服务器后,使用SFTP命令来连接,真是脑残的不轻,想之前只有在windows下SSH的时候想传文件还是用的FTP软件开SFTP传的,这几天不用竟然就忘了。

挂载网络文件夹后网络故障时文件操作命令卡死

挂载 NFS 或者 Samba 的时候,经常会由于网络故障导致挂载好的链接断掉。此时如果尝试进行 ls、cd、df 等各种命令,只要与此目录沾上边,就会卡住。如果使用了类似 oh-my-zsh 这种配置的,只要在网络目录中,弹出命令提示符前就会直接卡住。这个时候第一反应就是...… Continue reading

路由折腾记 第四弹

Published on September 02, 2017