edtFTPnet/PRO - Secure FTP component for .NET | Free Trial | Pricing

SSHSCPClient Class

Provides low-level access to SCP functionality.

Definition

Namespace: EnterpriseDT.Net.Ftp.Ssh
Assembly: edtFTPnetPRO (in edtFTPnetPRO.dll) Version: 12.7.0.0
C#
public class SSHSCPClient : IExFileTransferClient, 
	IFileTransferClient
Inheritance
Object    SSHSCPClient
Derived
Implements
IExFileTransferClient, IFileTransferClient

Remarks

SSHSCPClient supports SOCKS (4, 4A, and 5) and SFTP.

SSHSCPClient supports SFTP, which stands for SSH File Transfer Protocol. Essentially, it is file transfer over an SSH connection, hence it has the security of SSH. SFTP is only superficially related to FTP and FTPS. It achieves the same goals of file transfer and related operations, but the underlying protocol is entirely different.

Example

This example shows a simple SFTP session.
C#
// create an SCP client
SSHSCPClient ftp = new SSHSCPClient();
ftp.RemoteHost = "192.168.10.123";

// Turn off server validation (ONLY do this when testing)
ftp.ServerValidation = SecureFTPServerValidationType.None;

// set up the credentials for password authentication (the default)
ftp.UserName = "myuser";
ftp.Password = "mypassword";

// connect to the server
ftp.Connect();                        

// get a file
ftp.Get("file.txt", "file.txt");

// close the connection
ftp.Quit();

This example uses password authentication and does not attempt to verify the server (which should always be done in production systems).

Server Validation: The examples above used no server validation. This is only normally acceptable only when testing. To be secure applications should always validate the server that they're communicating with. If the ServerValidation property is set to SecureFTPServerValidationType.Automatic or SecureFTPServerValidationType.AutomaticIgnoreHostName then SSHSCPClient will attempt to validate the server's public key upon connection.

Public keys are managed by the KnownHostsManager, available in the KnownHosts property. There are two ways that the client can load server public keys - via the known_hosts file or by explicitly loading a public key from a file.

  1. Known_hosts – Many SSH implementations use a file called known_hosts which is loaded by clients to validate servers. Typically, this file is generated when the client first connects to a server - a prompt asks if the server should be added to the list of known hosts. The known_hosts file contains a list of approved servers and their public keys. The KnownHostsManager has a property called KnownHostsFile. The path of the known_hosts file should be assigned to this property to load the known hosts in that file.
  2. Public key files – Server public keys can also be maintained in their own key file and be used for server validation without adding them to the known_hosts file. The KnownHostsManager supports explicitly adding server public keys via the AddKnownHost(String, String) method. This requires the hostname and the public key file. SSH public key files have two standard formats - OpenSSH and SECSH. Both these public key formats are supported.

Client Validation: Client authentication can be either by password, by public/private keys, or by keyboard- interactive authentication. The default is password authentication. The current authentication method can be found (and set) from the AuthenticationMethod property.

  1. Password authentication – In password authentication, the UserName and Password properties must be set, along with the ServerAddress. The user name and password should be that of the SSH user that the client is logging in as. Note that some SFTP servers are set up to disallow password authentication, in which case the connection attempt will fail unless password authentication is enabled in the server configuration file.
  2. Public key authentication – In public key authentication, SSH clients and servers authenticate each other via public/private key pairs. Each must have access to their own private key, and they must have access to each other's public key. The client's public key must be registered with the SSH server, typically by copying it into the server's authorized_keys file. The client's private key is loaded via the ClientPrivateKeyFile property. Both DSA and RSA keypairs can be used. The UserName and Password properties must be set, along with the RemoteHost. Here the password is the passphrase of the private key file. The AuthenticationMethod property must also be set to PublicKey. There are no formal standards for SSH private key files, however two main formats are in common use - ssh.com and OpenSSH. Both are supported.
  3. Keyboard-interactive authentication – Keyboard-interactive (KBI) authentication is the most recently introduced form of authentication for SSH. It involves the server sending prompts to the client, which the client must respond to correctly to be authenticated. Its purpose is permit the client to support a variety of authentication mechanisms without knowing anything about them. This implementation of KBI authentication relies on the programmer knowing the prompts in advance. The prompts are easily determined by connecting to the server via a command-line ssh client, using KBI. when the server sends its list of prompts that require responses, the client searches the list of loaded SSHAuthPrompts for each prompt. It then sends the set responses back to the server. If the expected responses are supplied, the authentication succeeds. If the prompt is for a user's password, it will typically be something like "Password:". The SSHPasswordPrompt class is supplied to make it easier to set up a password prompt. To set up the prompts, an array of SSHAuthPrompts is assigned to the KBIPrompts property. Note that to use KBI, the AuthenticationMethod property must also be set to KeyboardInteractive.

