Один рядок ftp-сервер у python


102

Чи можливо мати команду в рядку python, щоб зробити простий ftp-сервер? Мені б хотілося це зробити як швидкий і тимчасовий спосіб передачі файлів у вікно Linux без встановлення ftp-сервера. Переважно спосіб, використовуючи вбудовані бібліотеки python, щоб нічого додаткового не встановлювати.


8
Якщо ви не використовуєте зовнішню бібліотеку python, наприклад pftftpdlib, я сумніваюся, що ви можете це зробити з одним рядком коду. У Python є вбудований ftp-клієнт, але не сервер.
GWW

3
передача файлів на Linux ??? чому ви просто не використовуєте scp?
Леонмакс

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

Відповіді:


132

Обов’язковий кручений приклад:

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
Дуже хороша! Але ОП попросило використовувати стандартну бібліотеку python, оскільки він не хотів встановлювати інші бібліотеки.
Андреа Спадаччини

19
Правильно, я заслуговую на голосування, але люди повинні знати, що перекручено. І звичайно Twisted знаходиться в базовій установці багатьох Linux.
Алі Афшар

5
Ви не повинні голосувати, користувач сказав "бажано", а не "необхідно". Неможливо зробити це з бібліотеками, вбудованими в python, ви ОБОВ'ЯЗКОВО встановити програмне забезпечення сторонніх виробників.
Андре Пуель,

4
@Andrea Spadaccini: люди з майбутнього тут. Ми знайшли цю відповідь дуже корисною. ;)
Бенджамін Вольвенд

1
@BenjaminWohlwend: чим далі в майбутньому ... все ще дуже корисно. Здається, нам потрібен SimpleFTPServer у вбудованих.
MGP

89

Ознайомтеся з pyftpdlib від Giampaolo Rodola. Це один з найкращих ftp-серверів для python. Він використовується в хромовій системі Google (їх браузер) та базарі (система управління версіями). Це найбільш повна реалізація на 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.

До речі, в обох випадках параметр порту необов’язковий.


29
Я не думаю, що це дозволяє йому завантажувати файли.
Roman Plášil

2
Немає резюме, єдине з'єднання тощо
bugmenot123

@ RomanPlášil це буде, просто запустити сервер на іншому кінці xD просто як є
Reishin

26

Наведені вище відповіді передбачали, що ваш дистрибутив 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
Якщо говорити про припущення ... Ви припускаєте, що клієнти будуть уніфікованими tarі ncдоступними машинами . Що робити, якщо це вікна?
jlh

16

Для користувачів pyftpdlib. Я знайшов це на веб-сайті pyftpdlib. Це створює анонімний ftp з доступом до запису до вашої файлової системи, тому будь ласка, використовуйте з належною уважністю. Під капотом доступно більше функцій для кращої безпеки, тому просто перегляньте:

sudo pip3 install pyftpdlib

python3 -m pyftpdlib -w  

## updated for python3 Feb14:2020

Можливо, буде корисним для тих, хто намагався використати наведений вище метод.

sudo python -m pyftpdlib.ftpserver


3
Ви можете пропустити, sudoякщо встановити в venv
balki

1
не забувайте, що існує варіант v3: pip3 install pyftpdlibі python3 -m pyftpdlib -w. працював як шарм для мене.
Рон Кляйн

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/


3

Більш простим рішенням буде користування бібліотекою pyftpd. Ця бібліотека дозволяє обертати сервер Python FTP в одному рядку. Він не встановлений за замовчуванням, але ми можемо встановити його, використовуючи просту команду apt

apt-get install python-pyftpdlib

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

python -m pyftpdlib -p 21 

Виглядає добре, але яка аутентифікація відбувається? Я отримую "530 не вдалося підтвердити автентифікацію".
guettli

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.