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.
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.
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).
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.
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.
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
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:
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
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.
Bonne liste d'outils à
http://www.willdonnelly.net/blog/file-transfer/
J'ai moi-même utilisé woof à plusieurs reprises. Très agréable.