Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Text Datei von Delphi Programm an einen Linux PC senden (https://www.delphipraxis.net/192022-text-datei-von-delphi-programm-einen-linux-pc-senden.html)

A.Griffin 14. Mär 2017 08:15

Delphi-Version: 7

Text Datei von Delphi Programm an einen Linux PC senden
 
Hallo zusammen,
gestern habe ich Here eine Text Datei in einer Memo angezeigt und dann wieder gespeichert. Jetzt wäre ich für Vorschläge für den nächsten Schritt sehr dankbar. Ich muss einem Linux Rechner über Ethernet die Text Datei übertragen. Wie wäre das am einfachsten lösbar? Mein Kollege meinte es sollte über SSH machbar sein, aber ich habe keine kostenlosen oder open-source SSH Plugins für Delphi 7 gefunden. Gäbe es eine andere Möglichkeit?

Klaus01 14. Mär 2017 08:22

AW: Text Datei von Delphi Programm an einen Linux PC senden
 
.. hat lockbox da nicht etwas im Angebot?
Die Putty.exe oder plink.exe könnte meines Wissen auch für SSH/SFTP genuzt werden.

Grüße
Klaus

A.Griffin 14. Mär 2017 09:15

AW: Text Datei von Delphi Programm an einen Linux PC senden
 
Wie würde ich dann mit über meine Delphi App mit Putty oder plink kommunizieren? Es muss alles über die Delphi App laufen.

Klaus01 14. Mär 2017 09:40

AW: Text Datei von Delphi Programm an einen Linux PC senden
 
siehe hier

Grüße
Klaus

zagota 14. Mär 2017 10:12

AW: Text Datei von Delphi Programm an einen Linux PC senden
 
Zitat:

Zitat von A.Griffin (Beitrag 1364104)
Hallo zusammen,
gestern habe ich Here eine Text Datei in einer Memo angezeigt und dann wieder gespeichert. Jetzt wäre ich für Vorschläge für den nächsten Schritt sehr dankbar. Ich muss einem Linux Rechner über Ethernet die Text Datei übertragen. Wie wäre das am einfachsten lösbar? Mein Kollege meinte es sollte über SSH machbar sein, aber ich habe keine kostenlosen oder open-source SSH Plugins für Delphi 7 gefunden. Gäbe es eine andere Möglichkeit?

FTP? Auf dem LinuxPC muss dann ein FTP-Server laufen.

Klaus01 14. Mär 2017 10:20

AW: Text Datei von Delphi Programm an einen Linux PC senden
 
Zitat:

Zitat von zagota (Beitrag 1364137)
FTP? Auf dem LinuxPC muss dann ein FTP-Server laufen.

Ist die Frage welcher Einsatz für die Software angedacht ist - ghet es über das Internet würde ich SSH/SFTP vorziehen.

Grüße
Klaus

zagota 14. Mär 2017 10:26

AW: Text Datei von Delphi Programm an einen Linux PC senden
 
Zitat:

Zitat von Klaus01 (Beitrag 1364138)
Zitat:

Zitat von zagota (Beitrag 1364137)
FTP? Auf dem LinuxPC muss dann ein FTP-Server laufen.

Ist die Frage welcher Einsatz für die Software angedacht ist - ghet es über das Internet würde ich SSH/SFTP vorziehen.

Grüße
Klaus

Übers Internet würde ich auch nur SSH verwenden.
Der Threadersteller schrieb "Linux Rechner über Ethernet", schätze die Rechner sind lokal im LAN. Notfalls kann die Datei vor dem Versenden auch verschlüsselt werden.

A.Griffin 14. Mär 2017 10:42

AW: Text Datei von Delphi Programm an einen Linux PC senden
 
Die Rechner sind direkt mit einem Ethernetkabel miteinander verbunden. Kann ich die Komponente von "Daliuz" in D7 benutzen obwohl es mit Delphi 2005 geschrieben wurde?

SebastianZ 14. Mär 2017 15:26

AW: Text Datei von Delphi Programm an einen Linux PC senden
 
Mal eine andere Idee:
Wenn es immer der selbe Linux-PC ist, spricht aus meiner Sicht nichts gegen eine Freigabe eines Linux-Ordners an das Windows.
Dadurch sollte es über Standardwege möglich sein, die Textdatei direkt zu speichern. (...SaveToFile()...)
Zur Freigabe von Ordnern zwischen Linux und Windows findet man mit etwas gegoogle recht schnell Hinweise und Anleitungen.

BrightAngel 14. Mär 2017 16:04

AW: Text Datei von Delphi Programm an einen Linux PC senden
 
Ich würde die ssh/plink Geschichte noch weiter verfolgen:
Hier hatte jemand wohl Erfolg mit dem scp Subsystem.

Schaue mir gerade mal die Komponente von daliuz an; vielleicht kann die das ja/kann dafür erweitert werden (da sie ja plink benutzt...). :)
Im Zweifel wäre scp an sich vermutlich der "modernere" Weg. Grade in Sachen Leitungssicherheit. FTP ist halt auf der Leitung lesbar. Zudem kommt das Argument dazu, dass auf der Ziellinuxkiste dann auch ein FTP-Server zusätzlich zum (vermutlich eh schon vorhandenen) sshd läuft. Dadurch wird sowohl die Angriffsfläche auf der Zielmaschine kleiner. Und man ist flexibler. Keine Ahnung, ob das auf deine Umgebung zutrifft...:thumb:

