SFTP İstemcisi sgcIndy Delphi Bileşeni

· Bileşenler

Güvenli dosya aktarımı, kurumsal entegrasyonun temel taşı olmaya devam ediyor. İster bankacılık iş ortaklarıyla veri alışverişi yapıyor, ister uzak sunucularla dosyaları eşitliyor ya da dağıtım hatlarını otomatikleştiriyor olun, SFTP (SSH File Transfer Protocol), güvenilmeyen ağlar üzerinden dosyaları güvenli bir şekilde taşımanın endüstri standardıdır.

sgcIndy paketi, TIdSFTPClient bileşenini içerir; bu, harici komut satırı araçları veya üçüncü taraf yürütülebilir dosyaları gerektirmeden SSH üzerinden çalışan yerel bir Delphi SFTP istemci bileşenidir. Dosya yükleme ve indirme, dizin yönetimi, sembolik bağlantılar, dosya öznitelikleri, ilerleme takibi ve modern kriptografik algoritmaları destekler; bunların tümü temiz, olay tabanlı bir API aracılığıyla sağlanır.

Bu makale, tüm özellik kümesini kapsar ve en yaygın SFTP işlemleri için kullanıma hazır Delphi kodu sağlar.

Temel Özellikler

Dosya Aktarımı
Yapılandırılabilir arabellek boyutları ve gerçek zamanlı ilerleme olaylarıyla dosya yükleyin ve indirin. Dosya yollarından veya doğrudan TStream nesnelerinden aktarın.
Dizin İşlemleri
Dizinleri tam meta verilerle listeleyin, dizinleri oluşturun ve kaldırın, sembolik bağlantılar dahil yolları çözümleyin.
Modern Kriptografi
Curve25519, ECDH, AES-GCM, Ed25519 anahtarları ve HMAC-SHA2. Uyumluluk gereksinimleri için yapılandırılabilir algoritma müzakeresi.
Birden Fazla Kimlik Doğrulama Yöntemi
Parola, ortak anahtar (RSA, ECDSA, Ed25519) ve klavyeyle etkileşimli kimlik doğrulama. Parmak izi geri çağırmalarıyla ana bilgisayar anahtarı doğrulaması.
Dosya Öznitelikleri ve İzinleri
Dosya izinlerini, sahipliğini, zaman damgalarını ve boyutlarını okuyun ve değiştirin. Unix tarzı mod bitleri ve sembolik bağlantılar için tam destek.
İlerleme ve Olaylar
Aktarılan bayt ve toplam boyutla aktarım ilerlemesini izleyin. İptal edilebilir aktarımlar. Hata, bağlanma ve bağlantı kesme olayları.

Hızlı Başlangıç — Bağlanma ve Dosya İndirme

Uzak bir sunucuya bağlanan, bir dosya indiren ve bağlantıyı kesen minimal bir örnek.

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;

Kimlik Doğrulama

Bileşen üç kimlik doğrulama yöntemini destekler. Üçü de varsayılan olarak etkindir; istemci ve sunucu, en uygun yöntemi otomatik olarak müzakere eder.

Parola ile Kimlik Doğrulama

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

Ortak Anahtar ile Kimlik Doğrulama

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

Ana Bilgisayar Anahtarı Doğrulaması

Sunucunun kimliğini, OnSSHHostKey olayında ana bilgisayar anahtarı parmak izini inceleyerek doğrulayın.

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;

Dosya İşlemleri

Yükleme ve İndirme

// 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);

Dize Kolaylık Metotları

// 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');

Silme, Yeniden Adlandırma ve Sembolik Bağlantılar

// 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');

Dizin İşlemleri

// 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');

Dosya Öznitelikleri ve Bilgileri

// 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;

Aktarım İlerlemesi ve İptali

OnSFTPProgress olayı her dosya aktarımı sırasında tetiklenir; gerçek zamanlı takip sağlar ve aktarımın ortasında iptal etme olanağı sunar.

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;

Kriptografik Algoritma Yapılandırması

Bileşen, modern kriptografik standartları destekler. Varsayılanlar güvenlidir, ancak uyumluluk veya birlikte çalışabilirlik gereksinimleri için algoritma müzakeresini özelleştirebilirsiniz.

Kategori Desteklenen Algoritmalar
Anahtar Değişimi Curve25519, ECDH (P-256, P-384, P-521), DH Group14/16
Ana Bilgisayar Anahtarları Ed25519, ECDSA (P-256, P-384, P-521), RSA (SHA2-256, SHA2-512)
Cipher'lar AES-256/192/128-CTR, AES-256/128-GCM
MAC'ler 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';

Tam Örnek

Ortak anahtar ile kimlik doğrulaması yaparak bağlanan, bir dizini listeleyen, ilerleme takibiyle bir dosya indiren ve hataları işleyen üretime hazır bir örnek.

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;

Metotlar Başvurusu

Metot Açıklama
GetDosyayı yerel yola veya TStream'e indirir
PutDosyayı yerel yoldan veya TStream'den yükler
DeleteUzak dosyayı siler
RenameUzak dosyayı yeniden adlandırır veya taşır
ListDirectoryDizin içeriğini meta verilerle listeler
MakeDirectoryUzak dizin oluşturur
Stat / LStatDosya özniteliklerini alır (sembolik bağlantı çözümlemesiyle/çözümlemesiz)
FileExists / DirectoryExistsDosyanın veya dizinin var olup olmadığını denetler
Symlink / ReadLinkSembolik bağlantılar oluşturur veya okur
GetFileAsString / PutFileFromStringDize tabanlı kolaylık metotları