Однострочный ftp-сервер на Python


104

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


8
Если вы не используете внешнюю библиотеку Python, такую ​​как pftftpdlib, я сомневаюсь, что вы сможете сделать это с помощью одной строчки кода. Python имеет встроенный ftp-клиент, но не сервер.
— GWW

3
переносить файлы в linux ??? почему бы тебе просто не использовать scp?
— Leonmax 02

Почему бы не использовать sshfs ? Для максимальной скорости передачи (в локальной сети) используйте опцию -o Ciphers=arcfour, т. Е. sshfs $REMOTEHOST:$DIRECTORY $MOUNTPOINT -o Ciphers=arcfourКопируйте, перемещайте, переименовывайте и управляйте файлами в файловой системе. sshfs также доступен для Mac OSX.
— erik

Ответы:


133

Обязательный пример 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.

4
Очень хорошо! Но OP попросил использовать стандартную библиотеку python, потому что он не хотел устанавливать другие библиотеки.
— Андреа Спадаччини,

20
Верно, я заслуживаю отрицательного голосования, но на самом деле люди должны знать Twisted. И, конечно же, Twisted входит в базовую установку многих Linux.
— Али Афшар,

Я не голосовал против, потому что это хороший ответ, даже если немного ноль, и люди из будущего сочтут его полезным при поиске аналогичных проблем.
— Андреа Спадаччини,

1
@MichaelA, безусловно, должен работать с окнами. ps Странно посещать собственное будущее.
— Али Афшар

2
На большинстве платформ скрученная установка настолько проста, pip install -U twistedчто прямо не упоминается на связанном сайте.
— Стив Барнс,

92

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


1
По состоянию на 1.3.0: >>> from pyftpdlib import ftpserver:pyftpdlib\ftpserver.py:54: DeprecationWarning: pyftpdlib.ftpserver module is deprecated
— Daniel Reis

2
Обновлено 27 августа 2014 г. для получения текущей версии. Теперь предупреждений об устаревании не должно быть.
— Брайан Брюггеман

это безопасно?
— AmirHossein

@TechJS pyftpdlib поддерживает ftp через TLS (RFC 4217).
— Брайан Брюггеман,

@BrianBruggeman Нет, под безопасностью я имею в виду запрет на доступ к ftp через Интернет, не делать ничего непреднамеренного и не красть мои данные, я имею в виду, достаточно ли безопасен исходный код для использования в производственных средах?
— AmirHossein

40

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

python -m SimpleHTTPServer 8000

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

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

python3 -m http.server 8000

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

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


30
Я не думаю, что это позволяет ему загружать файлы.
— Роман Плашил 07

2
Нет резюме, однократное соединение и т. Д.
— bugmenot123

@ RomanPlášil, это будет, просто запустите сервер на другом конце xD, просто как есть
— Рейшин

27

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

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


2
Говоря о предположении ... Вы предполагаете , что клиенты будут UNIX машины с tarи ncдоступны. Что, если это окна?
— jlh 02

17

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

sudo pip3 install pyftpdlib

python3 -m pyftpdlib -w  

## updated for python3 Feb14:2020

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

sudo python -m pyftpdlib.ftpserver


3
Можно пропустить, sudoесли установишь в венв
— балки

1
не забывайте, что есть вариант v3: pip3 install pyftpdlibи python3 -m pyftpdlib -w. работал для меня как шарм.
— Рон Кляйн

4

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

apt-get install python-pyftpdlib

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

python -m pyftpdlib -p 21 

Выглядит неплохо, но какая аутентификация происходит? Я получаю «530 Ошибка аутентификации».
— Guettli

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/


1

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

python -m SimpleHTTPServer

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


1
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 Они охватывают одну и ту же библиотеку, но мне не кажутся дубликатами.
— Марк Роттевил
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.