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: GitHub, Download, Manual, libcurl C API und libcurl C Beispiele. Zum schnellen Einstieg schreibst du mit Hilfe der Beispiele aus dem Manual einfache Batch-Dateien zum Testen deiner Fälle. Wenn alles wie gewünscht funktioniert, lade das benötigte Package aus dem Download und lege die libcurl.dll in dein Programmverzeichnis. Eine Kapselung für diese DLL findest du in der mORMot Unit mormot.lib.curl. Die mORMot Bibliothek muss nicht installiert werden. Den aktuellen Commit und die static binaries aus dem letzten Tag herunterladen. In Delphi die entsprechenden Bibliotheks- und Suchpfade setzen. Beim Erstellen hilft dieses Muster:
Code:
Für viele Anwendungsfälle findest du eine Vorlage in den libcurl C Beispielen. Das folgende Delphi Beispiel zeigt die Umsetzung für einen FTP/SFTP Download:
// 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 DelphiVCLComponentDemo/VCLSFTPClientComponentMainForm.dfm#L285
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 13:21 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz