Connecting to SFTP with key file and password using SSH.NET
16 Jan 2013SSH.NET is an open source library codeplex for SSH and SFTP features. I was able to pull the latest code and get a working client in about 15 minutes. The library is great and the code rather straight forward.
By creating my own ConnectionInfo instance with two authentication methods I was able to connect with a password and a key file.
I was getting a lot of "Invalid private key file" exceptions in the PrivateKeyFile constructor. I needed to convert my private key file from "PuTTY-User-Key-File-2: ssh-rsa" to an OpenSSH format using puttygen. The key should begin with BEGIN RSA PRIVATE KEY. After switching my key file to the supported format I was good to go.
Below is a simple example of connecting to an SFTP site with username/password credentials along with a (RSA or DSA) key file. This example connects to an specific directory and downloads all the listed files.
var localPath = @"C:\Projects\SshProject\CopyTarget";
var keyFile = new PrivateKeyFile(@"C:\Projects\SshProject\OpenSsh-RSA-key.ppk");
var keyFiles = new[] {keyFile};
var username = "username";
var methods = new List<AuthenticationMethod>();
methods.Add(new PasswordAuthenticationMethod(username, "password"));
methods.Add(new PrivateKeyAuthenticationMethod(username, keyFiles));
var con = new ConnectionInfo("example.host.com", 22, username, methods.ToArray());
using (var client = new SftpClient(con))
{
client.Connect();
var files = client.ListDirectory("/ftpfolder/files/");
foreach (var file in files)
{
Console.WriteLine(file);
using (var fs = new FileStream(localPath + file.Name, FileMode.Create))
{
client.DownloadFile(file.FullName, fs);
}
}
}