SFTP Client sgcIndy Delphi Component

· Componentes

A transferência segura de arquivos continua sendo um pilar fundamental da integração empresarial. Seja para trocar dados com parceiros bancários, sincronizar arquivos com servidores remotos ou automatizar pipelines de implantação, o SFTP (SSH File Transfer Protocol) é o padrão da indústria para mover arquivos com segurança em redes não confiáveis.

O pacote sgcIndy inclui o TIdSFTPClient — um componente cliente SFTP nativo para Delphi que funciona sobre SSH sem precisar de ferramentas de linha de comando externas ou executáveis de terceiros. Ele oferece suporte a upload e download de arquivos, gerenciamento de diretórios, links simbólicos, atributos de arquivo, rastreamento de progresso e algoritmos criptográficos modernos — tudo por meio de uma API limpa e orientada a eventos.

Este artigo abrange o conjunto completo de recursos e fornece código Delphi pronto para uso nas operações SFTP mais comuns.

Principais Recursos

Transferência de Arquivos
Upload e download de arquivos com tamanhos de buffer configuráveis e eventos de progresso em tempo real. Transfira a partir de caminhos de arquivo ou diretamente de objetos TStream.
Operações de Diretório
Liste diretórios com metadados completos, crie e remova diretórios, e resolva caminhos incluindo links simbólicos.
Criptografia Moderna
Curve25519, ECDH, AES-GCM, chaves Ed25519 e HMAC-SHA2. Negociação de algoritmos configurável para requisitos de conformidade.
Múltiplos Métodos de Autenticação
Autenticação por senha, chave pública (RSA, ECDSA, Ed25519) e teclado interativo. Verificação de chave do host com callbacks de impressão digital.
Atributos e Permissões de Arquivo
Leia e modifique permissões de arquivo, proprietário, timestamps e tamanhos. Suporte completo a bits de modo no estilo Unix e links simbólicos.
Progresso e Eventos
Acompanhe o progresso da transferência com bytes transferidos e tamanho total. Transferências canceláveis. Eventos de erro, conexão e desconexão.

Quick Start — Conectar e Baixar um Arquivo

Um exemplo mínimo que conecta a um servidor remoto, baixa um arquivo e desconecta.

var
  oSFTP: TIdSFTPClient;
begin
  oSFTP := TIdSFTPClient.Create(nil);
  Try
    oSFTP.Host := 'sftp.example.com';
    oSFTP.Port := 22;
    oSFTP.Authentication.Username := 'deploy';
    oSFTP.Authentication.Password := 'secret';
    oSFTP.Connect;
    // Download a file
    oSFTP.Get('/data/report.csv', 'C:\local\report.csv');
    oSFTP.Disconnect;
  Finally
    oSFTP.Free;
  End;
end;

Autenticação

O componente oferece suporte a três métodos de autenticação. Os três estão habilitados por padrão — o cliente e o servidor negociam o método mais adequado automaticamente.

Autenticação por Senha

oSFTP.Authentication.Username := 'admin';
oSFTP.Authentication.Password := 'secret';

Autenticação por Chave Pública

oSFTP.Authentication.Username := 'deploy';
oSFTP.Authentication.PrivateKeyFile := 'C:\keys\id_rsa';
oSFTP.Authentication.PublicKeyFile := 'C:\keys\id_rsa.pub';
oSFTP.Authentication.Passphrase := 'keypassphrase';

Verificação de Chave do Host

Verifique a identidade do servidor inspecionando a impressão digital da chave do host no evento OnSSHHostKey.

oSFTP.OnSSHHostKey := OnHostKey;
procedure TForm1.OnHostKey(Sender: TObject;
  const aHostKeyType, aFingerprint: string;
  var aAction: TIdSSHHostKeyVerification);
begin
  // Verify fingerprint against known hosts
  if aFingerprint = 'SHA256:xyzABC123...' then
    aAction := sshHostKeyAccept
  else
    aAction := sshHostKeyReject;
end;

Operações de Arquivo

Upload e Download

// Upload a file
oSFTP.Put('C:\local\data.zip', '/uploads/data.zip');
// Download a file
oSFTP.Get('/reports/monthly.pdf', 'C:\local\monthly.pdf');
// Upload from a stream
oSFTP.Put(oMemoryStream, '/uploads/stream-data.bin');
// Download to a stream
oSFTP.Get('/data/export.csv', oFileStream);

Métodos de Conveniência para Strings

// Read a remote file into a string
vContent := oSFTP.GetFileAsString('/config/settings.json');
// Write a string to a remote file
oSFTP.PutFileFromString('{"key":"value"}', '/config/settings.json');
// Delete a remote file
oSFTP.Delete('/tmp/old-file.log');
// Rename / move a file
oSFTP.Rename('/data/temp.csv', '/data/final.csv');
// Create a symbolic link
oSFTP.Symlink('/data/final.csv', '/data/latest.csv');

Operações de Diretório

// List directory contents with full metadata
var
  oItems: TIdSFTPDirectoryItems;
  i: Integer;
