Serveur FTP d'une ligne en python

103

Est-il possible d'avoir une commande d'une ligne en python pour faire un simple serveur ftp? J'aimerais pouvoir le faire comme moyen rapide et temporaire de transférer des fichiers vers une machine Linux sans avoir à installer un serveur ftp. De préférence, un moyen d'utiliser des bibliothèques python intégrées, donc il n'y a rien de plus à installer.

zio
la source
8
À moins que vous n'utilisiez une bibliothèque python externe comme pftftpdlib, je doute que vous puissiez le faire avec une seule ligne de code. Python a un client ftp intégré, mais pas de serveur.
GWW
3
transférer des fichiers vers Linux ??? pourquoi n'utilisez-vous pas simplement scp?
Leonmax
Pourquoi ne pas utiliser sshfs ? Pour les taux de transfert les plus rapides (dans un LAN), utilisez l'option -o Ciphers=arcfour, c'est sshfs $REMOTEHOST:$DIRECTORY $MOUNTPOINT -o Ciphers=arcfour-à- dire copiez, déplacez, renommez, gérez vos fichiers dans votre système de fichiers. sshfs est également disponible pour Mac OSX.
erik

Réponses:

132

Exemple Twisted obligatoire :

twistd -n ftp

Et probablement utile:

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
la source
4
Très agréable! Mais l'OP a demandé à utiliser la bibliothèque python standard car il ne voulait pas installer d'autres bibliothèques.
Andrea Spadaccini le
20
Oui, je mérite un vote défavorable, mais vraiment, les gens devraient connaître Twisted. Et bien sûr, Twisted est dans l'installation de base de nombreux Linux.
Ali Afshar le
5
Vous ne devriez pas voter, l'utilisateur a dit «de préférence», pas «nécessaire». Il n'y a aucun moyen de faire cela avec les bibliothèques intégrées python, vous DEVEZ installer un logiciel tiers.
André Puel
4
@Andrea Spadaccini: des gens du futur ici. Nous avons trouvé cette réponse très utile, en effet. ;)
Benjamin Wohlwend
1
@BenjaminWohlwend: plus loin dans le futur ... toujours très utile. On dirait que nous avons besoin d'un SimpleFTPServer dans les intégrés.
MGP
90

