Einzeiliger FTP-Server in Python


100

Ist es möglich, einen einzeiligen Befehl in Python zu haben, um einen einfachen FTP-Server auszuführen? Ich möchte dies als schnelle und vorübergehende Möglichkeit zum Übertragen von Dateien auf eine Linux-Box tun können, ohne einen FTP-Server installieren zu müssen. Am besten eine Möglichkeit, eingebaute Python-Bibliotheken zu verwenden, damit nichts extra installiert werden muss.


7
Ich bezweifle, dass Sie dies mit einer Codezeile tun können, es sei denn, Sie verwenden eine externe Python-Bibliothek wie pftftpdlib. Python hat einen eingebauten FTP-Client, aber keinen Server.
GWW

3
Dateien unter Linux übertragen ??? warum benutzt du nicht einfach scp?
Leonmax

Warum nicht sshfs verwenden ? Verwenden Sie für die schnellsten Übertragungsraten (in einem LAN) die Option -o Ciphers=arcfour, dh sshfs $REMOTEHOST:$DIRECTORY $MOUNTPOINT -o Ciphers=arcfourkopieren, verschieben, umbenennen und verwalten Sie Ihre Dateien in Ihrem Dateisystem. sshfs ist auch für Mac OSX verfügbar.
Eric

Antworten:


132

Obligatorisch verdrehtes Beispiel:

twistd -n ftp

Und wahrscheinlich nützlich:

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
Sehr schön! Das OP bat jedoch darum, die Standard-Python-Bibliothek zu verwenden, da er keine anderen Bibliotheken installieren wollte.
Andrea Spadaccini

19
Richtig, ich verdiene eine Abstimmung, aber die Leute sollten Twisted wirklich kennen. Und natürlich ist Twisted in der Basisinstallation vieler Linuxes enthalten.
Ali Afshar

5
Sie sollten nicht abstimmen, sagte der Benutzer "bevorzugt", nicht "notwendig". Es gibt keine Möglichkeit, dies mit in Python integrierten Bibliotheken zu tun. Sie MÜSSEN Software von Drittanbietern installieren.
André Puel

4
@Andrea Spadaccini: Menschen aus der Zukunft hier. Wir fanden diese Antwort in der Tat sehr nützlich. ;)
Benjamin Wohlwend

1
@BenjaminWohlwend: weiter in der Zukunft ... immer noch sehr nützlich. Klingt so, als bräuchten wir einen SimpleFTPServer in den eingebauten.
MGP

89

Schauen Sie sich pyftpdlib von Giampaolo Rodola an. Es ist einer der besten FTP-Server für Python. Es wird in Googles Chrom (ihrem Browser) und Basar (einem Versionskontrollsystem) verwendet. Es ist die vollständigste Implementierung in Python für RFC-959 (auch bekannt als: FTP-Server-Implementierungsspezifikation).

Über die Befehlszeile:

python -m pyftpdlib

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

Es gibt weitere Beispiele auf der Website, wenn Sie etwas Komplizierteres wünschen.

So erhalten Sie eine Liste der Befehlszeilenoptionen:

python -m pyftpdlib --help

Hinweis: Wenn Sie einen Standard-FTP-Port überschreiben oder verwenden möchten, benötigen Sie Administratorrechte (z. B. sudo).


1
Ab 1.3.0: >>> from pyftpdlib import ftpserver:pyftpdlib\ftpserver.py:54: DeprecationWarning: pyftpdlib.ftpserver module is deprecated
Daniel Reis

2
Aktualisiert am 27. August 2014 für die aktuelle Version. Sollte jetzt keine Abwertungswarnungen haben.
Brian Bruggeman

ist das sicher
AmirHossein

@TechJS pyftpdlib unterstützt FTP über TLS (RFC 4217).
Brian Bruggeman

@BrianBruggeman Nein, mit sicher Ich meine, FTP nicht über das Internet verfügbar zu machen, nichts Unbeabsichtigtes zu tun und meine Daten nicht zu stehlen. Ich meine, ist der Quellcode sicher genug, um in Produktionsumgebungen verwendet zu werden?
AmirHossein

39

Warum verwenden Sie nicht stattdessen einen einzeiligen HTTP- Server?

python -m SimpleHTTPServer 8000

wird den Inhalt des aktuellen Arbeitsverzeichnisses über HTTP auf Port 8000 bereitstellen.

