Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi SFTP mit Indy (https://www.delphipraxis.net/67911-sftp-mit-indy.html)

Delphi-Freak 21. Apr 2006 18:01


SFTP mit Indy
 
Wie der Titel schon sagt, versuche ich, eine SFTP-Verbindung mit den Indys (TIdFTP im Konkreten) aufzubauen.
Ich verwende bzw. versuche momentan folgenden Code:
Delphi-Quellcode:
FTPClient.Username := LoginForm.EUser.Text;
FTPClient.Password := LoginForm.EPass.Text;
FTPClient.Host := EHost.Text;
FTPClient.Port := StrToInt(EPort.Text);
FTPClient.IOHandler := TIdSSLIOHandlerSocketBase.Create;
FTPClient.UseTLS := TIdUseTLS(LoginForm.CBTLS.ItemIndex);
FTPClient.AUTHCmd := TAuthCmd(LoginForm.CBAuth.ItemIndex);
FTPClient.DataPortProtection := ftpdpsPrivate;
FTPClient.Connect;
TIdSSLIOHandlerSocketBase(FTPClient.IOHandler).StartSSL;
Dabei ist dann UseTLS utUseImplicitTLS und AUTHCmd tAuto.
Das Programm friert nur immer ein, ich habe schon alles Mögliche ausprobiert, aber leider immer erfolglos...

LG, ich

Delphi-Freak 22. Apr 2006 15:05

Re: SFTP mit Indy
 
Liste der Anhänge anzeigen (Anzahl: 1)
Soviel ich auch herumprobiere, ich bringe es nicht hin :cry:
Ich habe jetzt einmal ein Test-Projekt gemacht (Anhang), aber das Programm friert immer für eine Minute oder so ein und sagt dann "Connection Closed Gracefully" (also ich habe nicht immer solange gewartet)...
Ich habe das auch auf einen SFTP-Server im Netzwerk ausprobiert und es mir mit Ethereal angeschaut, aber es kommt gar kein Traffic :pale:
Ich hoffe ihr könnt mir helfen, vlt. ist es aber auch ein Verständnis-Problem: Werden bei SFTP eh die gleichen Commands (CWD, CDUP, TYPE, PORT etc.)?

LG, ich

Basilikum 22. Apr 2006 16:36

Re: SFTP mit Indy
 
SFTP ist leider nicht gleich SFTP... du verwendest Port 22, dies impliziert bei mir SSH... verwendest du einen "normalen" FTP-Server mit vorgeschaltetem SSH-Tunnel ?
du verwendest weiter Explicit-TLS (utUseExplicitTLS), sprich: der Client connected ganz herkömmlich und unverschlüsselt und leitet dann mittels Command 'AUTH TLS' die SSL-Negotiation ein...
gib doch mal einige Informationen über den Server bekannt, dann kommen wir besser weiter....

der Server ftp.bits-n.net (Anonymous-Login) unterstützt SSL/TLS Implicit (Port 990) und Explicit (Port 21)... teste doch mal dort, so kannst du Probleme bei deinem Server ausschliessen...

Delphi-Freak 22. Apr 2006 16:46

Re: SFTP mit Indy
 
Das Problem ist, dass ich mich nicht wirklich gut mit SFTP/SSH etc. auskenne. Ich verwende lokal zum Testen OpenSSH. Mit WinSCP habe ich das Connecten auch schon probiert, dort es geht mit Port 22 :gruebel:
Danke aber auf jeden Fall, mit dem ftp.bits-n.net-Server funktioniert es...
*hoffnungschöpf* :mrgreen:

LG, ich

Basilikum 22. Apr 2006 16:56

Re: SFTP mit Indy
 
SSH wiederum ist nicht gleich SSL/TLS... :-)

ich habe zwischenzeitlich idFTP.pas etwas betrachtet (Delphi 7-Version)... irgendwie haben die dort den Support für SSL komplett weggelassen... (wenn du mir die Version, die du verwendest - die offensichtlich mehr Support für SSL bietet - kurz zukommen lassen könntest, würde ich diese mal ansehen)

BTW: das Property
IdSSLIOHandlerSocketOpenSSL1.SSLOptions.Mode
müsste sslmClient sein

Delphi-Freak 22. Apr 2006 17:08

Re: SFTP mit Indy
 
Zitat:

Zitat von Basilikum
SSH wiederum ist nicht gleich SSL/TLS... :-)

Ah, SSH ist ja der Tunnel, wenn man FTP über SSL (und nicht SFTP) verwendet, oder verwechsle ich das auch?
Zitat:

Zitat von Basilikum
BTW: das Property
IdSSLIOHandlerSocketOpenSSL1.SSLOptions.Mode
müsste sslmClient sein

Es funktioniert aber leider mit dem auch nicht :(

LG, ich

Basilikum 22. Apr 2006 17:34

Re: SFTP mit Indy
 
Zitat:

Zitat von Delphi-Freak
Zitat:

Zitat von Basilikum
SSH wiederum ist nicht gleich SSL/TLS... :-)

