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

104

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

Zio
источник
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

CD-проигрыватель
источник
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 
MVnD3X
источник
Выглядит неплохо, но какая аутентификация происходит? Я получаю «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 с помощью веб-браузера, вы не сможете его превзойти.

Alex
источник
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 Они охватывают одну и ту же библиотеку, но мне не кажутся дубликатами.
Марк Роттевил