KEMBAR78
Getting Started | SSH.NET - A Secure Shell (SSH) library for .NET, optimized for parallelism

Think this page is lacking? Help wanted! Click "Edit this page" at the bottom to begin contributing more examples.

Getting Started

Run a command

using (var client = new SshClient("sftp.foo.com", "guest", new PrivateKeyFile("path/to/my/key")))
{
    client.Connect();
    using SshCommand cmd = client.RunCommand("echo 'Hello World!'");
    Console.WriteLine(cmd.Result); // "Hello World!\n"
}

Upload and list files using SFTP

using (var client = new SftpClient("sftp.foo.com", "guest", "pwd"))
{
    client.Connect();

    using (FileStream fs = File.OpenRead(@"C:\tmp\test-file.txt"))
    {
        client.UploadFile(fs, "/home/guest/test-file.txt");
    }

    foreach (ISftpFile file in client.ListDirectory("/home/guest/"))
    {
        Console.WriteLine($"{file.FullName} {file.LastWriteTime}");
    }
}

Multi-factor authentication

Establish a connection using both password and public-key authentication:

var connectionInfo = new ConnectionInfo("sftp.foo.com",
                                        "guest",
                                        new PasswordAuthenticationMethod("guest", "pwd"),
                                        new PrivateKeyAuthenticationMethod("path/to/my/key"));
using (var client = new SftpClient(connectionInfo))
{
    client.Connect();
}

Verify host identify

Establish a connection using user name and password, and reject the connection if the fingerprint of the server does not match the expected fingerprint:

string expectedFingerPrint = "LKOy5LvmtEe17S4lyxVXqvs7uPMy+yF79MQpHeCs/Qo";

using (var client = new SshClient("sftp.foo.com", "guest", "pwd"))
{
    client.HostKeyReceived += (sender, e) =>
    {
        e.CanTrust = e.FingerPrintSHA256 == expectedFingerPrint;
    };
    client.Connect();
}

When expecting the server to present a certificate signed by a trusted certificate authority:

string expectedCAFingerPrint = "tF3DRTUXtYFZ5Yz0SBOrEbixHaCifHmNVK6FtptXZVM";

using (var client = new SshClient("sftp.foo.com", "guest", "pwd"))
{
    client.HostKeyReceived += (sender, e) =>
    {
        e.CanTrust = e.Certificate?.CertificateAuthorityKeyFingerPrint == expectedCAFingerPrint;
    };
    client.Connect();
}

Authenticating with a user certificate

When you have a certificate for your key which is signed by a certificate authority that the server trusts:

using (var privateKeyFile = new PrivateKeyFile("path/to/my/key", passPhrase: null, "path/to/my/certificate.pub"))
using (var client = new SshClient("sftp.foo.com", "guest", privateKeyFile))
{
    client.Connect();
}

Open a Shell

using (var client = new SshClient("sftp.foo.com", "user", "password"))
{
    client.Connect();
    using ShellStream shellStream = client.CreateShellStream("ShellName", 80, 24, 800, 600, 1024);
    client.Disconnect();
}

Switch to root with "su - root"

using (var client = new SshClient("sftp.foo.com", "user", "password"))
{
    client.Connect();
    using ShellStream shellStream = client.CreateShellStream("ShellName", 80, 24, 800, 600, 1024);
    // Get logged in and get user prompt
    string prompt = shellStream.Expect(new Regex(@"[$>]"));
    // Send command and expect password or user prompt
    shellStream.WriteLine("su - root");
    prompt = shellStream.Expect(new Regex(@"([$#>:])"));
    // Check to send password
    if (prompt.Contains(":"))
    {
        // Send password
        shellStream.WriteLine("password");
        prompt = shellStream.Expect(new Regex(@"[$#>]"));
    }
    client.Disconnect();
}

Stream data to a command

using (var client = new SshClient("sftp.foo.com", "guest", "pwd"))
{
    client.Connect();

    // Make the server echo back the input file with "cat"
    using (SshCommand command = client.CreateCommand("cat"))
    {
        Task executeTask = command.ExecuteAsync(CancellationToken.None);

        using (Stream inputStream = command.CreateInputStream())
        {
            inputStream.Write("Hello World!"u8);
        }

        await executeTask;

        Console.WriteLine(command.ExitStatus); // 0
        Console.WriteLine(command.Result); // "Hello World!"
    }
}