![]() |
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:
Dabei ist dann UseTLS utUseImplicitTLS und AUTHCmd tAuto.
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; Das Programm friert nur immer ein, ich habe schon alles Mögliche ausprobiert, aber leider immer erfolglos... LG, ich |
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 |
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... |
Re: SFTP mit Indy
Das Problem ist, dass ich mich nicht wirklich gut mit SFTP/SSH etc. auskenne. Ich verwende lokal zum Testen
![]() Danke aber auf jeden Fall, mit dem ![]() *hoffnungschöpf* :mrgreen: LG, ich |
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 |
Re: SFTP mit Indy
Zitat:
Zitat:
LG, ich |
Re: SFTP mit Indy
Zitat:
SFTP ist ein eigenes Protokol und hat eigentlich mit FTP nicht direkt etwas zu tun... (bis auf die Abkürzung) ![]() 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) ![]() Zitat:
|
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 |
Re: SFTP mit Indy
Zitat:
Zitat:
Zitat:
abgesehen davon ist FTPS imho einfacher zu implementieren als SFTP... |
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 |
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? |
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 |
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:
Und dann der Aufruf vom Programm
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;
Delphi-Quellcode:
Es soll also D:\Testfile nach host:/home kopiert werden. -C heißt aktiviere Kompression,
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; 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 |
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 |
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. ![]() Mit kleineren Modifikationen kann man die für fast alles nehmen. Daliuz |
Re: SFTP mit Indy
Interessant - DANKE!
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:15 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