Однострочный FTP-сервер в Python - PullRequest
89 голосов
/ 14 февраля 2011

Возможно ли использовать однострочную команду в python для создания простого ftp-сервера? Я хотел бы иметь возможность сделать это как быстрый и временный способ переноса файлов на Linux-коробку без установки FTP-сервера. Желательно использовать встроенные библиотеки Python, чтобы не было ничего лишнего для установки.

Ответы [ 9 ]

121 голосов
/ 14 февраля 2011

Обязательный Витой пример:

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.
77 голосов
/ 05 сентября 2011

Выезд pyftpdlib от Джампаоло Родола. Это один из лучших FTP-серверов для Python. Он используется в Google Chrome (их браузер) и Bazaar (система контроля версий). Это наиболее полная реализация на Python для RFC-959 (иначе: спецификация реализации FTP-сервера).

Из командной строки:

python -m pyftpdlib

В качестве альтернативы 'my_server.py':

#!/usr/bin/env python

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()

На сайте есть больше примеров, если вы хотите что-то более сложное.

Чтобы получить список параметров командной строки:

python -m pyftpdlib --help

Обратите внимание: если вы хотите переопределить или использовать стандартный порт ftp, вам потребуются права администратора (например, sudo).

33 голосов
/ 14 февраля 2011

Почему бы вам вместо этого не использовать однострочный HTTP сервер?

python -m SimpleHTTPServer 8000

будет обслуживать содержимое текущего рабочего каталога по HTTP через порт 8000.

Если вы используете Python 3, вместо этого вы должны написать

python3 -m http.server 8000

См. Документы по SimpleHTTPServer для 2.x и документы http.server для3.x.

Кстати, в обоих случаях параметр порта является необязательным.

24 голосов
/ 06 декабря 2014

Все приведенные выше ответы предполагали, что в вашем дистрибутиве Python будут некоторые сторонние библиотеки для достижения цели «один лайнер python ftpd», но это не тот случай, о котором спрашивал @zio.Кроме того, SimpleHTTPServer использует веб-браузер для загрузки файлов, но он недостаточно быстр.

Python не может выполнять ftpd сам по себе, но вы можете использовать netcat , nc:

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 автоматически завершат работу, и работа выполнена.

14 голосов
/ 01 июня 2014

Для пользователей pyftpdlib. Я нашел это на сайте pyftpdlib. Это создает анонимный ftp с доступом на запись к вашей файловой системе, поэтому, пожалуйста, используйте с осторожностью. Дополнительные функции доступны под капотом для лучшей безопасности, так что просто посмотрите:

sudo pip install pyftpdlib

python -m pyftpdlib -w

Может быть полезно для тех, кто пытался использовать устаревший метод выше.

sudo python -m pyftpdlib.ftpserver

3 голосов
/ 11 декабря 2014

Установка:

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/

2 голосов
/ 13 мая 2018

Более простым решением будет пользовательская библиотека pyftpd.Эта библиотека позволяет вращать FTP-сервер Python в одну строку.Он не устанавливается по умолчанию, но мы можем установить его, используя простую команду apt

apt-get install python-pyftpdlib

, теперь из каталога, который вы хотите обслуживать, просто запустите модуль pythod

python -m pyftpdlib -p 21 
1 голос
/ 14 февраля 2011

Я не знаю об однострочном FTP-сервере, но если вы сделаете

python -m SimpleHTTPServer

Он запустит HTTP-сервер на 0.0.0.0:8000, обслуживая файлы из текущего каталога. Если вы ищете способ быстро получить файлы из linux box с помощью веб-браузера, вы не можете победить его.

0 голосов
/ 14 февраля 2011

Хороший список инструментов на

http://www.willdonnelly.net/blog/file-transfer/

Я несколько раз использовал сам себя. Очень мило.

...