Découvrez pyftpdlib de Giampaolo Rodola. C'est l'un des meilleurs serveurs ftp pour python. Il est utilisé dans le chrome de Google (leur navigateur) et le bazar (un système de contrôle de version). C'est l'implémentation la plus complète sur Python pour RFC-959 (aka: spécification d'implémentation du serveur FTP).

Depuis la ligne de commande:

python -m pyftpdlib

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

Il y a plus d'exemples sur le site Web si vous voulez quelque chose de plus compliqué.

Pour obtenir une liste d'options de ligne de commande:

python -m pyftpdlib --help

Notez que si vous souhaitez remplacer ou utiliser un port ftp standard, vous aurez besoin de privilèges d'administrateur (par exemple sudo).

Brian Bruggeman
la source
1
A partir de 1.3.0: >>> from pyftpdlib import ftpserver:pyftpdlib\ftpserver.py:54: DeprecationWarning: pyftpdlib.ftpserver module is deprecated
Daniel Reis
2
Mise à jour le 27 août 2014 pour la version actuelle. Ne devrait pas avoir d'avertissements d'obsolescence, maintenant.
Brian Bruggeman
est-ce sécurisé?
AmirHossein
@TechJS pyftpdlib prend en charge le ftp sur TLS (RFC 4217).
Brian Bruggeman
@BrianBruggeman Non par sécurisé, je veux dire ne pas exposer ftp sur Internet, ne rien faire involontairement et ne pas voler mes données, je veux dire est-ce que le code source est suffisamment sécurisé pour être utilisé dans des environnements de production?
AmirHossein
40

Pourquoi n'utilisez-vous pas à la place un serveur HTTP à une ligne ?

python -m SimpleHTTPServer 8000

servira le contenu du répertoire de travail actuel via HTTP sur le port 8000.

Si vous utilisez Python 3, vous devriez plutôt écrire

python3 -m http.server 8000

Consultez la documentation du module SimpleHTTPServer pour 2.x et la documentation http.server pour 3.x.

À propos, dans les deux cas, le paramètre de port est facultatif.

Andrea Spadaccini
la source
29
Je ne pense pas que cela lui permette de télécharger des fichiers.
Roman Plášil
2
Pas de CV, connexion unique, etc.
bugmenot123
@ RomanPlášil ça va, il suffit d'exécuter le serveur sur une autre extrémité xD simplement comme il est
Reishin
27

Les réponses ci-dessus supposaient toutes que votre distribution Python aurait des bibliothèques tierces afin d'atteindre l'objectif "one liner python ftpd", mais ce n'est pas le cas de ce que @zio demandait. De plus, SimpleHTTPServer implique un navigateur Web pour le téléchargement de fichiers, ce n'est pas assez rapide.

Python ne peut pas faire ftpd par lui - même, mais vous pouvez utiliser netcat , nc:

ncest fondamentalement un outil intégré à partir de tous les systèmes de type UNIX (même les systèmes embarqués), il est donc parfait pour " un moyen rapide et temporaire de transférer des fichiers ".

Étape 1, côté récepteur, exécutez:

nc -l 12345 | tar -xf -

cela écoutera sur le port 12345, en attendant les données.

Étape 2, côté expéditeur:

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

Vous pouvez également mettre pvau milieu pour suivre la progression du transfert:

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

Une fois le transfert terminé, les deux côtés de ncs'arrêteront automatiquement et le travail sera terminé.

Miaou
la source
2
En parlant de supposer ... Vous supposez que les clients vont être des machines Unix avec taret ncdisponibles. Et si c'était Windows?
jlh
16

Pour les utilisateurs de pyftpdlib. J'ai trouvé ceci sur le site Web de pyftpdlib. Cela crée un ftp anonyme avec un accès en écriture à votre système de fichiers, veuillez donc l'utiliser avec précaution. Plus de fonctionnalités sont disponibles sous le capot pour une meilleure sécurité, alors allez voir:

sudo pip3 install pyftpdlib

python3 -m pyftpdlib -w  

## updated for python3 Feb14:2020

Cela pourrait être utile pour ceux qui ont essayé d'utiliser la méthode obsolète ci-dessus.

sudo python -m pyftpdlib.ftpserver

lecteur CD
la source
3
Vous pouvez sauter sudosi vous installez dans un venv
balki
1
n'oubliez pas qu'il existe la variante v3: pip3 install pyftpdlibet python3 -m pyftpdlib -w. A fonctionné à merveille pour moi.
Ron Klein
3

Installer:

pip install twisted

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

Approfondissez:

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

Jonathan
la source
3

La solution la plus simple sera d'utiliser la bibliothèque pyftpd. Cette bibliothèque vous permet de faire tourner le serveur FTP Python en une seule ligne. Il n'est pas installé par défaut, mais nous pouvons l'installer en utilisant une simple commande apt

apt-get install python-pyftpdlib

maintenant à partir du répertoire que vous souhaitez servir, exécutez simplement le module pythod

python -m pyftpdlib -p 21 
MVnD3X
la source
Ça a l'air bien, mais quel type d'authentification se produit? J'obtiens "530 Authentification échouée."
guettli
1

Je ne connais pas un serveur FTP à une ligne, mais si vous le faites

python -m SimpleHTTPServer

Il exécutera un serveur HTTP sur 0.0.0.0:8000, servant des fichiers hors du répertoire actuel. Si vous cherchez un moyen d'extraire rapidement des fichiers d'une boîte Linux avec un navigateur Web, vous ne pouvez pas le battre.

Alex
la source
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
la source
@karel Ils couvrent la même bibliothèque, mais ils ne me ressemblent pas.
Mark Rotteveel