Jednowierszowy serwer ftp w Pythonie


104

Czy można mieć jedno wierszowe polecenie w Pythonie, aby wykonać prosty serwer ftp? Chciałbym móc to zrobić jako szybki i tymczasowy sposób przesyłania plików do komputera z systemem Linux bez konieczności instalowania serwera ftp. Najlepiej sposób na użycie wbudowanych bibliotek Pythona, więc nie ma nic dodatkowego do zainstalowania.


8
Jeśli nie używasz zewnętrznej biblioteki Pythona, takiej jak pftftpdlib, wątpię, czy możesz to zrobić za pomocą jednej linii kodu. Python ma wbudowanego klienta ftp, ale nie ma serwera.
— GWW

3
przesyłać pliki do Linuksa ??? dlaczego po prostu nie użyjesz scp?
— Leonmax

Dlaczego nie użyć sshfs ? Aby uzyskać najszybsze szybkości transferu (w sieci LAN), użyj opcji -o Ciphers=arcfour, tj. sshfs $REMOTEHOST:$DIRECTORY $MOUNTPOINT -o Ciphers=arcfourKopiuj, przenoś, zmieniaj nazwy, zarządzaj plikami w systemie plików. sshfs jest również dostępny dla systemu Mac OSX.
— erik

Odpowiedzi:


133

Obligatory Twisted przykład:

twistd -n ftp

I prawdopodobnie przydatne:

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
Bardzo dobrze! Ale OP poprosił o użycie standardowej biblioteki Pythona, ponieważ nie chciał instalować innych bibliotek.
— Andrea Spadaccini,

20
Racja, zasługuję na głosowanie negatywne, ale tak naprawdę ludzie powinni znać Twisted. I oczywiście Twisted jest w podstawowej instalacji wielu Linuksów.
— Ali Afshar,

5
Nie powinieneś głosować w dół, użytkownik powiedział „najlepiej”, a nie „konieczne”. Nie ma sposobu, aby to zrobić z wbudowanymi bibliotekami Pythona, MUSISZ zainstalować oprogramowanie innych firm.
— André Puel

4
@Andrea Spadaccini: ludzie z przyszłości tutaj. Okazało się, że ta odpowiedź jest rzeczywiście bardzo przydatna. ;)
— Benjamin Wohlwend

1
@BenjaminWohlwend: dalej w przyszłości ... nadal bardzo przydatne. Wygląda na to, że potrzebujemy SimpleFTPServer w wbudowanym oprogramowaniu.
— MGP,

91

Sprawdź pyftpdlib od Giampaolo Rodoli. Jest to jeden z najlepszych serwerów ftp dla Pythona. Jest używany w Google Chrome (ich przeglądarka) i bazarze (system kontroli wersji). Jest to najbardziej kompletna implementacja w Pythonie dla RFC-959 (aka: specyfikacja implementacji serwera FTP).

Z linii poleceń:

python -m pyftpdlib

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

Na stronie jest więcej przykładów, jeśli chcesz czegoś bardziej skomplikowanego.

Aby uzyskać listę opcji wiersza poleceń:

python -m pyftpdlib --help

Uwaga, jeśli chcesz przesłonić lub użyć standardowego portu ftp, będziesz potrzebować uprawnień administratora (np. Sudo).


1
Począwszy od 1.3.0: >>> from pyftpdlib import ftpserver:pyftpdlib\ftpserver.py:54: DeprecationWarning: pyftpdlib.ftpserver module is deprecated
— Daniel Reis

2
Zaktualizowano środę, 27 sierpnia 2014 r. Dla aktualnej wersji. Nie powinno być teraz ostrzeżeń o wycofaniu.
— Brian Bruggeman

czy to jest bezpieczne?
— Amir Hossein

@TechJS pyftpdlib obsługuje ftp przez TLS (RFC 4217).
— Brian Bruggeman

@BrianBruggeman Nie przez bezpieczne Mam na myśli nie ujawnianie ftp przez Internet, nie robienie niczego niezamierzonego i nie kradzież moich danych, mam na myśli, czy kod źródłowy jest wystarczająco bezpieczny, aby można go było używać w środowiskach produkcyjnych?
— AmirHossein

40

Dlaczego zamiast tego nie użyjesz jednowierszowego serwera HTTP ?

python -m SimpleHTTPServer 8000