Server Compatibility: Generally, this class should work with most SCP servers. Some servers return an error saying the file does not exist after creating it. By default, the client does a permission change after creating the file, which is done to ensure the file permissions are correct. If this error is encountered, try setting the ServerCompatibility property to SSHDisableChmodAfterPut to try to eliminate the problem.

Public key algorithms: Either DSA or RSA or both can be set for the preferred public key algorithms for server authentication. If, for example, RSA is set, the server will present an RSA public key to the client (if the server supports RSA keys of course - some servers do not). The PreferredHostKeyAlgorithms property is a bitwise flag and can be set to combinations of the SSHPublicKeyAlgorithm enum values by OR'ing them together. The default is all algorithms enabled.

Cipher algorithms: The cipher algorithms are the symmetric algorithms used to perform the encryption of the SFTP data and commands. The PreferredCipherAlgorithms property is a bitwise flag and can be set to combinations of the SSHCipherAlgorithm enum values by OR'ing them together. The default is all algorithms enabled.

SOCKS: SOCKS may be used for FTPing through firewalls. For this to be possible a SOCKS proxy must be available, and a user account must be set up on that proxy. SSLFTPClient supports all the popular versions of SOCKS - 4, 4A, and 5.

The SOCKS features are controlled entirely through the SocksContext property. If it is null (the default) then SOCKS is not used. To use SOCKS, the property must be set to an instance of Socks4Context or Socks5Context. For example, for SOCKS4:

mySCPClient.SocksContext = new Socks4Context("192.168.0.2", 1080, "marvin23"); and for SOCKS5: Socks5Context socksContext = new Socks5Context("192.168.0.2", 1080); socksContext.AuthMethods.Add(new Socks5NoAuthMethod()); socksContext.AuthMethods.Add(new Socks5UserNamePasswordAuthMethod("marvin23", "m31erk")); mySCPClient.SocksContext = socksContext;

Constructors

SSHSCPClient Default constructor.

Properties