Wenn Sie Python 3 verwenden, sollten Sie stattdessen schreiben

python3 -m http.server 8000

Siehe die SimpleHTTPServer-Moduldokumente für 2.x und die http.server- Dokumente für 3.x.

In beiden Fällen ist der Port-Parameter übrigens optional.


29
Ich glaube nicht, dass er damit Dateien hochladen kann.
Roman Plášil

2
Kein Lebenslauf, einzelne Verbindung usw.
bugmenot123

@ RomanPlášil wird es, laufen Sie einfach Server auf einem anderen Ende xD einfach so wie es ist
Reishin

26

Die obigen Antworten gingen alle davon aus, dass Ihre Python-Distribution einige Bibliotheken von Drittanbietern haben würde, um das Ziel "One Liner Python FTPD" zu erreichen, aber das ist nicht der Fall, was @zio verlangte. Außerdem umfasst SimpleHTTPServer einen Webbrowser zum Herunterladen von Dateien. Dies ist nicht schnell genug.

Python kann für sich allein nicht tun ftpd, aber Sie können netcat , nc:

ncist im Grunde ein integriertes Tool von allen UNIX-ähnlichen Systemen (auch von eingebetteten Systemen), daher ist es perfekt für die " schnelle und vorübergehende Übertragung von Dateien ".

Führen Sie Schritt 1 auf der Empfängerseite aus:

nc -l 12345 | tar -xf -

Dies überwacht Port 12345 und wartet auf Daten.

Schritt 2 auf der Absenderseite:

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

Sie können auch pvin die Mitte stellen, um den Fortschritt der Übertragung zu überwachen:

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

Nachdem die Übertragung abgeschlossen ist, werden beide Seiten von ncautomatisch beendet und die Arbeit erledigt.


2
Apropos Annahme ... Sie gehen davon aus, dass die Clients Unix-Computer mit tarund ncverfügbar sein werden. Was ist, wenn es Windows ist?
2.

16

Für pyftpdlib-Benutzer. Ich habe dies auf der pyftpdlib-Website gefunden. Dadurch wird anonymes FTP mit Schreibzugriff auf Ihr Dateisystem erstellt. Verwenden Sie es daher mit der gebotenen Sorgfalt. Weitere Funktionen stehen unter der Haube für mehr Sicherheit zur Verfügung. Schauen Sie einfach mal rein:

sudo pip3 install pyftpdlib

python3 -m pyftpdlib -w  

## updated for python3 Feb14:2020

Könnte für diejenigen hilfreich sein, die versucht haben, die oben beschriebene veraltete Methode zu verwenden.

sudo python -m pyftpdlib.ftpserver


3
Sie können überspringen, sudowenn Sie in einem venv
balki

1
Vergiss nicht, dass es die v3-Variante gibt: pip3 install pyftpdlibund python3 -m pyftpdlib -w. arbeitete wie ein Zauber für mich.
Ron Klein

3

Installieren:

pip install twisted

Dann der Code:

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

Gehen Sie tiefer:

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


3

Die einfachere Lösung besteht darin, die pyftpd-Bibliothek zu verwenden. Mit dieser Bibliothek können Sie den Python-FTP-Server in einer Zeile drehen. Es wird zwar nicht standardmäßig installiert, aber wir können es mit dem einfachen Befehl apt installieren

apt-get install python-pyftpdlib

Führen Sie nun aus dem Verzeichnis, das Sie bedienen möchten, das Python-Modul aus

python -m pyftpdlib -p 21 

Sieht gut aus, aber welche Art von Authentifizierung findet statt? Ich erhalte die Meldung "530-Authentifizierung fehlgeschlagen".
Guettli

1

Ich weiß nichts über einen einzeiligen FTP-Server, aber wenn Sie das tun

python -m SimpleHTTPServer

Auf 0.0.0.0:8000 wird ein HTTP-Server ausgeführt, der Dateien aus dem aktuellen Verzeichnis bereitstellt. Wenn Sie nach einer Möglichkeit suchen, Dateien mit einem Webbrowser schnell von einer Linux-Box zu entfernen, können Sie sie nicht übertreffen.


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 Sie decken dieselbe Bibliothek ab, sehen aber für mich nicht wie Duplikate aus.
Mark Rotteveel

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.