będzie obsługiwać zawartość bieżącego katalogu roboczego przez HTTP na porcie 8000.

Jeśli używasz Pythona 3, powinieneś zamiast tego pisać

python3 -m http.server 8000

Zobacz dokumentację modułu SimpleHTTPServer dla wersji 2.xi dokumentację http.server dla wersji 3.x.

Nawiasem mówiąc, w obu przypadkach parametr portu jest opcjonalny.


29
Nie sądzę, żeby to pozwalało mu na przesyłanie plików.
— Roman Plášil

2
Brak wznowienia, pojedyncze połączenie itp.
— bugmenot123

@ RomanPlášil będzie, po prostu uruchom serwer na innym końcu xD po prostu tak, jak jest
— Reishin

27

Wszystkie powyższe odpowiedzi zakładały, że Twoja dystrybucja Pythona będzie miała biblioteki innych firm, aby osiągnąć cel „One Liner Python ftpd”, ale nie o to pytał @zio. Ponadto SimpleHTTPServer obejmuje przeglądarkę internetową do pobierania plików, nie jest wystarczająco szybki.

Python nie może zrobić ftpd przez siebie, ale można użyć netcata , nc:

ncjest w zasadzie narzędziem wbudowanym w dowolne systemy typu UNIX (nawet systemy wbudowane), więc jest idealne do „ szybkiego i tymczasowego przesyłania plików ”.

Krok 1, po stronie odbiornika, uruchom:

nc -l 12345 | tar -xf -

to nasłuchuje na porcie 12345, czekając na dane.

Krok 2, po stronie nadawcy:

tar -cf - ALL_FILES_YOU_WANT_TO_SEND ... | nc $RECEIVER_IP 12345

Możesz także umieścić pvw środku, aby monitorować postęp przesyłania:

tar -cf - ALL_FILES_YOU_WANT_TO_SEND ...| pv | nc $RECEIVER_IP 12345

Po zakończeniu przenoszenia obie strony ncautomatycznie zakończą pracę i zadanie wykonane.


2
Mówiąc o zakładaniu ... Zakładasz, że klientami będą maszyny uniksowe z dostępnymi tari ncdostępnymi. A jeśli to okna?
— jlh

16

Dla użytkowników pyftpdlib. Znalazłem to na stronie pyftpdlib. Tworzy to anonimowe ftp z prawem zapisu do twojego systemu plików, więc używaj z należytą ostrożnością. Więcej funkcji jest dostępnych pod maską dla większego bezpieczeństwa, więc po prostu spójrz:

sudo pip3 install pyftpdlib

python3 -m pyftpdlib -w  

## updated for python3 Feb14:2020

Może być pomocne dla tych, którzy próbowali zastosować powyższą przestarzałą metodę.

sudo python -m pyftpdlib.ftpserver


3
Możesz pominąć, sudojeśli zainstalujesz w venv
— balki

1
nie zapominaj, że istnieje wariant v3: pip3 install pyftpdlibi python3 -m pyftpdlib -w. zadziałało dla mnie jak urok.
— Ron Klein

3

Zainstalować:

pip install twisted

Następnie kod:

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

Wejdź głębiej:

http://twistedmatrix.com/documents/current/core/examples/


3

Prostszym rozwiązaniem będzie biblioteka użytkownika pyftpd. Ta biblioteka umożliwia uruchomienie serwera FTP Python w jednej linii. Nie jest jednak instalowany domyślnie, ale możemy go zainstalować za pomocą prostego polecenia apt

apt-get install python-pyftpdlib

teraz z katalogu, który chcesz obsługiwać, po prostu uruchom moduł pythoda

python -m pyftpdlib -p 21 

Wygląda dobrze, ale jakiego rodzaju uwierzytelnianie ma miejsce? Otrzymuję komunikat „530 Autoryzacja nie powiodła się”.
— guettli

1

Nie wiem o jednowierszowym serwerze FTP, ale jeśli wiesz

python -m SimpleHTTPServer

Uruchomi serwer HTTP na 0.0.0.0:8000, udostępniając pliki z bieżącego katalogu. Jeśli szukasz sposobu na szybkie usunięcie plików z Linux-a za pomocą przeglądarki internetowej, nie możesz tego pokonać.


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 Obejmują tę samą bibliotekę, ale dla mnie nie wyglądają na duplikaty.
— Mark Rotteveel
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.