Is it possible to have a one line command in python to do a simple ftp server? I’d like to be able to do this as quick and temporary way to transfer files to a linux box without having to install a ftp server. Preferably a way using built in python libraries so there’s nothing extra to install.
One line ftp server in python
Each Answer to this Q is separated by one/two green lines.
Obligatory Twisted example:
twistd -n ftp
And probably useful:
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.
Check out pyftpdlib from Giampaolo Rodola. It is one of the very best ftp servers out there for python. It’s used in google’s chromium (their browser) and bazaar (a version control system). It is the most complete implementation on Python for RFC-959 (aka: FTP server implementation spec).
pip3 install pyftpdlib
From the commandline:
python3 -m pyftpdlib
#!/usr/bin/env python3 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()
There’s more examples on the website if you want something more complicated.
To get a list of command line options:
python3 -m pyftpdlib --help
Note, if you want to override or use a standard ftp port, you’ll need admin privileges (e.g. sudo).
Why don’t you instead use a one-line HTTP server?
python -m SimpleHTTPServer 8000
will serve the contents of the current working directory over HTTP on port 8000.
If you use Python 3, you should instead write
python3 -m http.server 8000
By the way, in both cases the port parameter is optional.
The answers above were all assuming your Python distribution would have some third-party libraries in order to achieve the “one liner python ftpd” goal, but that is not the case of what @zio was asking. Also, SimpleHTTPServer involves web broswer for downloading files, it’s not quick enough.
Python can’t do ftpd by itself, but you can use netcat,
nc is basically a built-in tool from any UNIX-like systems (even embedded systems), so it’s perfect for “quick and temporary way to transfer files“.
Step 1, on the receiver side, run:
nc -l 12345 | tar -xf -
this will listen on port 12345, waiting for data.
Step 2, on the sender side:
tar -cf - ALL_FILES_YOU_WANT_TO_SEND ... | nc $RECEIVER_IP 12345
You can also put
pv in the middle to monitor the progress of transferring:
tar -cf - ALL_FILES_YOU_WANT_TO_SEND ...| pv | nc $RECEIVER_IP 12345
After the transferring is finished, both sides of
nc will quit automatically, and job done.
For pyftpdlib users. I found this on the pyftpdlib website. This creates anonymous ftp with write access to your filesystem so please use with due care. More features are available under the hood for better security so just go look:
sudo pip3 install pyftpdlib python3 -m pyftpdlib -w ## updated for python3 Feb14:2020
Might be helpful for those that tried using the deprecated method above.
sudo python -m pyftpdlib.ftpserver
The simpler solution will be to user pyftpd library. This library allows you to spin Python FTP server in one line. It doesn’t come installed by default though, but we can install it using simple apt command
apt-get install python-pyftpdlib
now from the directory you want to serve just run the pythod module
python -m pyftpdlib -p 21
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
pip install twisted
Then the 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()
I dont know about a one-line FTP server, but if you do
python -m SimpleHTTPServer
It’ll run an HTTP server on 0.0.0.0:8000, serving files out of the current directory. If you’re looking for a way to quickly get files off a linux box with a web browser, you cant beat it.