python中的单线ftp服务器
Posted
技术标签:
【中文标题】python中的单线ftp服务器【英文标题】:One line ftp server in python 【发布时间】:2011-06-27 01:11:02 【问题描述】:是否可以在 python 中使用一行命令来做一个简单的 ftp 服务器?我希望能够以快速和临时的方式将文件传输到 linux 机器,而无需安装 ftp 服务器。最好是使用内置 python 库的方法,因此无需安装任何额外内容。
【问题讨论】:
除非你使用像 pftftpdlib 这样的外部 python 库,否则我怀疑你可以用一行代码做到这一点。 Python 有一个内置的 ftp 客户端,但没有服务器。 传输文件到linux???为什么不直接使用 scp? 为什么不使用 sshfs?要获得最快的传输速率(在 LAN 中),请使用选项-o Ciphers=arcfour
,即 sshfs $REMOTEHOST:$DIRECTORY $MOUNTPOINT -o Ciphers=arcfour
,然后复制、移动、重命名、管理文件系统中的文件。 sshfs 也可用于 Mac OSX。
【参考方案1】:
必填Twisted 示例:
twistd -n ftp
而且可能有用:
twistd ftp --help
Usage: twistd [options] ftp [options].
WARNING: This FTP server is probably INSECURE do not use it.
Options:
-p, --port= set the port number [default: 2121]
-r, --root= define the root of the ftp-site. [default:
/usr/local/ftp]
--userAnonymous= Name of the anonymous user. [default: anonymous]
--password-file= username:password-style credentials database
--version
--help Display this help and exit.
【讨论】:
非常好!但是OP要求使用标准python库,因为他不想安装其他库。 对,我确实应该投反对票,但说真的,人们应该知道 Twisted。当然,Twisted 是许多 Linux 的基础安装。 我没有投反对票,因为这是一个很好的答案,即使有点 O,未来的人们在搜索类似问题时会发现它很有用。 @MichaelA 当然应该在 Windows 上工作。 p.s.访问我自己的未来很奇怪。 在大多数平台上,twisted install 就像链接站点上没有直接提及的pip install -U twisted
一样简单。【参考方案2】:
查看来自 Giampaolo Rodola 的 pyftpdlib。它是 Python 最好的 ftp 服务器之一。它用于 google 的 chromium(他们的浏览器)和 bazaar(版本控制系统)。它是RFC-959(又名:FTP 服务器实现规范)在 Python 上最完整的实现。
安装:
pip3 install pyftpdlib
从命令行:
python3 -m pyftpdlib
或者“my_server.py”:
#!/usr/bin/env python3
from pyftpdlib import servers
from pyftpdlib.handlers import FTPHandler
address = ("0.0.0.0", 21) # listen on every IP on my machine on port 21
server = servers.FTPServer(address, FTPHandler)
server.serve_forever()
如果您想要更复杂的东西,网站上有更多示例。
获取命令行选项列表:
python3 -m pyftpdlib --help
注意,如果您想覆盖或使用标准 ftp 端口,您需要管理员权限(例如 sudo)。
【讨论】:
从 1.3.0 开始:>>> from pyftpdlib import ftpserver
:pyftpdlib\ftpserver.py:54: DeprecationWarning: pyftpdlib.ftpserver module is deprecated
于 2014 年 8 月 27 日星期三更新了当前版本。现在不应该有弃用警告。
这样安全吗?
@TechJS pyftpdlib 支持 ftp over TLS (RFC 4217)。
@BrianBruggeman 不,所谓安全,我的意思是不通过互联网公开 ftp,不做任何意外的事情,不窃取我的数据,我的意思是源代码是否足够安全,可以在生产环境中使用?【参考方案3】:
为什么不使用单行 HTTP 服务器?
python -m SimpleHTTPServer 8000
将在端口 8000 上通过 HTTP 提供当前工作目录的内容。
如果你使用 Python 3,你应该改写
python3 -m http.server 8000
请参阅 SimpleHTTPServer 模块文档以了解 2.x 和 http.server 文档以了解 3.x。
顺便说一句,在这两种情况下,端口参数都是可选的。
【讨论】:
我认为这不允许他上传文件。 无续传、单连接等 @RomanPlášil 会的,只需按原样在另一端 xD 上运行服务器 问题是关于设置 FTP 服务器,而不是 HTTP。 如果你想从 mac 下载文件,适用于 mac。【参考方案4】:上面的答案都是假设您的 Python 发行版将具有一些第三方库以实现“单线 python ftpd”目标,但@zio 所要求的情况并非如此。此外,SimpleHTTPServer 涉及用于下载文件的网络浏览器,它不够快。
Python自己不能做ftpd,但是可以用netcat,nc
:
nc
基本上是任何类 UNIX 系统(甚至嵌入式系统)的内置工具,因此非常适合“快速和临时的文件传输方式”。
第一步,在接收端,运行:
nc -l 12345 | tar -xf -
这将侦听端口 12345,等待数据。
第二步,发送方:
tar -cf - ALL_FILES_YOU_WANT_TO_SEND ... | nc $RECEIVER_IP 12345
你也可以把pv
放在中间来监控转账的进度:
tar -cf - ALL_FILES_YOU_WANT_TO_SEND ...| pv | nc $RECEIVER_IP 12345
传输完成后,nc
两边会自动退出,工作完成。
【讨论】:
说到假设...您假设客户端将是具有tar
和nc
可用的Unix 机器。如果是窗户呢?
哇,这很方便。是否会围绕此构建任何 GUI 包装器?我无法向我的人推销命令行方式,一个简单的用户界面就可以实现【参考方案5】:
对于 pyftpdlib 用户。我在 pyftpdlib 网站上找到了这个。这会创建对您的文件系统具有写访问权限的匿名 ftp,因此请谨慎使用。引擎盖下提供了更多功能以提高安全性,因此请看:
sudo pip3 install pyftpdlib
python3 -m pyftpdlib -w
## updated for python3 Feb14:2020
可能对那些尝试使用上述已弃用方法的人有所帮助。
sudo python -m pyftpdlib.ftpserver
【讨论】:
如果你安装在 venv 中,你可以跳过sudo
别忘了还有 v3 版本:pip3 install pyftpdlib
和 python3 -m pyftpdlib -w
。对我来说就像一种魅力。
谢谢!这非常适合在家中的计算机之间快速传输。
这个很适合我,有sftp服务器在一行吗?【参考方案6】:
更简单的解决方案是用户 pyftpd 库。该库允许您在一行中旋转 Python FTP 服务器。虽然它没有默认安装,但我们可以使用简单的 apt 命令安装它
apt-get install python-pyftpdlib
现在从您要服务的目录中运行 pythod 模块
python -m pyftpdlib -p 21
【讨论】:
看起来不错,但是会发生什么样的身份验证?我收到“530 身份验证失败”。【参考方案7】:apt-get install python3-pip
pip3 install pyftpdlib
python3 -m pyftpdlib -p 21 -w --user=username --password=password
-w = write permission
-p = desired port
--user = give your username
--password = give your password
【讨论】:
@karel 他们涵盖了同一个库,但对我来说它们看起来不像重复。【参考方案8】:安装:
pip install twisted
然后是代码:
from twisted.protocols.ftp import FTPFactory, FTPRealm
from twisted.cred.portal import Portal
from twisted.cred.checkers import AllowAnonymousAccess, FilePasswordDB
from twisted.internet import reactor
reactor.listenTCP(21, FTPFactory(Portal(FTPRealm('./'), [AllowAnonymousAccess()])))
reactor.run()
深入:
http://twistedmatrix.com/documents/current/core/examples/
【讨论】:
【参考方案9】:我不知道单线 FTP 服务器,但如果你知道的话
python -m SimpleHTTPServer
它将在 0.0.0.0:8000 上运行 HTTP 服务器,提供当前目录之外的文件。如果您正在寻找一种通过网络浏览器快速从 linux 机器上获取文件的方法,那么您将无法击败它。
【讨论】:
以上是关于python中的单线ftp服务器的主要内容,如果未能解决你的问题,请参考以下文章
Python 连接FTP服务器并实现文件夹下载实例演示,python区分ftp目录下文件和文件夹方法,ftp目录下包含中文名问题处理
Python 连接FTP服务器并实现文件夹下载实例演示,python区分ftp目录下文件和文件夹方法,ftp目录下包含中文名问题处理