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 |
|---|---|
Get | Dosyayı yerel yola veya TStream'e indirir |
Put | Dosyayı yerel yoldan veya TStream'den yükler |
Delete | Uzak dosyayı siler |
Rename | Uzak dosyayı yeniden adlandırır veya taşır |
ListDirectory | Dizin içeriğini meta verilerle listeler |
MakeDirectory | Uzak dizin oluşturur |
Stat / LStat | Dosya özniteliklerini alır (sembolik bağlantı çözümlemesiyle/çözümlemesiz) |
FileExists / DirectoryExists | Dosyanın veya dizinin var olup olmadığını denetler |
Symlink / ReadLink | Sembolik bağlantılar oluşturur veya okur |
GetFileAsString / PutFileFromString | Dize tabanlı kolaylık metotları |
