122

是否可以在 python 中使用一行命令来做一个简单的 ftp 服务器?我希望能够以快速和临时的方式将文件传输到 linux 机器,而无需安装 ftp 服务器。最好是使用内置 python 库的方法,因此无需安装任何额外的东西。

4

9 回答 9

149

强制性扭曲示例:

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.
于 2011-02-14T16:57:14.810 回答
112

查看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)。

于 2011-09-05T03:46:22.060 回答
47

为什么不使用单行HTTP服务器呢?

python -m SimpleHTTPServer 8000

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

如果您使用 Python 3,则应改为编写

python3 -m http.server 8000

请参阅SimpleHTTPServer模块文档 2.x 和http.server文档 3.x。

顺便说一句,在这两种情况下,端口参数都是可选的。

于 2011-02-14T16:45:31.663 回答
30

上面的答案都是假设您的 Python 发行版将具有一些第三方库以实现“单线 python ftpd”目标,但@zio 所要求的情况并非如此。此外,SimpleHTTPServer 涉及用于下载文件的网络浏览器,它不够快。

Python 不能自己做 ftpd,但你可以使用netcatnc

nc基本上是任何类 UNIX 系统(甚至是嵌入式系统)的内置工具,因此非常适合“快速和临时地传输文件”。

第 1 步,在接收方,运行:

nc -l 12345 | tar -xf -

这将侦听端口 12345,等待数据。

第 2 步,在发送方:

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

于 2014-12-06T12:15:46.760 回答
22

对于 pyftpdlib 用户。我在 pyftpdlib 网站上找到了这个。这会创建对您的文件系统具有写访问权限的匿名 ftp,因此请谨慎使用。引擎盖下提供了更多功能以提高安全性,因此请看:

sudo pip3 install pyftpdlib

python3 -m pyftpdlib -w  

## updated for python3 Feb14:2020

对于那些尝试使用上述不推荐使用的方法的人可能会有所帮助。

sudo python -m pyftpdlib.ftpserver

于 2014-06-01T06:13:33.987 回答
4

更简单的解决方案是用户 pyftpd 库。该库允许您在一行中旋转 Python FTP 服务器。虽然它没有默认安装,但我们可以使用简单的 apt 命令安装它

apt-get install python-pyftpdlib

现在从您要服务的目录中运行 pythod 模块

python -m pyftpdlib -p 21 
于 2018-05-13T06:45:57.823 回答
4
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
于 2020-05-02T13:02:33.777 回答
3

安装:

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/

于 2014-12-11T20:07:51.020 回答
0

我不知道单线 FTP 服务器,但如果你知道

python -m SimpleHTTPServer

它将在 0.0.0.0:8000 上运行一个 HTTP 服务器,提供当前目录之外的文件。如果您正在寻找一种通过网络浏览器快速从 linux 机器上获取文件的方法,那么您将无法击败它。

于 2011-02-14T16:44:49.113 回答