More .NET components

SCP

SCP is a legacy file transfer protocol, or rather a command-line program, a secure analog of rcp that runs over a secure SSH channel. SCP has a very limited feature set and only supports file transfer. In most cases, using SFTP is a better choice. However, SCP is still useful with legacy SSH servers that don't support SFTP yet.

Connecting and authenticating #

Connecting and authenticating with Scp object is the same as with Sftp object. For more information and sample code, see Connecting and Proxies sections.

To connect to a server running on default port 22, use Connect method. Once connected, don't forget to check the server's fingerprint as a security measure.

CSharp

// create SCP client instance
using (Scp scp = new Rebex.Net.Scp())
{
    // connect
    scp.Connect(hostname);

    // check scp.Fingerprint here

    // authenticate
    scp.Login(username, password);

    // upload or download files
    // ...

    // disconnect (not required by most servers, but polite)
    scp.Disconnect();
}

VisualBasic

' create SCP client instance
Using scp As New Rebex.Net.Scp
    ' connect to a server
    scp.Connect(hostname)

    ' check scp.Fingerprint here

    ' authenticate
    scp.Login(username, password)

    ' upload or download files
    ' ...

    ' disconnect (not required by most servers, but polite)
    scp.Disconnect()
End Using

To connect to a server running on non-standard port, just pass the port number to the Connect method as an additional argument.

Uploading or downloading a single file #

Use PutFile method to upload a single file, and GetFile method to download it. Both methods require a target name, which means it's possible to use a different target file name if needed.

There is no concept of a current directory in SCP. If the specified remote path is a not an absolute path, the user's home directory at the remote server will be used as base directory.

CSharp

// upload "file.txt" file to user's home directory at the server
scp.PutFile(@"C:\MyData\file.txt", "file.txt");

// upload "file.txt" file to "/MyData" at the server as "data.txt"
scp.PutFile(@"C:\MyData\file.txt", "/MyData/data.txt");

// download "/MyData/data.txt" file from the server
scp.GetFile("/MyData/data.txt", @"C:\MyData\data.txt");

VisualBasic

' upload "file.txt" file to user's home directory at the server
scp.PutFile("C:\MyData\file.txt", "file.txt")

' upload "file.txt" file to "/MyData" at the server as "data.txt"
scp.PutFile("C:\MyData\file.txt", "/MyData/data.txt")

' download "/MyData/data.txt" file from the server
scp.GetFile("/MyData/data.txt", "C:\MyData\data.txt")

Stream-based upload/download methods are available as well. They are equivalent to their SFTP counterparts.

Uploading or downloading multiple files #

To transfer a directory with multiple files or subdirectories to/from an SSH server, use GetFiles and PutFiles methods. Te target directory is created automatically if it doesn't already exist.

CSharp

// upload content of "MyData" directory to "/MyData" directory at the server
scp.Upload(@"C:\MyData\*", "/MyData");

// download content of "MyData" directory from the server to a local directory
scp.Download("/MyData/*", @"C:\MyData");

VisualBasic

' upload content of "MyData" directory to "/MyData" directory at the server
scp.Upload("C:\MyData\*", "/MyData")

' download content of "MyData" directory from the server to a local directory
scp.Download("/MyData/*", "C:\MyData")

Progress reporting #

Scp provides two progress-reporting events: TransferProgress for single-file operations, and BatchTransferProgress for multiple-file operations.

Sample multi-file transfer progress event handler:

CSharp

void scp_BatchTransferProgress(object sender, ScpBatchTransferProgressEventArgs e)
{
    if (e.Operation == ScpBatchTransferOperation.FileTransferStarting)
    {
        switch (e.State)
        {
            case ScpTransferState.Downloading:
                Console.WriteLine("Downloading {0} -> {1}",
                                    e.RemotePath,
                                    e.LocalPath);
                break;
            case ScpTransferState.Uploading:
                Console.WriteLine("Uploading {0} -> {1}",
                                    e.LocalPath,
                                    e.RemotePath);
                break;
        }
    }
}

VisualBasic

Sub scp_BatchTransferProgress(ByVal sender As Object, ByVal e As ScpBatchTransferProgressEventArgs)
    If e.Operation = ScpBatchTransferOperation.FileTransferStarting Then
        Select Case e.State
            Case ScpTransferState.Downloading
                Console.WriteLine("Downloading {0} -> {1}",
                                  e.RemotePath,
                                  e.LocalPath)
            Case ScpTransferState.Uploading
                Console.WriteLine("Uploading {0} -> {1}",
                                  e.LocalPath,
                                  e.RemotePath)
        End Select
    End If
End Sub

Registering the event handler:

CSharp

// register BatchTransferProgress event handler
scp.BatchTransferProgress += scp_BatchTransferProgress;

// transfer files
// ...

VisualBasic

' register BatchTransferProgress event  handler
AddHandler scp.BatchTransferProgress, AddressOf scp_BatchTransferProgress

' transfer files
' ...