AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Delphi Delphi 10.4 - Indy und SFTP
Thema durchsuchen
Ansicht
Themen-Optionen

Delphi 10.4 - Indy und SFTP

Ein Thema von H.Bothur · begonnen am 11. Jul 2021 · letzter Beitrag vom 2. Mai 2023
Antwort Antwort
Seite 3 von 4     123 4      
Klaus01
Online

Registriert seit: 30. Nov 2005
Ort: München
5.768 Beiträge
 
Delphi 10.4 Sydney
 
#21

AW: Delphi 10.4 - Indy und SFTP

  Alt 21. Jan 2023, 16:12
.. 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
Klaus

Geändert von Klaus01 (21. Jan 2023 um 16:23 Uhr)
  Mit Zitat antworten Zitat
mytbo

Registriert seit: 8. Jan 2007
472 Beiträge
 
#22

AW: Delphi 10.4 - Indy und SFTP

  Alt 22. Jan 2023, 01:20
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
  Mit Zitat antworten Zitat
H.Bothur

Registriert seit: 25. Jun 2012
Ort: Seevetal & Lagos
257 Beiträge
 
Delphi 11 Alexandria
 
#23

AW: Delphi 10.4 - Indy und SFTP

  Alt 22. Jan 2023, 16:09
Moin Klaus,

.. 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
Hans-Georg Bothur
www.hermann-juergensen.de
  Mit Zitat antworten Zitat
Klaus01
Online

Registriert seit: 30. Nov 2005
Ort: München
5.768 Beiträge
 
Delphi 10.4 Sydney
 
#24

AW: Delphi 10.4 - Indy und SFTP

  Alt 22. Jan 2023, 16:27
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
Klaus
  Mit Zitat antworten Zitat
H.Bothur

Registriert seit: 25. Jun 2012
Ort: Seevetal & Lagos
257 Beiträge
 
Delphi 11 Alexandria
 
#25

AW: Delphi 10.4 - Indy und SFTP

  Alt 22. Jan 2023, 21:15
Danke - teste ich morgen aus!

Gruß
Hans
Hans-Georg Bothur
www.hermann-juergensen.de
  Mit Zitat antworten Zitat
H.Bothur

Registriert seit: 25. Jun 2012
Ort: Seevetal & Lagos
257 Beiträge
 
Delphi 11 Alexandria
 
#26

AW: Delphi 10.4 - Indy und SFTP

  Alt 20. Apr 2023, 11:43
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
Hans-Georg Bothur
www.hermann-juergensen.de
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.624 Beiträge
 
Delphi 12 Athens
 
#27

AW: Delphi 10.4 - Indy und SFTP

  Alt 20. Apr 2023, 12:01
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.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
H.Bothur

Registriert seit: 25. Jun 2012
Ort: Seevetal & Lagos
257 Beiträge
 
Delphi 11 Alexandria
 
#28

AW: Delphi 10.4 - Indy und SFTP

  Alt 20. Apr 2023, 12:36
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
Hans-Georg Bothur
www.hermann-juergensen.de
  Mit Zitat antworten Zitat
shebang

Registriert seit: 7. Feb 2020
124 Beiträge
 
Delphi 11 Alexandria
 
#29

AW: Delphi 10.4 - Indy und SFTP

  Alt 20. Apr 2023, 13:17
Die Items bekommt die Funktion direkt vom TTGPuttySFTPClient Objekt übergeben:
Code:
OnSFTPListing = TGPuttySFTPClient1SFTPListing
siehe DelphiVCLComponentDemo/VCLSFTPClientComponentMainForm.dfm#L285
  Mit Zitat antworten Zitat
H.Bothur

Registriert seit: 25. Jun 2012
Ort: Seevetal & Lagos
257 Beiträge
 
Delphi 11 Alexandria
 
#30

AW: Delphi 10.4 - Indy und SFTP

  Alt 20. Apr 2023, 18:32
Moment - das ist OOP ... etwas was ich in den letzten 10 Jahren schon nicht verstanden habe

wenn ich also 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

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

Wie funktioniert das denn ?

Gruss
Hans
Hans-Georg Bothur
www.hermann-juergensen.de
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 3 von 4     123 4      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:03 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