web-dev-qa-db-fra.com

Serveur ftp à une ligne python

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

90
zio

Obligatoire Twisted exemple:

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.
122
Ali Afshar

Départ pyftpdlib de Giampaolo Rodola. C'est l'un des meilleurs serveurs FTP pour Python. Il est utilisé dans Google Chrome (leur navigateur) et Bazaar (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 de serveur FTP).

A partir de la ligne de commande:

python -m pyftpdlib

Sinon, 'mon_serveur.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 si vous voulez quelque chose de plus compliqué.

Pour obtenir une liste des options de ligne de commande:

python -m pyftpdlib --help

Notez que si vous souhaitez remplacer ou utiliser un port ftp standard, vous devez disposer de privilèges administrateur (par exemple, Sudo).

80
Brian Bruggeman

Pourquoi n'utilisez-vous pas à la place un serveur d'une seule ligne [~ # ~] http [~ # ~] ?

python -m SimpleHTTPServer 8000

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

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

python3 -m http.server 8000

Voir les SimpleHTTPServer docs du module pour 2.x et les docs http.server pour 3.x.

En passant, dans les deux cas, le paramètre port est facultatif.

35
Andrea Spadaccini

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

Python ne peut pas faire ftpd seul, mais vous pouvez utiliser netcat, nc:

nc est fondamentalement un outil intégré à tous les systèmes de type UNIX (même les systèmes intégrés), il est donc parfait pour "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 attente de données.

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

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

Vous pouvez également mettre pv au milieu pour surveiller les progrès 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 nc se fermeront automatiquement et le travail sera fait.

24
Meow

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

Sudo pip install pyftpdlib

python -m pyftpdlib -w

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

Sudo python -m pyftpdlib.ftpserver

15
cdplayer

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

Approfondis:

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

3
Jonathan

La solution la plus simple consiste à utiliser la bibliothèque pyftpd. Cette bibliothèque vous permet de tourner Python sur une seule ligne. Il n’est pas installé par défaut, mais nous pouvons l’installer à l’aide de la simple commande apt.

apt-get install python-pyftpdlib

maintenant du répertoire que vous voulez servir, lancez simplement le module pythod

python -m pyftpdlib -p 21 
2
MVnD3X

Je ne sais pas à propos d'un serveur FTP à une ligne, mais si vous le faites

python -m SimpleHTTPServer

Il va exécuter un serveur HTTP sur 0.0.0.0:8000, servant des fichiers à partir 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.

1
Alex

Bonne liste d'outils à

http://www.willdonnelly.net/blog/file-transfer/

J'ai moi-même utilisé woof à plusieurs reprises. Très agréable.

0
Joe Drumgoole