用Python实现的一行FTP服务器

133

有没有可能在Python中使用一行命令创建一个简单的ftp服务器?我想要一种快速临时的方法将文件传输到Linux计算机上,而不必安装ftp服务器。最好使用内置的Python库,以便无需安装任何额外的东西。


8
除非你使用像pftftpdlib这样的外部Python库,否则我怀疑你无法用一行代码完成这个任务。Python内置了FTP客户端,但没有服务器。 - GWW
4
为何不使用SCP,直接将文件传输到Linux? - Leonmax
为什么不使用sshfs?在局域网中,为了获得最快的传输速率,请使用选项-o Ciphers=arcfour,即sshfs $REMOTEHOST:$DIRECTORY $MOUNTPOINT -o Ciphers=arcfour,并在您的文件系统中复制、移动、重命名和管理文件。sshfs也适用于Mac OSX。 - erik
9个回答

156

以下是必要的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.

8
太好了!但是原帖的要求是使用标准Python库,因为他不想安装其他库。 - Andrea Spadaccini
26
没错,我确实应该被踩下去,但人们真的应该了解 Twisted。当然,Twisted 已经在许多 Linux 发行版的基本安装中了。 - Ali Afshar
2
我没有点踩,因为这是一个不错的答案,即使有些 O,并且未来的人们在搜索类似问题时会发现它很有用。 - Andrea Spadaccini
1
@MichaelA 应该可以在Windows上正常运行。附注:访问自己未来的感觉很奇妙。 - Ali Afshar
2
在大多数平台上,Twisted的安装非常容易,只需要执行pip install -U twisted命令即可。这并没有在链接的网站上直接提到。 - Steve Barnes
显示剩余6条评论

123

请查看 Giampaolo Rodola 的 pyftpdlib。它是 Python 中最好的 ftp 服务器之一。它被用在 Google 的 Chromium(他们的浏览器)和 Bazaar(版本控制系统)中。这是 Python 中对于 RFC-959(也称为 FTP 服务器实现规范)最完整的实现。

安装方法:

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
从1.3.0版本开始:>>> from pyftpdlib import ftpserverpyftpdlib\ftpserver.py:54: DeprecationWarning: pyftpdlib.ftpserver模块已经过时 - Daniel Reis
2
更新于2014年8月27日,适用于当前版本。现在不应该有弃用警告了。 - Brian Bruggeman
这个安全吗? - Amir Hossein Baghernezad
@TechJS pyftpdlib 支持基于 TLS(RFC 4217)的 FTP。 - Brian Bruggeman
1
pyftpdlib从未是内置的。您需要使用pip3进行安装:pip3 install pyftpdlib - Brian Bruggeman
显示剩余2条评论

48

为什么不使用一行代码的HTTP服务器呢?

python -m SimpleHTTPServer 8000

本命令将在端口8000上通过HTTP提供当前工作目录的内容。

如果您使用Python 3,应改为编写以下命令:

python3 -m http.server 8000

请参考2.x版本的SimpleHTTPServer模块文档和3.x版本的http.server模块文档。

另外,无论哪种情况下,端口参数都是可选的。


44
我认为这不能让他上传文件。 - Roman Plášil
3
无简历,单连接等。 - bugmenot123
@RomanPlášil 它会的,只需在另一端运行服务器 xD 就像它是的那样简单。 - Reishin
8
问题是关于设置FTP服务器,而不是HTTP。 - David Jablonski
如果您想从 Mac 下载文件,则适用于 Mac。 - Lokesh

34
以上的回答都假定你的Python发行版需要一些第三方库才能实现“一行Python ftpd”的目标,但这并不是@zio所问的情况。此外,SimpleHTTPServer涉及到使用web浏览器下载文件,并且速度不够快。
Python本身无法完成ftpd,但你可以使用netcat(nc):
nc基本上是任何类UNIX系统(甚至是嵌入式系统)的内置工具,因此非常适合“快速临时传输文件”。
步骤1,在接收方运行:
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 的两端将自动退出,任务完成。


6
说到假设...你认为客户端将是具有tarnc的Unix机器。如果是Windows呢? - jlh
哇,这真是太方便了。这个程序能否有一个GUI界面呢?我无法向我的同事推荐命令行方式,简单的UI将使它实现。 - Nikhil VJ
1
@jlh,你可以在Windows上通过Cygwin使用它。Cygwin不是一个小型安装程序,但如果你需要在Windows命令行中执行类似Linux的操作,它应该很方便和容易。 - Brōtsyorfuzthrāx

24

对于pyftpdlib的用户。我在pyftpdlib网站上找到了这个。它可以创建具有写访问权限的匿名ftp,因此请小心使用。更多功能在保障安全性方面是可用的,所以请自行查看:

sudo pip3 install pyftpdlib

python3 -m pyftpdlib -w  

## updated for python3 Feb14:2020

对于那些尝试使用上面被弃用的方法的人可能会有帮助。

sudo python -m pyftpdlib.ftpserver


3
如果您在 venv 中安装,则可以跳过 sudo - balki
1
不要忘记还有v3版本:pip3 install pyftpdlib,以及python3 -m pyftpdlib -w。对我来说非常好用。 - Ron Klein
谢谢!这对于在家中快速在计算机之间传输文件非常有效。 - Nikhil VJ
这个对我很有效,是否有一行代码的sftp服务器? - ethanjyx

6
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

1
@karel 它们涵盖了相同的库,但在我看来它们并不是重复的。 - Mark Rotteveel

4

安装:

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/


4

更简单的解决方案是使用pyftpd库。该库允许您在一行中启动Python FTP服务器。但它不是默认安装的,我们可以使用简单的apt命令进行安装。

apt-get install python-pyftpdlib

现在,从你想要提供服务的目录中运行python模块即可。
python -m pyftpdlib -p 21 

看起来不错,但是使用了什么样的身份验证方式?我收到了“530身份验证失败”的错误提示。 - guettli

0

我不知道有没有一行代码的FTP服务器,但如果你知道的话

python -m SimpleHTTPServer

它将在0.0.0.0:8000上运行一个HTTP服务器,从当前目录中提供文件。如果您正在寻找一种快速使用Web浏览器从Linux框中获取文件的方法,那么您无法击败它。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接