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,但是可以用netcatnc

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两边会自动退出,工作完成。

【讨论】:

说到假设...您假设客户端将是具有tarnc 可用的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 pyftpdlibpython3 -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连载54-FTP编程

python简易FTP服务器

python和ftp

Python 连接FTP服务器并实现文件夹下载实例演示,python区分ftp目录下文件和文件夹方法,ftp目录下包含中文名问题处理

Python 连接FTP服务器并实现文件夹下载实例演示,python区分ftp目录下文件和文件夹方法,ftp目录下包含中文名问题处理

python实现FTP服务器