Adding SFTP support to cURL
15 Oct 2012
I was surprised today to find out that cURL does not have SFTP support built in. I ran into the issue trying to get set up with René Moser's awesome git-ftp script, which is exactly what I needed to manage deployments for one of my sites running in a restricted server environment. I'll write more about git-ftp later, but in short, it gives you all the deployment goodness and capabilities of git when you only have FTP access to a server. In particular, I need to use it with SFTP, but kept running into the error
Protocol sftp not supported or disabled in libcurl.
As it turns out, there's no easy way to add SFTP support to cURL. In the end, I had to rebuild the library from source with some special tweaks. I got frustrated from poring over archaic mailing list posts and jumbled documentation, so I wanted to share the steps I took to get it to work.
What you'll need
You'll need to be comfortable doing things at the command line. You'll also need a C compiler of some sort. If you're on a Mac, the XCode Command Line Tools package everything together nicely, otherwise I assume you have an equivalent installed. I did all of this on a Mac, but it should work on Linux as well.
1. Install libssh2
libssh2 is a client-side C library that implements the SSH2 protocol - we need to configure cURL to use this to get SFTP support. Download the tarball from this page, unpack it, and
cd into the directory. Then run:
./configure make make install
It will output a ton of noise to your console, but that's all you have to do here.
2. Install/configure/build cURL using libssh2
Here we're building cURL from source, and linking to libssh2 in the configuration. Same process as before - download the latest release from here, unpack it, and
./configure --with-libssh2=/usr/local make make install
To check that it worked, run
curl -V and ensure that sftp appears somewhere in the Protocols list. If it doesn't, see the note below or make sure that something didn't fail unnoticed during the config/build steps (you may need to run some commands with
In my case, I found that the executable
/usr/bin/curl was outdated and taking precedence over my custom build, which installs to
/usr/local/bin/. I chose to just move the one in
/usr/bin/curl_backup - if you like, you could copy the one from
/usr/bin/. Your call. Edit: The reason for this was that
/usr/bin came before
/usr/local/bin in my path. You can fix this if you like using
I hope this can be of some use to someone! Feel free to leave a comment if you run into any trouble with any of the steps.Tags: curllibssh2sftp Tweet