Brighty

Dalai 14. Mär 2017 16:21

AW: Text Datei von Delphi Programm an einen Linux PC senden
 
Es gibt nicht nur PuTTY und plink.exe sondern auch pscp.exe und psftp.exe. Letztere erlauben das Übertragen einzelner Dateien. Wenn es also nicht unbedingt im Programm fest integriert sein muss, bieten sich diese an. Kommt darauf an, wie häufig da Updates nötig sind.

Grüße
Dalai

BrightAngel 14. Mär 2017 16:27

AW: Text Datei von Delphi Programm an einen Linux PC senden
 
Genau. Klar, ein anderes Programm im Hintergrund starten und dann nur über Startparameter und die Pipe kontrollieren ist nicht immer schön. Andererseits, weil du grade auch das Thema Update erwähnst: Das ist dann auch sehr einfach zu updaten; grade weil das Interface zum arbeitenden Subsystem so "einfach" gestaltet ist. 8-)

Brighty

A.Griffin 15. Mär 2017 08:20

AW: Text Datei von Delphi Programm an einen Linux PC senden
 
Pscp scheint ja alles zu sein was ich brauche. Meint ihr es wäre einfach machbar die plink Komponente für pscp umzuschreiben? Ich habe auch das hier gefunden. Weiß einer von euch wo ich MW_WinMisc und MW_Files herbekommen kann?

BrightAngel 15. Mär 2017 21:45

AW: Text Datei von Delphi Programm an einen Linux PC senden
 
Zitat:

The code is for Delphi 2010 and uses my WinMisc and Files class. You can implement your own WinMisc.ExecuteConsolePipe() and Files.CreateUnique(), or
you can E-Mail me and I will send you the source of MW_WinMisc and MW_Files.
The code should not be too difficult to port to lower Delphi versions.
(ganz oben steht das auf der von dir verlinkten Seite; der Autor ganz oben hat zwar dort keine Email hinterlassen, aber google förderte das hier zu Tage [anderes Thema, aber selber(?) Autor])

Also ja die pscp.exe reicht quasi für den Job. Wenn man sich den von dir verlinkten Quellcode anschaut, dann fällt auf, dass er den Befehl zum Starten der Exe einfach programmatisch zusammenbaut. :)
Im Zweifel findest du hier auch noch ein wenig Dokumentation dazu: klick!

Brighty

A.Griffin 16. Mär 2017 08:00

AW: Text Datei von Delphi Programm an einen Linux PC senden
 
Mir wurde jetzt auch gesagt, dass ich mit WinExec einfach die pscp.exe ausführen kann. Wäre das einfach möglich?

BrightAngel 16. Mär 2017 08:20

