![]() |
AW: Delphi 10.4 - Indy und SFTP
.. vielleicht magst Du ja mal (testhalber) diese Einträge in der tgputtylib.pas
kommentieren ( so das sie nicht mehr wirksam sind):
Delphi-Quellcode:
Welche Delphi Version benutzt denn Du?
//{$ifndef FPC}
//{$ifdef CONDITIONALEXPRESSIONS} //{$if CompilerVersion >= 21.0} //{$define HASDELAYED} //{$ifend} //{$endif} //{$endif} Grüße Klaus |
AW: Delphi 10.4 - Indy und SFTP
Die Allzweckwaffe ist Curl. Das Programm curl.exe ist Bestandteil aktueller Windows Versionen. Links:
![]() ![]() ![]() ![]() ![]() ![]()
Code:
Für viele Anwendungsfälle findest du eine Vorlage in den
// Die Doppelpunkte einfach durch den Speicherpfad ersetzten
..\src;..\src\app;..\src\core;..\src\crypt;..\src\db;..\src\lib;..\src\misc;..\src\net;..\src\orm;..\src\rest;..\src\script;..\src\soa;..\src\tools\ecc;..\src\ui; ![]()
Delphi-Quellcode:
Disclaimer: Ungetestet!
uses
mormot.core.base, mormot.core.text, mormot.core.os, mormot.lib.curl; var hnd: TCurl; url: RawUtf8; res: TCurlResult; buffer: RawByteString; begin if not CurlIsAvailable then Exit; //=> hnd := curl.easy_init; if hnd <> Nil then begin // Schema: sftp://user:password@server/file.txt url := 'ftp.halifax.rwth-aachen.de/debian/README.html'; // https://curl.se/libcurl/c/sftpget.html curl.easy_setopt(hnd, coURL, Pointer(url)); curl.easy_setopt(hnd, coWriteFunction, @CurlWriteRawByteString); curl.easy_setopt(hnd, coWriteData, @buffer); res := curl.easy_perform(hnd); if res = crOk then begin FileFromString(buffer, MakePath([Executable.ProgramFilePath, 'file.txt'])); ShowMessage('Download completed'); end else ShowMessage(Format('Curl told us %d (%s)', [Ord(res), curl.easy_strerror(res)])); curl.easy_cleanup(hnd); end; end; Ein Beispiel zum Studieren ist auch die Klasse TCurlHttp aus der Unit mormot.net.client. Bis bald... Thomas |
AW: Delphi 10.4 - Indy und SFTP
Moin Klaus,
Zitat:
"Im Projekt SFTPTest.exe ist eine Exception der Klasse TGPuttySFTPException mit der Meldung 'tgsftp_connect: Unknown Error. Connecting with ssh.strato.de, port 22, as user h.bothur******** Looking up host "ssh.strato.de" for SSH connection connecting to <ip-Adresse> port 22 we claim version: SSH-2.0-tgputtylib_Release_0.76 Connecting to 81.169.145.126 Remote version: SSH-2.0-OpenSSH_8.2 Using SSH protocol version 2 No GSSAPI security context available Doing ECDH key exchange with curve25519 and hash SH-256 (SHA-NI accelerated) Server aslo has ecdsa-sha2-nistp256/rsa-ahs2-512/rsa-sha2-256/ssh-rsa host keys, but we don't know any of them Host key fingerprint is: ssh-ed25519 255 SHA256: <fingerprint> User aborted at host key verification psftp_connect result is 1 tgsftp_connect final result is Die fette Zeile habe ich markiert - da wird der Grund sein, allerdings weiß ich nicht was man da macht. Ich werde jetz einmal die - funktionierede Deo debuggen und kucken ob ich als Laie was sehe. Zitat:
Gruss Hans |
AW: Delphi 10.4 - Indy und SFTP
Hallo,
im einfachsten Fall kannst Du das so lösen:
Delphi-Quellcode:
TForm1 = class(TForm)
Button1: TButton; procedure Button1Click(Sender: TObject); private { Private declarations } function onVerifyHostKey(const host:PAnsiChar;const port:Integer; const fingerprint:PAnsiChar; const verificationstatus:Integer; var storehostkey:Boolean): Boolean; public { Public declarations } end;
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var GPSFTP :TTGPuttySFTP; begin GPSFTP := TTGPuttySFTP.Create(true); gpsftp.HostName := '192.168.178.43'; gpsftp.UserName := 'pi'; gpsftp.Password := '****'; gpsftp.Port := 22; gpsftp.OnVerifyHostKey := onVerifyHostkey; gpsftp.Connect; end;
Delphi-Quellcode:
Grüße
function TForm1.onVerifyHostKey(const host: PAnsiChar; const port: Integer;
const fingerprint: PAnsiChar; const verificationstatus: Integer; var storehostkey: Boolean): Boolean; begin storeHostKey := true; end; Klaus |
AW: Delphi 10.4 - Indy und SFTP
Danke - teste ich morgen aus!
Gruß Hans |
AW: Delphi 10.4 - Indy und SFTP
Moin,
hat lange gedauert - aber jetzt habe ich es ausprobiert - und ich bekomme ein Connect hin. Allerdings stoße ich gleich auf das nächster Problem das ich nicht verstehe (was allerdings auch an meinen beschränkten Fähigkeiten liegt): In der Demo gibt es ein StringGrid. Sobald es zum Connect kommt wird dieses Grid mit Dateinamen auf dem Server gefüllt. An der entsprechende Stelle in Souce steht aber nur:
Delphi-Quellcode:
Die ersten Zeilen sind ja nur "Beiwerk", passieren tut es in "TGPuttySFTPClient1.ListDir('');".
begin
sgRemoteFiles.RowCount:=1; sgRemoteFiles.ColCount:=3; sgRemoteFiles.ColWidths[0]:=480; sgRemoteFiles.ColWidths[1]:=300; sgRemoteFiles.ColWidths[2]:=150; sgRemoteFiles.Cells[0,0]:='Name'; sgRemoteFiles.Cells[1,0]:='Timestamp'; sgRemoteFiles.Cells[2,0]:='Size'; TGPuttySFTPClient1.ListDir(''); end; Aber wie kommt der Inhalt des Servers in das StringGrid ? Ich finde da nix wo das passiert :-( Kann mir da jemand auf die Sprüge helfen ? Danke Hans |
AW: Delphi 10.4 - Indy und SFTP
Delphi-Quellcode:
Vermutlich ist das ein Ereignis, das irgendwo ausgelöst wird, so genau habe ich nicht in den Code geschaut.
function TVCLSFTPClientComponentDemoForm.TGPuttySFTPClient1SFTPListing(Sender: TObject; const Items: TSFTPItems): Boolean;
|
AW: Delphi 10.4 - Indy und SFTP
Das hatte ich gesehen - und in der Items sind auch die entsprechenden Dateinamen. Die ganze Procedure sieht so aus:
Delphi-Quellcode:
Da wird das StringGrid gefüllt - nur woher hat die Produre die Items ?
function TVCLSFTPClientComponentDemoForm.TGPuttySFTPClient1SFTPListing(Sender: TObject; const Items: TSFTPItems): Boolean;
var StartRow,i:Integer; begin StartRow:=sgRemoteFiles.RowCount; sgRemoteFiles.RowCount:=StartRow+Length(Items); for i:=0 to Length(Items)-1 do begin sgRemoteFiles.Cells[0,StartRow+i]:=Items[i].filename; sgRemoteFiles.Cells[1,StartRow+i]:=DateTimeToStr(TTimeZone.Local.ToLocalTime(UnixToDateTime(Items[i].attrs.mtime))); if Items[i].attrs.permissions and $F000 = $4000 then sgRemoteFiles.Cells[2,StartRow+i]:='<dir>' else sgRemoteFiles.Cells[2,StartRow+i]:=IntToStr(Items[i].attrs.size); end; Result:=true; end; Gruss Hans |
AW: Delphi 10.4 - Indy und SFTP
Die Items bekommt die Funktion direkt vom
Delphi-Quellcode:
Objekt übergeben:
TTGPuttySFTPClient
Code:
siehe
OnSFTPListing = TGPuttySFTPClient1SFTPListing
![]() |
AW: Delphi 10.4 - Indy und SFTP
Moment - das ist OOP ... etwas was ich in den letzten 10 Jahren schon nicht verstanden habe :(
wenn ich also
Delphi-Quellcode:
aufrufe, dann wird automatisch der Inhalt des Directoerys übergeben .. nur ich verstehe nicht wohin bzw. wie ich dann darauf zugreife, denn in der procedure
TGPuttySFTPClient1.ListDir('');
Delphi-Quellcode:
sind die Items ja schon drin :-(
function TGPuttySFTPClient1SFTPListing(Sender: TObject; const Items: TSFTPItems): Boolean;
Wie funktioniert das denn ? Gruss Hans |
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:52 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz