在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.py
和handlers.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)
参考文章
- 什么是FTP MLSD命令:https://www.cnblogs.com/donot4get/archive/2009/12/08/1619137.html
- Pyftpdlib使用方法:https://blog.csdn.net/xuq09/article/details/84936853
- Pyftpdlib中文件乱码:https://blog.csdn.net/iteye_13695/article/details/82681602
- 设置locale解决在bash输入中文会报错:https://www.jianshu.com/p/a7c9ad0ebb01
- Linux设置开机自启动:https://www.cnblogs.com/ssooking/p/6094740.html