AW: Text Datei von Delphi Programm an einen Linux PC senden
 
Genau, das ist die Intention. Nur WinExec ist nur Zwecks Kompatibilität noch da (siehe diese Notiz ganz oben).
Mehr Kontrolle (und moderner) geht es mit der Aufruffamilie um CreateProcess. Damit kannst du dann auch sehr fein einstellen, was genau aufgerufen wird.

[Edit 1]
Anders als putty (wo es ja um Interaktivität geht), brauchst du bei pscp grundsätzlich nicht das stdIn/Out des neuen Prozesses. Jedoch bist du vermutlich am Erfolg und des Fortschritts der Übertragung interessiert!? Ich habe das jetzt bei pscp nicht getestet; vielleicht kannst du grundsätzlichen Erfolg über den ExitCode von pscp herausfinden? Wenn du mehr Details brauchst, dann müsstest du dir gegebenenfalls StdOut besorgen und die Ausgabe in deinem Programm weiterverarbeiten. :)
[/Edit]

[Edit 2]
Falls du das mit CreateProcess machen solltest, seien dir in der STARTUPINFO die Felder hStdOutput und hStdError (ganz unten in der Struct) wärmstens zu empfehlen :)
[/Edit]

[Edit 3]
Das Handle kannst du mit CreatePipe erzeugen. Dieser Aufruf erzeugt eine Pipe mit zwei verbundenen Handles. Das eine Ende kannst du dann dem neuen Prozess übergeben und aus dem anderen kannst du dann (z.B. in einem eigenen Thread in deinem Programm) wiederholt lesen, bis das Programm sich beendet/du das Programm beendest/die Ausgabe des Programms dich nicht mehr interessiert/.... Aufräumen nicht vergessen. :P
[/Edit]

[Edit 4]
Nachtrag: Artverwandtes Thema gefunden; Klick!
[/Edit]

Brighty

A.Griffin 16. Mär 2017 10:11

AW: Text Datei von Delphi Programm an einen Linux PC senden
 
Ich habe es jetzt erstmal mit WinExec gemacht auch, wenn CreateProcess empfohlen ist. Mit WinExec ging es jetzt sehr einfach. Ich gucke mir aber, wenn ich mal Zeit habe an wie es mit CreateProcess geht. Vielen Dank an alle für die Antworten.

freimatz 16. Mär 2017 13:14

AW: Text Datei von Delphi Programm an einen Linux PC senden
 
Zitat:

Zitat von A.Griffin (Beitrag 1364382)
... wenn ich mal Zeit habe ...

:lol:

A.Griffin 16. Mär 2017 13:35

AW: Text Datei von Delphi Programm an einen Linux PC senden
 
Zitat:

Zitat von freimatz (Beitrag 1364392)
Zitat:

Zitat von A.Griffin (Beitrag 1364382)
... wenn ich mal Zeit habe ...

:lol:

..oder die Software nicht läuft und ich gezwungen bin mich in CreateProcess einzulesen.

BrightAngel 16. Mär 2017 14:19

AW: Text Datei von Delphi Programm an einen Linux PC senden
 
Machst du es jetzt dann über den ExitCode von pscp? Was passiert, wenn du keine Verbindung zum Server aufbauen kannst? Merkt dein Programm das?

Brighty

Jumpy 16. Mär 2017 14:50

AW: Text Datei von Delphi Programm an einen Linux PC senden
 
Wir haben das mal ungefähr so gemacht:

Delphi-Quellcode:
function SendFile:Boolean;
var output:String;
begin
output:=CaptureConsoleOutput(Command);
Result:=Pos('100%',output)>0;
end;


//Diese Funktion hab ich mal irgendwo gefunden (hier in der DP ?)
function CaptureConsoleOutput(const ACommand: String):String;
const
    CReadBuffer = 2400;
var
    saSecurity: TSecurityAttributes;
    hRead: THandle;
    hWrite: THandle;
    suiStartup: TStartupInfo;
    piProcess: TProcessInformation;
    pBuffer: array [0 .. CReadBuffer] of AnsiChar;
    dBuffer: array [0 .. CReadBuffer] of AnsiChar;
    dRead: DWord;
    dRunning: DWord;
    erg:String;
