用Python在Linux下配置FTP服务器访问/media目录

在Linux操作系统上,常用的ftp服务器有vsftpd,但是vsftpd无法将/media目录设置为ftp的根目录。也有可能是我打开的方式不对,总之我没有操作成功,于是转用Python尝试实现类似的目的。

安装Python3

Linux系统自带Python 3.4版本,以后遇到需要单独安装的情况再做补充。

安装pip3

# wget https://bootstrap.pypa.io/get-pip.py
wget https://bootstrap.pypa.io/pip/3.4/get-pip.py
python3 get-pip.py
pip -V # check version

安装pyftpdlib库

pip install pyftpdlib

如果不想装pip,直接从pypi下载构建安装包应该也是可以的:https://pypi.org/project/pyftpdlib

修复中文乱码错误

Windows资源管理器内置的ftp访问功能使用gbk编码,需要将pyftpdlib库中的filesystems.pyhandlers.py文件所有位置出现的'utf8'全都替换为'gbk',否则中文会出现乱码:

import os
import pyftpdlib
root = os.path.dirname(pyftpdlib.__file__)
for file in ['filesystems.py', 'handlers.py']:
    path = os.path.join(root, file)
    with open(path, 'r+') as f:
        s = f.read()
        f.seek(0)
        f.truncate()
        f.write(s.replace("'utf8'", "'gbk'"))

其中filesystems.py中替换4处,其中2处使用Python2时才会遍历,修改不影响,2处来自于获取文件夹文件列表的函数,应为必要修改。

文件handlers.py中替换6处,2处为Python2时才会遍历,2处为ftp获取文件列表函数,应为必要修改。

另有2处:

class FTPHandler(AsyncChat):
    ...
    def decode(self, bytes):
        return bytes.decode('utf8', self.unicode_errors)

此处经测试,如不修改则文件无法上传下载。

class FTPHandler(AsyncChat):
    ...
    def push(self, s):
        asynchat.async_chat.push(self, s.encode('utf8'))

此处经测试,改不改不影响ftp功能,但是否为必要修改未知。

但改都改了,就这样吧,如果以后有编码问题,可以考虑确认此问题。

启动FTP服务器

详细参数含义见附录:

python3 -m pyftpdlib -p 21 -w -d /media/image

在Windows通过局域网访问FTP

打开Windows explorer,在路径输入:

ftp://192.168.1.xxx/

配置自启动

打开/etc/rc.local,在最后的exit 0之前添加:

export LC_ALL="C.UTF-8"
python3 -m pyftpdlib -p 21 -w -d /media/image &

第一行解决FTP显示中文乱码的问题,解决原理未知。

第二行的最后一个&表示非阻塞运行脚本。

附录

pyftpdlib帮助文档

Usage: python -m pyftpdlib [options]

Start a stand alone anonymous FTP server.

Options:
  -h, --help
     show this help message and exit

  -i ADDRESS, --interface=ADDRESS
     specify the interface to run on (default all interfaces)

  -p PORT, --port=PORT
     specify port number to run on (default 2121)

  -w, --write
     grants write access for logged in user (default read-only)

  -d FOLDER, --directory=FOLDER
     specify the directory to share (default current directory)

  -n ADDRESS, --nat-address=ADDRESS
     the NAT address to use for passive connections

  -r FROM-TO, --range=FROM-TO
     the range of TCP ports to use for passive connections (e.g. -r 8000-9000)

  -D, --debug
     enable DEBUG logging evel

  -v, --version
     print pyftpdlib version and exit

  -V, --verbose
     activate a more verbose logging

  -u USERNAME, --username=USERNAME
     specify username to login with (anonymous login will be disabled and password required if supplied)

  -P PASSWORD, --password=PASSWORD
     specify a password to login with (username required to be useful)

参考文章

  1. 什么是FTP MLSD命令:https://www.cnblogs.com/donot4get/archive/2009/12/08/1619137.html
  2. Pyftpdlib使用方法:https://blog.csdn.net/xuq09/article/details/84936853
  3. Pyftpdlib中文件乱码:https://blog.csdn.net/iteye_13695/article/details/82681602
  4. 设置locale解决在bash输入中文会报错:https://www.jianshu.com/p/a7c9ad0ebb01
  5. Linux设置开机自启动:https://www.cnblogs.com/ssooking/p/6094740.html
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值