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');
Excluir, Renomear e Links Simbólicos
// 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 |
|---|---|
Get | Baixa arquivo para caminho local ou TStream |
Put | Envia arquivo de caminho local ou TStream |
Delete | Exclui arquivo remoto |
Rename | Renomeia ou move arquivo remoto |
ListDirectory | Lista conteúdo do diretório com metadados |
MakeDirectory | Cria diretório remoto |
Stat / LStat | Obtém atributos do arquivo (com/sem resolução de link simbólico) |
FileExists / DirectoryExists | Verifica se arquivo ou diretório existe |
Symlink / ReadLink | Cria ou lê links simbólicos |
GetFileAsString / PutFileFromString | Métodos de conveniência baseados em string |
