16 releases (8 stable)

Uses old Rust 2015

3.0.1 Apr 15, 2018
3.0.0 Feb 28, 2018
2.2.1 Mar 2, 2017
2.1.2 Sep 30, 2017
0.0.2 Nov 28, 2014

#162 in #secure

Download history 1054/week @ 2024-03-17 1078/week @ 2024-03-24 1857/week @ 2024-03-31 821/week @ 2024-04-07 1056/week @ 2024-04-14 963/week @ 2024-04-21 977/week @ 2024-04-28 790/week @ 2024-05-05 897/week @ 2024-05-12 847/week @ 2024-05-19 1037/week @ 2024-05-26 1282/week @ 2024-06-02 1109/week @ 2024-06-09 1187/week @ 2024-06-16 875/week @ 2024-06-23 521/week @ 2024-06-30

3,800 downloads per month
Used in 21 crates (13 directly)


525 lines


FTP client for Rust

Number of Crate Downloads Crate Version Crate License Build Status Coverage Status



FTPS support is disabled by default. To enable it secure should be activated in Cargo.toml.

ftp = { version = "<version>", features = ["secure"] }


extern crate ftp;

use std::str;
use std::io::Cursor;
use ftp::FtpStream;

fn main() {
    // Create a connection to an FTP server and authenticate to it.
    let mut ftp_stream = FtpStream::connect("").unwrap();
    let _ = ftp_stream.login("username", "password").unwrap();

    // Get the current directory that the client will be reading from and writing to.
    println!("Current directory: {}", ftp_stream.pwd().unwrap());
    // Change into a new directory, relative to the one we are currently in.
    let _ = ftp_stream.cwd("test_data").unwrap();

    // Retrieve (GET) a file from the FTP server in the current working directory.
    let remote_file = ftp_stream.simple_retr("ftpext-charter.txt").unwrap();
    println!("Read file with contents\n{}\n", str::from_utf8(&remote_file.into_inner()).unwrap());

    // Store (PUT) a file from the client to the current working directory of the server.
    let mut reader = Cursor::new("Hello from the Rust \"ftp\" crate!".as_bytes());
    let _ = ftp_stream.put("greeting.txt", &mut reader);
    println!("Successfully wrote greeting.txt");

    // Terminate the connection to the server.
    let _ = ftp_stream.quit();


Licensed under either of

at your option.


Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in the work by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions.

Development environment

All you need to develop rust-ftp and run the tests is Rust and Docker. The tests folder contains a Dockerfile that installs and configures the vsftpd server.

To create the Docker image:

docker build -t ftp-server tests

To start the FTP server that is tested against:


This script runs the ftp-server image in detached mode and starts the vsftpd daemon. It binds ports 21 (FTP) as well as the range 65000-65010 for passive connections.

Once you have an instance running, to run tests type:

cargo test

The following commands can be useful:

# List running containers of ftp-server image
# (to include stopped containers use -a option)
docker ps --filter ancestor=ftp-server

# To stop and remove a container
docker stop container_name
docker rm container_name

# To remove the image
docker rmi ftp-server


~119K SLoC