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.

zio
źródło
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.
Ali Afshar
źródło
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).

Brian Bruggeman
źródło
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.

Andrea Spadaccini
źródło
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.

Miauczeć
źródło
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

odtwarzacz CD
źródło
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/

Jonathan
źródło
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 
MVnD3X
źródło
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ć.

Alex
źródło
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
Shashwot Risal
źródło
@karel Obejmują tę samą bibliotekę, ale dla mnie nie wyglądają na duplikaty.
Mark Rotteveel