Ah, SSH ist ja der Tunnel, wenn man FTP über SSL (und nicht SFTP) verwendet, oder verwechsle ich das auch?

also entweder 'File transfer per SSH' (SFTP) oder 'FTP über SSL/TLS' (FTPS): 2 komplett unterschiedliche, inkompatible Varianten !

SFTP ist ein eigenes Protokol und hat eigentlich mit FTP nicht direkt etwas zu tun... (bis auf die Abkürzung)
http://en.wikipedia.org/wiki/SSH_file_transfer_protocol

FTPS ist "einfach" eine Erweiterung zu FTP, womit sämtliche TCP-Connections per SSL verschlüsselt werden, jedoch das selbe Vorgehen/Ablauf wie bei normalem FTP... (ftp.bits-n.net unterstützt diesen Modus)
http://en.wikipedia.org/wiki/FTPS


Zitat:

Zitat von Delphi-Freak
Zitat:

Zitat von Basilikum
BTW: das Property
IdSSLIOHandlerSocketOpenSSL1.SSLOptions.Mode
müsste sslmClient sein

Es funktioniert aber leider mit dem auch nicht :(

ich vermute, dass nur mit den Indys kein SFTP möglich ist (mangels entsprechendem Support)...

Delphi-Freak 22. Apr 2006 18:03

Re: SFTP mit Indy
 
Also mit den Indys funktioniert nur FTPS, wenn ich das jetzt richtig verstanden habe? :roll:
Und SFTP, verwendet das eigentlich die gleichen Befehle wie FTP (CWD, CDUP, LIST etc.)? Oder sind das gar keine "Text-Befehle"?
Und welches ist das meist verwendete - SFTP oder FTPS?

LG, ich

Basilikum 22. Apr 2006 18:18

Re: SFTP mit Indy
 
Zitat:

Zitat von Delphi-Freak
Also mit den Indys funktioniert nur FTPS, wenn ich das jetzt richtig verstanden habe? :roll:

ja, kein SFTP mit Indy

Zitat:

Zitat von Delphi-Freak
Und SFTP, verwendet das eigentlich die gleichen Befehle wie FTP (CWD, CDUP, LIST etc.)? Oder sind das gar keine "Text-Befehle"?

SFTP ist ein "binäres" Format

Zitat:

Zitat von Delphi-Freak
Und welches ist das meist verwendete - SFTP oder FTPS?

da wird es wohl keine abschliessende Anwort geben... ich verwende FTPS - dies wird von einigen guten Windows-Client-Applikationen unterstützt (z.B. CuteFTP, SmartFTP)...
abgesehen davon ist FTPS imho einfacher zu implementieren als SFTP...

Delphi-Freak 22. Apr 2006 18:26

Re: SFTP mit Indy
 
Dann dir nocheinmal ein ganz großes DANKE :thumb:
und ich werde mir dann vlt. eine andere Lösung (mit einer anderen Komponente) anschauen, oder SFTP eben gar nicht implementieren :? ...

LG, ich

marlem 18. Mai 2006 07:42

Re: SFTP mit Indy
 
Hallo,

ich arbeite mit Delphi 6 und muss auch eine sftp-verbindung herstellen!
wie ich in diesem thread gelesen habe, geht es mit indy gar nicht oder?
habe das hier gefunden:
http://www.topshareware.com/SecureBlackbox-(Delphi)-download-791.htm

ist aber sehr teuer! gibt es noch was kostengünstigeres?

Delphi-Freak 18. Mai 2006 17:26

Re: SFTP mit Indy
 
Habe zwar direkt keine Idee, aber du könntest auf PUTTY zugreifen, gibt ja einige Open-Source-Programme, die das auch machen - könnte man sich ev. anschauen. Aber frag mich nicht, wie man sowas machen könnte, habe leider keine Ahnung.
Übrigens, für Total Commander gibt es auch ein SFTP-Plugin, das eben auch auf PUTTY zugreift (soviel ich weiß); ist auch Open-Source, aber es dürfte im Moment der Server, von dem man es herunterladen kann (hoffentlich auch den Source), gerade down sein. Vorteil wäre dann, dass wirklich nur der Code für die Verbindung drin sein sollte, weil den Rest ja Total Commander selbst erledigt.

LG, ich

daliuz 24. Jun 2006 21:02

Re: SFTP mit Indy
 
Hallo,

wenn ihr bloß ein File per SFTP verschicken wollt, könnt ihr das Programm
PSCP von den Putty-Programmen verwenden.

Ich habe einen Beispielcode weiter unten. Es war nur mal ein Test und ist deswegen
nicht ganz sauber programmiert was die Statusausgaben betrifft
Ihr braucht ein Editfeld für den Status und ein Memofeld für die Fehler.

Als erstes die Copy funktion:

Delphi-Quellcode:
function TForm1.SftpCopy(const Command: String; var Errors: TStringList): Boolean;
var
  StartupInfo: TStartupInfo;
  ProcessInfo: TProcessInformation;
  SecurityAttr: TSecurityAttributes;
  PipeOutputRead: THandle;
  PipeOutputWrite: THandle;
  PipeErrorsRead: THandle;
  PipeErrorsWrite: THandle;
  Succeed: Boolean;
  Buffer: array [0..255] of Char;
  NumberOfBytesRead: DWORD;
  Stream: TMemoryStream;
begin
  //Initialisierung ProcessInfo
  FillChar(ProcessInfo, SizeOf(TProcessInformation), 0);

  //Initialisierung SecurityAttr
  FillChar(SecurityAttr, SizeOf(TSecurityAttributes), 0);
  SecurityAttr.nLength := SizeOf(SecurityAttr);
  SecurityAttr.bInheritHandle := true;
  SecurityAttr.lpSecurityDescriptor := nil;

  //Pipes erzeugen
  CreatePipe(PipeOutputRead, PipeOutputWrite, @SecurityAttr, 0);
  CreatePipe(PipeErrorsRead, PipeErrorsWrite, @SecurityAttr, 0);

  //Initialisierung StartupInfo
  FillChar(StartupInfo, SizeOf(TStartupInfo), 0);
  StartupInfo.cb:=SizeOf(StartupInfo);
  StartupInfo.hStdInput := 0;
  StartupInfo.hStdOutput := PipeOutputWrite;
  StartupInfo.hStdError := PipeErrorsWrite;
  StartupInfo.wShowWindow := sw_Hide;
  StartupInfo.dwFlags := STARTF_USESHOWWINDOW or STARTF_USESTDHANDLES;

  if CreateProcess(nil, PChar(command), nil, nil, true,
  CREATE_DEFAULT_ERROR_MODE or CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS, nil, nil,
  StartupInfo, ProcessInfo) then begin
    result:=true;
    //Write-Pipes schließen
    CloseHandle(PipeOutputWrite);
    CloseHandle(PipeErrorsWrite);

    //Ausgabe Read-Pipe auslesen
    try
      while true do begin
        succeed := ReadFile(PipeOutputRead, Buffer, 255, NumberOfBytesRead, nil);
        if not succeed then break;
        //zyklische Ausgabe des Status der Übertragung
        edit1.Text:=Trim(buffer);
        edit1.repaint;
        buffer:='';
      end;
    finally
    end;
    CloseHandle(PipeOutputRead);

    //Fehler Read-Pipe auslesen
    Stream := TMemoryStream.Create;
    try
      while true do begin
        succeed := ReadFile(PipeErrorsRead, Buffer, 255, NumberOfBytesRead, nil);
        if not succeed then break;
        Stream.Write(Buffer, NumberOfBytesRead);
        buffer:='';
      end;
      Stream.Position := 0;
      Errors.LoadFromStream(Stream);
    finally
      Stream.Free;
    end;
    CloseHandle(PipeErrorsRead);

    WaitForSingleObject(ProcessInfo.hProcess, INFINITE);
    CloseHandle(ProcessInfo.hProcess);
  end
  else begin
    result:=false;
    CloseHandle(PipeOutputRead);
    CloseHandle(PipeOutputWrite);
    CloseHandle(PipeErrorsRead);
    CloseHandle(PipeErrorsWrite);
  end;
end;
Und dann der Aufruf vom Programm

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var errors: TStringList;
begin
  try
    errors:=TStringList.Create;
    if SftpCopy('pscp -C -l user -pw Password d:\testfile host:/home', errors) then
      Memo1.Lines.Assign(errors);
  finally
     errors.free;
  end;
end;
Es soll also D:\Testfile nach host:/home kopiert werden. -C heißt aktiviere Kompression,
user und password sind klar. Wenn sich PSCP nicht im selben Pfad wie Eure Anwendung befindet,
müßt ihr diesen mit angeben. (z.B.: d:\putty\pscp)

Wenn ich Zeit habe, packe ich das ganze mal in eine Komponente, damit man das ordentlich
bedienen kann.

So denn

Daliuz

Delphi-Freak 8. Jul 2006 14:14

Re: SFTP mit Indy
 
Danke!
Putty kann man ja überhaupt über die Kommandozeile bedienen; somit könnte man ja auch das andere via Putty machen, oder irre ich mich da?

LG, ich

daliuz 11. Jul 2006 01:43

Re: SFTP mit Indy
 
Hallo,

Putty selber ist mit grafischen Frontend, da ist es nicht so einfach. Aber es gibt für fast alles ein Kommandozeilen-programm z.B.: plink für eine ssh-verbindung, pscp für einfachen Filetransfer oder psftp als sftp-clienten.

Unter Freeware habe ich eine Komponente gelegt, die auf Basis vom plink eine ssh-verbindung herstellt.

http://www.delphipraxis.net/internal...&highlight=ssh

Mit kleineren Modifikationen kann man die für fast alles nehmen.

Daliuz

Delphi-Freak 11. Jul 2006 11:38

Re: SFTP mit Indy
 
Interessant - DANKE!


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:12 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