Delphi-PRAXiS
Seite 3 von 4     123 4      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi Delphi 10.4 - Indy und SFTP (https://www.delphipraxis.net/208298-delphi-10-4-indy-und-sftp.html)

Klaus01 21. Jan 2023 15:12

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:
//{$ifndef FPC}
//{$ifdef CONDITIONALEXPRESSIONS}
//{$if CompilerVersion >= 21.0}
//{$define HASDELAYED}
//{$ifend}
//{$endif}
//{$endif}
Welche Delphi Version benutzt denn Du?

Grüße
Klaus

mytbo 22. Jan 2023 00:20

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:
// 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;
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:
Delphi-Quellcode:
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;
Disclaimer: Ungetestet!

Ein Beispiel zum Studieren ist auch die Klasse TCurlHttp aus der Unit mormot.net.client.

Bis bald...
Thomas

H.Bothur 22. Jan 2023 15:09

AW: Delphi 10.4 - Indy und SFTP
 
Moin Klaus,

Zitat:

Zitat von Klaus01 (Beitrag 1517690)
.. vielleicht magst Du ja mal (testhalber) diese Einträge in der tgputtylib.pas
kommentieren ( so das sie nicht mehr wirksam sind):

Nachdem ich die Einträge auskommentiert habe kann ich das Programm starten und bekomme erst beim Connect einen Fehler:

"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:

Welche Delphi Version benutzt denn Du?
Delphi 10.4 Community Edition

Gruss
Hans

Klaus01 22. Jan 2023 15:27

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:
function TForm1.onVerifyHostKey(const host: PAnsiChar; const port: Integer;
  const fingerprint: PAnsiChar; const verificationstatus: Integer;
  var storehostkey: Boolean): Boolean;
begin
  storeHostKey := true;
end;
Grüße
Klaus

H.Bothur 22. Jan 2023 20:15

AW: Delphi 10.4 - Indy und SFTP
 
Danke - teste ich morgen aus!

Gruß
Hans

H.Bothur 20. Apr 2023 10:43

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:
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;
Die ersten Zeilen sind ja nur "Beiwerk", passieren tut es in "TGPuttySFTPClient1.ListDir('');".

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

DeddyH 20. Apr 2023 11:01

AW: Delphi 10.4 - Indy und SFTP
 
Delphi-Quellcode:
function TVCLSFTPClientComponentDemoForm.TGPuttySFTPClient1SFTPListing(Sender: TObject; const Items: TSFTPItems): Boolean;
Vermutlich ist das ein Ereignis, das irgendwo ausgelöst wird, so genau habe ich nicht in den Code geschaut.

H.Bothur 20. Apr 2023 11:36

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:
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;
Da wird das StringGrid gefüllt - nur woher hat die Produre die Items ?

Gruss
Hans

shebang 20. Apr 2023 12:17

AW: Delphi 10.4 - Indy und SFTP
 
Die Items bekommt die Funktion direkt vom
Delphi-Quellcode:
TTGPuttySFTPClient
Objekt übergeben:
Code:
OnSFTPListing = TGPuttySFTPClient1SFTPListing
siehe DelphiVCLComponentDemo/VCLSFTPClientComponentMainForm.dfm#L285

H.Bothur 20. Apr 2023 17:32

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:
TGPuttySFTPClient1.ListDir('');
aufrufe, dann wird automatisch der Inhalt des Directoerys übergeben .. nur ich verstehe nicht wohin bzw. wie ich dann darauf zugreife, denn in der procedure

Delphi-Quellcode:
function TGPuttySFTPClient1SFTPListing(Sender: TObject; const Items: TSFTPItems): Boolean;
sind die Items ja schon drin :-(

Wie funktioniert das denn ?

Gruss
Hans


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:21 Uhr.
Seite 3 von 4     123 4      

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