Servidor ftp de una línea en python

101

¿Es posible tener un comando de una línea en Python para hacer un servidor ftp simple? Me gustaría poder hacer esto como una forma rápida y temporal de transferir archivos a una caja de Linux sin tener que instalar un servidor ftp. Preferiblemente una forma de usar bibliotecas de Python integradas para que no haya nada adicional que instalar.

zio
fuente
8
A menos que use una biblioteca de Python externa como pftftpdlib, dudo que pueda hacer esto con una línea de código. Python tiene un cliente ftp integrado, pero no un servidor.
GWW
3
transferir archivos a linux ??? ¿Por qué no usas scp?
Leonmax
¿Por qué no usar sshfs ? Para velocidades de transferencia más rápidas (en una LAN) use la opción -o Ciphers=arcfour, es decir, sshfs $REMOTEHOST:$DIRECTORY $MOUNTPOINT -o Ciphers=arcfoury copie, mueva, cambie el nombre, administre sus archivos en su sistema de archivos. sshfs también está disponible para Mac OSX.
erik

Respuestas:

132

Ejemplo de trenzado obligatorio :

twistd -n ftp

Y probablemente útil:

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
fuente
4
¡Muy agradable! Pero el OP pidió usar la biblioteca estándar de Python porque no quería instalar otras bibliotecas.
Andrea Spadaccini
19
Bien, merezco una votación negativa, pero en realidad, la gente debería conocer a Twisted. Y, por supuesto, Twisted está en la instalación básica de muchos Linux.
Ali Afshar
5
No debe votar en contra, el usuario dijo "preferiblemente", no "necesario". No hay forma de hacer eso con las bibliotecas integradas de Python, DEBE instalar software de terceros.
André Puel
4
@Andrea Spadaccini: gente del futuro aquí. De hecho, encontramos esta respuesta muy útil. ;)
Benjamin Wohlwend
1
@BenjaminWohlwend: más lejos en el futuro ... sigue siendo muy útil. Parece que necesitamos un SimpleFTPServer en los archivos incorporados.
MGP
89

Echa un vistazo a pyftpdlib de Giampaolo Rodola. Es uno de los mejores servidores ftp que existen para Python. Se usa en Google Chrome (su navegador) y Bazar (un sistema de control de versiones). Es la implementación más completa en Python para RFC-959 (también conocida como: especificación de implementación del servidor FTP).

Desde la línea de comandos:

python -m pyftpdlib

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

Hay más ejemplos en el sitio web si quieres algo más complicado.

Para obtener una lista de opciones de la línea de comandos:

python -m pyftpdlib --help

Tenga en cuenta que si desea anular o utilizar un puerto ftp estándar, necesitará privilegios de administrador (por ejemplo, sudo).

Brian Bruggeman
fuente
1
A partir de 1.3.0: >>> from pyftpdlib import ftpserver:pyftpdlib\ftpserver.py:54: DeprecationWarning: pyftpdlib.ftpserver module is deprecated
Daniel Reis
2
Actualizado el 27 de agosto de 2014 para la versión actual. No debería tener advertencias de desaprobación, ahora.
Brian Bruggeman
es esto seguro?
AmirHossein
@TechJS pyftpdlib admite ftp sobre TLS (RFC 4217).
Brian Bruggeman
@BrianBruggeman No, por seguro me refiero a no exponer ftp a través de Internet, no hacer nada involuntario y no robar mis datos, quiero decir, ¿es el código fuente lo suficientemente seguro para ser utilizado en entornos de producción?
AmirHossein
39

¿Por qué no usa en su lugar un servidor HTTP de una línea ?

python -m SimpleHTTPServer 8000

servirá el contenido del directorio de trabajo actual a través de HTTP en el puerto 8000.

Si usa Python 3, debería escribir

python3 -m http.server 8000

Consulte los documentos del módulo SimpleHTTPServer para 2.xy los documentos http.server para 3.x.

Por cierto, en ambos casos el parámetro del puerto es opcional.

Andrea Spadaccini
fuente
29
No creo que esto le permita subir archivos.
Roman Plášil
2
Sin currículum, conexión única, etc.
bugmenot123
@ RomanPlášil lo hará, simplemente ejecute el servidor en otro extremo xD simplemente como está
Reishin
26

Todas las respuestas anteriores suponían que su distribución de Python tendría algunas bibliotecas de terceros para lograr el objetivo de "una línea de python ftpd", pero ese no es el caso de lo que preguntaba @zio. Además, SimpleHTTPServer implica un navegador web para descargar archivos, no es lo suficientemente rápido.

Python no puede hacer ftpd por sí mismo, pero se puede usar netcat , nc:

nces básicamente una herramienta incorporada de cualquier sistema tipo UNIX (incluso sistemas embebidos), por lo que es perfecta para " una forma rápida y temporal de transferir archivos ".

Paso 1, en el lado del receptor, ejecute:

nc -l 12345 | tar -xf -

esto escuchará en el puerto 12345, esperando datos.

Paso 2, en el lado del remitente:

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

También puede poner pven el medio para monitorear el progreso de la transferencia:

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

Una vez finalizada la transferencia, ambos lados ncse cerrarán automáticamente y se completará el trabajo.

maullar
fuente
2
Hablando de asumir ... Usted asume que los clientes van a ser máquinas Unix con tary ncdisponibles. ¿Y si son ventanas?
jlh
16

Para usuarios de pyftpdlib. Encontré esto en el sitio web de pyftpdlib. Esto crea un ftp anónimo con acceso de escritura a su sistema de archivos, así que utilícelo con el debido cuidado. Hay más funciones disponibles debajo del capó para una mayor seguridad, así que solo mira:

sudo pip3 install pyftpdlib

python3 -m pyftpdlib -w  

## updated for python3 Feb14:2020

Podría ser útil para aquellos que intentaron usar el método obsoleto anterior.

sudo python -m pyftpdlib.ftpserver

reproductor de CD
fuente
3
Puede omitir sudosi instala en un venv
balki
1
no olvide que existe la variante v3: pip3 install pyftpdliby python3 -m pyftpdlib -w. funcionó como un encanto para mí.
Ron Klein
3

Instalar en pc:

pip install twisted

Entonces el código:

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

Profundizar:

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

Jonathan
fuente
3

La solución más simple será utilizar la biblioteca pyftpd. Esta biblioteca le permite girar el servidor FTP de Python en una línea. Sin embargo, no viene instalado por defecto, pero podemos instalarlo usando el comando apt simple

apt-get install python-pyftpdlib

ahora desde el directorio que desea servir, simplemente ejecute el módulo de método

python -m pyftpdlib -p 21 
MVnD3X
fuente
Se ve bien, pero ¿qué tipo de autenticación ocurre? Recibo "530 Autenticación fallida".
guettli
1

No conozco un servidor FTP de una línea, pero si lo sabe

python -m SimpleHTTPServer

Ejecutará un servidor HTTP en 0.0.0.0:8000, sirviendo archivos del directorio actual. Si está buscando una forma de sacar rápidamente archivos de una caja de Linux con un navegador web, no puede superarlo.

Alex
fuente
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
fuente
@karel Cubren la misma biblioteca, pero no me parecen duplicados.
Mark Rotteveel