begin
  oItems := oSFTP.ListDirectory('/data');
  for i := 0 to Length(oItems) - 1 do
    WriteLn(oItems[i].Filename + ' - ' +
      IntToStr(oItems[i].Attrs.Size) + ' bytes');
end;
// Create and remove directories
oSFTP.MakeDirectory('/data/archive/2026');
oSFTP.RemoveDirectory('/data/temp');
// Get current working directory
vPath := oSFTP.GetCurrentDirectory;
// Resolve a path (follows symlinks, resolves . and ..)
vRealPath := oSFTP.RealPath('../data/../data/./file.txt');

Atributos e Informações de Arquivo

// Check existence
if oSFTP.FileExists('/data/report.csv') then
  WriteLn('File found');
if oSFTP.DirectoryExists('/data/archive') then
  WriteLn('Directory exists');
// Get file size
vSize := oSFTP.FileSize('/data/report.csv');
// Get full attributes (size, permissions, timestamps, UID/GID)
var
  oAttrs: TIdSFTPFileAttributes;
begin
  oAttrs := oSFTP.Stat('/data/report.csv');
  WriteLn('Size: ' + IntToStr(oAttrs.Size));
  WriteLn('Permissions: ' + IntToStr(oAttrs.Permissions));
end;

Progresso de Transferência e Cancelamento

O evento OnSFTPProgress é acionado durante cada transferência de arquivo, fornecendo rastreamento em tempo real com a possibilidade de cancelar durante a transferência.

oSFTP.OnSFTPProgress := OnProgress;
procedure TForm1.OnProgress(Sender: TObject;
  const aFilename: string;
  aTransferred, aTotal: Int64;
  var Cancel: Boolean);
begin
  ProgressBar1.Max := aTotal;
  ProgressBar1.Position := aTransferred;
  Label1.Caption := Format('%s: %d / %d bytes',
    [aFilename, aTransferred, aTotal]);
  // Set Cancel := True to abort the transfer
  Cancel := FUserCancelled;
end;

Configuração de Algoritmos Criptográficos

O componente oferece suporte aos padrões criptográficos modernos. Os padrões são seguros, mas você pode personalizar a negociação de algoritmos para requisitos de conformidade ou interoperabilidade.

Categoria Algoritmos Suportados
Troca de Chaves Curve25519, ECDH (P-256, P-384, P-521), DH Group14/16
Chaves do Host Ed25519, ECDSA (P-256, P-384, P-521), RSA (SHA2-256, SHA2-512)
Cifras AES-256/192/128-CTR, AES-256/128-GCM
MACs HMAC-SHA2-256, HMAC-SHA2-512, HMAC-SHA1
// Restrict to only the strongest algorithms
oSFTP.Algorithms.Ciphers := 'aes256-gcm@openssh.com'
		,aes256-ctr';
oSFTP.Algorithms.KexAlgorithms := 'curve25519-sha256';
oSFTP.Algorithms.MACs := 'hmac-sha2-256,hmac-sha2-512';

Exemplo Completo

Um exemplo pronto para produção que conecta com autenticação por chave pública, lista um diretório, baixa um arquivo com rastreamento de progresso e trata erros.

uses
  IdSFTPClient, IdSSHClasses;
var
  oSFTP: TIdSFTPClient;
  oItems: TIdSFTPDirectoryItems;
  i: Integer;
begin
  oSFTP := TIdSFTPClient.Create(nil);
  Try
    // Connection
    oSFTP.Host := 'sftp.example.com';
    oSFTP.Port := 22;
    // Public key authentication
    oSFTP.Authentication.Username := 'deploy';
    oSFTP.Authentication.PrivateKeyFile := 'C:\keys\id_ed25519';
    // Events
    oSFTP.OnSFTPProgress := OnProgress;
    oSFTP.OnSFTPError := OnError;
    oSFTP.OnSSHHostKey := OnHostKey;
    // Connect
    oSFTP.Connect;
    // List remote directory
    oItems := oSFTP.ListDirectory('/data');
    for i := 0 to Length(oItems) - 1 do
      WriteLn(oItems[i].Filename);
    // Download file with progress
    oSFTP.Get('/data/backup.tar.gz', 'C:\backups\backup.tar.gz');
    // Disconnect
    oSFTP.Disconnect;
  Finally
    oSFTP.Free;
  End;
end;

Referência de Métodos

Método Descrição
GetBaixa arquivo para caminho local ou TStream
PutEnvia arquivo de caminho local ou TStream
DeleteExclui arquivo remoto
RenameRenomeia ou move arquivo remoto
ListDirectoryLista conteúdo do diretório com metadados
MakeDirectoryCria diretório remoto
Stat / LStatObtém atributos do arquivo (com/sem resolução de link simbólico)
FileExists / DirectoryExistsVerifica se arquivo ou diretório existe
Symlink / ReadLinkCria ou lê links simbólicos
GetFileAsString / PutFileFromStringMétodos de conveniência baseados em string