Server ftp di una riga in python


103

È possibile avere un comando di una riga in python per fare un semplice server ftp? Mi piacerebbe essere in grado di farlo come un modo rapido e temporaneo per trasferire file su una macchina Linux senza dover installare un server ftp. Preferibilmente un modo per utilizzare le librerie Python integrate, quindi non c'è niente di extra da installare.


8
A meno che tu non usi una libreria python esterna come pftftpdlib, dubito che tu possa farlo con una riga di codice. Python ha un client ftp integrato, ma non un server.
GWW

3
trasferire file su linux ??? perché non usi solo scp?
Leonmax

Perché non usare sshfs ? Per velocità di trasferimento più veloci (in una LAN) usa l'opzione -o Ciphers=arcfour, cioè sshfs $REMOTEHOST:$DIRECTORY $MOUNTPOINT -o Ciphers=arcfourcopia, sposta, rinomina, gestisci i tuoi file nel tuo filesystem. sshfs è disponibile anche per Mac OSX.
erik

Risposte:


132

Obbligatorio Esempio Twisted :

twistd -n ftp

E probabilmente 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.

4
Molto bella! Ma l'OP ha chiesto di utilizzare la libreria Python standard perché non voleva installare altre librerie.
Andrea Spadaccini

20
Giusto, merito il voto negativo, ma davvero, la gente dovrebbe conoscere Twisted. E ovviamente Twisted è nell'installazione di base di molti Linux.
Ali Afshar

5
Non dovresti votare, l'utente ha detto "preferibilmente", non "necessario". Non c'è modo di farlo con le librerie incorporate di Python, DEVI installare software di terze parti.
André Puel

4
@Andrea Spadaccini: qui persone dal futuro. Abbiamo trovato questa risposta davvero molto utile. ;)
Benjamin Wohlwend

1
@BenjaminWohlwend: più lontano in futuro ... ancora molto utile. Sembra che abbiamo bisogno di un SimpleFTPServer nei builtin.
MGP

90

Dai un'occhiata a pyftpdlib di Giampaolo Rodola. È uno dei migliori server ftp per Python. Viene utilizzato nel Chrome di Google (il browser) e nel bazar (un sistema di controllo delle versioni). È l'implementazione più completa su Python per RFC-959 (aka: specifica di implementazione del server FTP).

Dalla riga di comando:

python -m pyftpdlib

In alternativa "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()

Ci sono più esempi sul sito web se vuoi qualcosa di più complicato.

Per ottenere un elenco di opzioni della riga di comando:

python -m pyftpdlib --help

Nota, se vuoi sovrascrivere o usare una porta ftp standard, avrai bisogno dei privilegi di amministratore (es. Sudo).


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

2
Aggiornato mercoledì 27 agosto 2014 per la versione corrente. Non dovrebbero esserci avvisi di deprecazione, ora.
Brian Bruggeman

è sicuro?
AmirHossein,

@TechJS pyftpdlib supporta ftp su TLS (RFC 4217).
Brian Bruggeman

@BrianBruggeman No, per sicuro intendo non esporre ftp su Internet, non fare nulla di involontario e non rubare i miei dati, voglio dire il codice sorgente è abbastanza sicuro da essere utilizzato in ambienti di produzione?
AmirHossein

40

Perché non usi invece un server HTTP a una riga ?

python -m SimpleHTTPServer 8000

servirà il contenuto della directory di lavoro corrente su HTTP sulla porta 8000.

Se usi Python 3, dovresti invece scrivere

python3 -m http.server 8000

Vedere la documentazione del modulo SimpleHTTPServer per 2.xe la documentazione http.server per 3.x.

A proposito, in entrambi i casi il parametro port è opzionale.


29
Non credo che questo gli permetta di caricare file.
Roman Plášil

2
Nessun curriculum, connessione singola, ecc.
bugmenot123

@ RomanPlášil lo farà, basta eseguire il server su un'altra estremità xD semplicemente così com'è
Reishin

27

Le risposte precedenti presumevano tutte che la vostra distribuzione Python avesse alcune librerie di terze parti per raggiungere l'obiettivo "one liner python ftpd", ma non è questo il caso di ciò che @zio stava chiedendo. Inoltre, SimpleHTTPServer coinvolge il browser web per il download di file, non è abbastanza veloce.

Python non può fare ftpd di per sé, ma è possibile utilizzare netcat , nc:

ncè fondamentalmente uno strumento integrato da qualsiasi sistema simile a UNIX (anche sistemi embedded), quindi è perfetto per " un modo rapido e temporaneo di trasferire file ".

Passaggio 1, lato ricevitore, eseguire:

nc -l 12345 | tar -xf -

questo ascolterà sulla porta 12345, in attesa di dati.

Passaggio 2, lato mittente:

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

Puoi anche mettere pval centro per monitorare l'avanzamento del trasferimento:

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

Al termine del trasferimento, entrambi i lati di ncsi chiuderanno automaticamente e il lavoro sarà completato.


2
A proposito di supporre ... Presumi che i client saranno macchine unix con tare ncdisponibili. E se fossero Windows?
jlh

16

Per gli utenti di pyftpdlib. L'ho trovato sul sito web pyftpdlib. Questo crea un ftp anonimo con accesso in scrittura al tuo filesystem quindi per favore usalo con la dovuta attenzione. Altre funzionalità sono disponibili sotto il cofano per una maggiore sicurezza, quindi dai un'occhiata:

sudo pip3 install pyftpdlib

python3 -m pyftpdlib -w  

## updated for python3 Feb14:2020

Potrebbe essere utile per coloro che hanno provato a utilizzare il metodo deprecato sopra.

sudo python -m pyftpdlib.ftpserver


3
Puoi saltare sudose installi in un venv
balki

1
non dimenticare che c'è la variante v3: pip3 install pyftpdlibe python3 -m pyftpdlib -w. Ha funzionato benissimo per me.
Ron Klein

3

Installare:

pip install twisted

Quindi il codice:

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

Approfondisci:

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


3

La soluzione più semplice sarà quella di utilizzare la libreria pyftpd. Questa libreria ti consente di ruotare il server FTP Python in una riga. Tuttavia, non viene installato di default, ma possiamo installarlo usando il semplice comando apt

apt-get install python-pyftpdlib

ora dalla directory che vuoi servire basta eseguire il modulo pythod

python -m pyftpdlib -p 21 

Sembra buono, ma che tipo di autenticazione avviene? Ottengo "530 Autenticazione fallita".
guettli

1

Non so di un server FTP a una riga, ma se lo fai

python -m SimpleHTTPServer

Eseguirà un server HTTP su 0.0.0.0:8000, servendo file fuori dalla directory corrente. Se stai cercando un modo per estrarre rapidamente i file da una scatola Linux con un browser web, non puoi batterlo.


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 Coprono la stessa libreria, ma non mi sembrano duplicati.
Mark Rotteveel
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.