AuthenticationMethod Get or set the current authentication method being used.
ClientPrivateKeyBytes 
ClientPrivateKeyFilePath of the private key file used to authenticate the client
ClientPrivateKeyPassphrasePassphrase of the private key file.
CloseStreamsAfterTransfer If true then streams are closed after a transfer has completed.
ControlPort The port on the server to which to connect the control-channel.
DeleteOnFailure Controls whether or not a file is deleted when a failure occurs.
DetectTransferMode If set to true, the transfer mode in operations involving multiple files is automatically changed between ASCII and binary as appropriate.
IsConnected Indicates whether the client is currently connected with the server.
IsResuming Returns true if the next transfer is to be resumed (i.e. Resume has been called).
KBIPrompts Array of prompts used for keyboard interactive (KBI) authentication.
KnownHostsManager of the list of known hosts used to authenticate the server.
LastBytesTransferred The number of bytes transferred in the last transfer operation.
LastFileTransferred The remote name/path of the last file transferred.
LicenseKey The license key string.
LicenseOwner The license owner string.
LogTagLog tag
MaxPacketSize The SSH maximum packet size.
MaxTransferRate The maximum transfer rate in bytes per sec
PasswordPassword of account on the server or the passphrase of the private key file.
PreferredCipherAlgorithmsPreferred algorithm(s) to use for encryption.
PreferredCompressionAlgorithmsPreferred algorithm(s) to use for data compression
PreferredHostKeyAlgorithmsPreferred algorithm(s) to use for server authentication via public key
PreferredKeyExchangeMethodsPreferred methods to use for key exchange.
PreferredMACAlgorithmsPreferred MAC algorithm(s)
ProxySettings Settings for using proxies.
RemoteHost The domain-name or IP address of the SFTP server.
RetryAuth By default, authentication is retried automatically using a different method if it fails.
SendInitialWindowAdjust Determines whether a SSH_MSG_CHANNEL_WINDOW_ADJUST message should be sent initially (true by default).
ServerCompatibility Controls various server compatibility features.
ServerValidation Controls the way in which remote servers are validated.
ShowHiddenFiles Include hidden files in operations that involve listing of directories, and if supported by the server. Not supported in SFTP.
TCPBufferSize The size of the TCP read and write buffers. The default value means the Microsoft defaults are used.
Timeout Overall timeout in milliseconds for waiting for messages and underlying timeouts on sockets.
TransferBufferSize The size of the buffers (in bytes) used in writing to and reading from the data-sockets.
TransferNotifyInterval The number of bytes transferred between each notification of the BytesTransferred event.
TransferNotifyListings By default the BytesTransferred event is not triggered during directory listings - this property can be used to enable this behaviour.
TransferTypeThe current file transfer type (BINARY or ASCII).
UserNameUser-name of account on the server.
WelcomeMessage Server's banner.
WindowSize The SSH window size.

Methods

CancelResume Cancel the resume. Use this method if something goes wrong and the server is left in an inconsistent state. Not used in SCP as resume is not supported
CancelTransferCancels the current transfer.
CdUp Change the remote working directory to parent
ChDir Change the remote working directory
CheckConnection Checks if the client has connected to the server and throws an exception if it hasn't. This is only intended to be used by subclasses
CheckTimeout Check to see if the timeout has expired
CloseSocket 
Connect Establish a connection to the SFTP server
DeleteDelete the specified remote file.
Dir List current directory's contents as an array of strings of filenames.
Dir(String) List a directory's contents as an array of strings of filenames.
Dir(String, Boolean) List a directory's contents as an array of strings.
DirDetails List the current directory's contents as an array of FTPFile objects.
DirDetails(String) List a directory's contents as an array of FTPFile objects.
DirDetails(String, FTPFileCallback) 
DirDetails(String, Boolean) Returns the given directory's contents and optionally that of its subdirectories as an array of FTPFile objects.
EqualsDetermines whether the specified object is equal to the current object.
(Inherited from Object)
ExecuteCommand 
Exists Checks for the existence of a file on the server.
FinalizeAllows an object to try to free resources and perform other cleanup operations before it is reclaimed by garbage collection.
(Inherited from Object)
Get(String)Get data from the SFTP server.
Get(Stream, String) Get data from the server
Get(String, String) Get data from the SFTP server using the currently set transfer mode.
GetHashCodeServes as the default hash function.
(Inherited from Object)
GetLocalCRC Get the CRC-32 checksum for the named local file
GetRemoteCRC Get the CRC-32 checksum for the named remote file. Not supported in SFTP.
GetTypeGets the Type of the current instance.
(Inherited from Object)
MemberwiseCloneCreates a shallow copy of the current Object.
(Inherited from Object)
MkDirCreate the specified remote working directory.
ModTimeGet modification time for a remote file.
MultipleDelete(FileFilter) Delete multiple files in the current remote directory
MultipleDelete(String) Delete multiple files in the current remote directory
MultipleDelete(String, FileFilter, Boolean) Delete multiple files in the current remote directory and its subdirectories.
MultipleDelete(String, String, Boolean) Delete multiple files in the current remote directory and its subdirectories.
MultipleDeleteDirectories Remove a remote directory, and all its files and its subdirectories
MultipleGet(String, FileFilter) Get multiple files into the specified local directory from the current remote directory
MultipleGet(String, String) Get multiple files into the specified local directory from the current remote directory
MultipleGet(String, String, FileFilter, Boolean) Get multiple files from the specified remote directory into the specified local directory
MultipleGet(String, String, String, Boolean) Get multiple files from the specified remote directory into the specified local directory
MultiplePut(String, FileFilter) Put multiple files from the specified local directory into the current remote directory
MultiplePut(String, String) Put multiple files from the specified local directory into the current remote directory
MultiplePut(String, String, FileFilter, Boolean) Put multiple files from the specified local directory into the specified remote directory
MultiplePut(String, String, String, Boolean) Put multiple files from the specified local directory into the specified remote directory
OnBytesTransferred 
OnCommandSent 
OnReplyReceived 
OnTransferCancelled 
OnTransferCompleteEx 
OnTransferStartedEx 
Put(Byte, String) Put data onto the server
Put(Stream, String) Put a stream of data onto the FTP server in the current directory.
Put(String, String) Put a local file onto the SFTP server in the current directory.
Put(Byte, String, Boolean) Put data onto the SFTP server in the current directory. Allows appending if current file exists.
Put(Stream, String, Boolean) Put a stream of data onto the FTP server in the current directory. Allows appending if current file exists
Put(String, String, Boolean) Upload a local file to the server
Pwd Get the current remote working directory
Quit Quit the session
QuitImmediately Quit the session immediately. Just close the socket. Don't send any messages to the server.
Rename Rename a remote file
ResumeMake the next file transfer (put or get) resume.
ResumeDownloadMake the next download resume at a specific point.
RmDir Remove a directory
SetModTimeSet modification time for a remote file.
Size Get the size of a remote file.
TestConnection Tests the connection
ToStringReturns a string that represents the current object.
(Inherited from Object)
Unlock Unlock the software for use. This method should be used when a configuration file isn't available

