![]() |
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:17 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