it-swarm-ru.tech

Однострочный FTP-сервер в python

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

89
zio

Обязательный 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.
121
Ali Afshar

Проверьте 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).

77
Brian Bruggeman

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

python -m SimpleHTTPServer 8000

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

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

python3 -m http.server 8000

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

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

33
Andrea Spadaccini

Все приведенные выше ответы предполагали, что ваш дистрибутив Python будет содержать сторонние библиотеки для достижения цели "one liner python ftpd", но это не тот случай, когда @ Зио спрашивал. Кроме того, 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 автоматически завершат работу, и работа будет выполнена.

24
Meow

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

Sudo pip install pyftpdlib

python -m pyftpdlib -w

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

Sudo python -m pyftpdlib.ftpserver

14
cdplayer

Установка:

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/

3
Jonathan

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

apt-get install python-pyftpdlib

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

python -m pyftpdlib -p 21 
2
MVnD3X

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

python -m SimpleHTTPServer

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

1
Alex

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

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

Я много раз пользовался этим. Очень хорошо.

0
Joe Drumgoole