Events

BytesTransferred Event triggered every time TransferNotifyInterval bytes transferred.
CommandSent Triggered every time a command is sent to the server.
ReplyReceived Triggered every time a logical reply is received from the server. In SFTP this will NOT be triggered for every packet that arrives.
TransferCancelled Notifies of the cancellation of a transfer
TransferCompleteEx Notifies of the completion of a transfer
TransferStartedEx Notifies of the start of a transfer
ValidatingServer Notifies that the server must be validated

Fields

_proxySettings Proxy settings
cancelTransfer Can be used to cancel a transfer
closeStreamsAfterTransfer If true then streams are closed after a transfer has completed.
compatFlags Configuration flags for non-compliant servers
compressionAlg Compression algorithms
controlPort 
cwd Current remote working directory
DEFAULT_BUFFER_SIZE Transfer buffer size
DEFAULT_MONITOR_INTERVAL Default byte interval for transfer monitor
DEFAULT_TIMEOUT Default timeout for waiting for a server reply
deleteOnFailureIf a download to a file fails, delete the partial file
detectTransferMode Do we detect transfer mode when transferring files?
key License key
knownHostsManagerManages the list of known hosts
lastBytesTransferred Holds the number of bytes transferred in that most recent transfer.
lastFileTransferred Name of the last file transferred.
logTag Logging tag
monitorInterval Bytes transferred in between monitor callbacks
owner License owner
prompts List of authorization prompts
remoteHost Remote host we are connecting to
remoteIPAddress IP address of remote host in string form
resume If true, a file transfer is being resumed
serverValidationDetermines how the remote host is validated
socket 
socks SOCKS settings
tcpBufferSize The TCP read and write buffer sizes
throttler Threshold for throttling
timeoutTimeout in milliseconds
transferBufferSize Size of transfer buffers
transferNotifyListings Should BytesTransferred event be triggered in directory listings?
transferType Record of the transfer type - make the default BINARY

See Also