begin
    saSecurity.nLength := SizeOf(TSecurityAttributes);
    saSecurity.bInheritHandle := True;
    saSecurity.lpSecurityDescriptor := nil;
    erg:='';
    if CreatePipe(hRead, hWrite, @saSecurity, 0) then
    begin
        FillChar(suiStartup, SizeOf(TStartupInfo), #0);
        suiStartup.cb := SizeOf(TStartupInfo);
        suiStartup.hStdInput := hRead;
        suiStartup.hStdOutput := hWrite;
        suiStartup.hStdError := hWrite;
        suiStartup.dwFlags := STARTF_USESTDHANDLES or STARTF_USESHOWWINDOW;
        suiStartup.wShowWindow := SW_HIDE;

        if CreateProcess(nil, pChar(ACommand+' '), @saSecurity, @saSecurity, True, NORMAL_PRIORITY_CLASS, nil, nil, suiStartup, piProcess) then
        begin
            //repeat
                dRunning := WaitForSingleObject(piProcess.hProcess, 2000);
                Application.ProcessMessages();
                repeat
                    dRead := 0;
                    ReadFile(hRead, pBuffer[0], CReadBuffer, dRead, nil);
                    pBuffer[dRead] := #0;
                    OemToCharA(pBuffer, dBuffer);
                    erg:=dBuffer;
                until (dRead < CReadBuffer);
            //until (dRunning <> WAIT_TIMEOUT);
            CloseHandle(piProcess.hProcess);
            CloseHandle(piProcess.hThread);
        end;
        CloseHandle(hRead);
        CloseHandle(hWrite);
    end;
    Result:=erg;
end;

function Command: String;
var path:String;
begin
  //hier lag die PSCP.exe mit im Programm-Verzeichnis, daher:
  path:=ExtractFilePath(Application.ExeName);
  Result:=path+'pscp.exe -P '+Port+' -pw '+pswrd+' '+
          Dateienname+' '+username+'@'+URL+':'+targetdir;

  //alt mit keyfile im Programm-Verzeichnis:
  //Result:=path+'pscp.exe -P '+Port+' -i '+path+keyfile+' '+
  //        Dateiename+' '+username+'@'+URL+':'+targetdir;
end;
Bei fernsteuern der ganzen Putty-Dinger muss man nur aufpassen, wenn mal der Server wechselt oder so, da Putty dann nachfragt, wenn eine andere Signatur gefunden wird (macht ja Sinn). Aber wenn das im Batch-Betrieb passiert ist das nervig, wobei es da wohl auch Parameter gibt, die dan ggf. verhindern können?

BrightAngel 16. Mär 2017 15:17

AW: Text Datei von Delphi Programm an einen Linux PC senden
 
Ja, aber er hat es ja jetzt mit WinExec gemacht. Hatte mich da gefragt, wie er den Erfolg auswertet. Das ist ja mit CreateProcess eigentlich einfacher, oder? :|

A.Griffin 17. Mär 2017 08:45

AW: Text Datei von Delphi Programm an einen Linux PC senden
 
Bis jetzt habe ich den Erfolg noch gar nicht ausgewertet.

Rollo62 17. Mär 2017 09:21

AW: Text Datei von Delphi Programm an einen Linux PC senden
 
Bin nicht sicher ob es in deinem Fall hilft, aber kennst du DosCommand im GetIt Package ?

Das kann sowie ich weiss einiges in Richtung stdin stdout bewerkstelligen.

Rollo

A.Griffin 21. Mär 2017 09:37

AW: Text Datei von Delphi Programm an einen Linux PC senden
 
DosCommand hört sich sehr interessant an. Wo bekomme ich für Delphi 7 das her?

Rollo62 21. Mär 2017 12:09

AW: Text Datei von Delphi Programm an einen Linux PC senden
 
TurboPack/DOSCommand

-obs mit D7 läuft weiss ich nicht


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