Aufruf von Linux-Kosolenbefehl mit Passworteingabe

Für Fragen von Einsteigern und Programmieranfängern...
frisil
Beiträge: 11
Registriert: Mi 19. Mai 2010, 18:58

Aufruf von Linux-Kosolenbefehl mit Passworteingabe

Beitrag von frisil »

Hi,
ich fange gerade mit Lazarus an (unter Debian Linux), kenne etwas Pascal (in den frühen 90ern in der Schule gelernt). Hab mir zum Einstieg ein Delphi Heft gekauft und probiere etwas rum. Bin absoluter Neuling, deshalb hab ich (noch) keine wirkliche Ahnung von irgenwas.

Ich möchte ein Programm schreiben, mit dem ich meine encfs-Ordner verwalten kann (mounten und unmounten). encfs ist ein codiertes virtuelles Filesystem für Linux, die Daten liegen dabei verschlüsselt in einem Ordner, der in einen zweiten Ordner gemountet wird, mit diesem zweiten Ordner lässt sich dann normal arbeiten, die Verschlüsselung läuft im Hintergrund. Gemountet wird der Ordner mit dem Befehl encfs /Path/to/codierterOrdner /Path/to/Arbeitsverzeichnis in der Linuxkonsole, in der danach auch die Passwortabfrage erscheint.

Ich muß also diesen Befehl aufrufen und brauch dann irgendwie 'ne temporäre Linuxkonsole in meinem Lazarus-Programm, oder zumindest einen Bereich, in dem die Rückmeldung des Befehls angezeigt wird und in dem die Passwortabfrage stattfindet. Kann mir jemand helfen, wie ich das mache?

Hitman
Beiträge: 512
Registriert: Mo 25. Aug 2008, 18:17
OS, Lazarus, FPC: ArchLinux x86, WinVista x86-64, Lazarus 0.9.29, FPC 2.4.1
CPU-Target: x86
Wohnort: Chemnitz

Re: Aufruf von Linux-Kosolenbefehl mit Passworteingabe

Beitrag von Hitman »

Das dürfte nicht so leicht werden, da die meisten Passwortabfragen in Linux direkt von der Hardware, und nicht von stdin lesen.

frisil
Beiträge: 11
Registriert: Mi 19. Mai 2010, 18:58

Re: Aufruf von Linux-Kosolenbefehl mit Passworteingabe

Beitrag von frisil »

Unter FPC hab ich sowas schon gemacht, für ne Freundin die Lehrerin ist, damit sie einfach (ohne Konsolenbenutzung) an ihre verschlüsselten Schuldaten kommt. Das Programm wurde dann über Desktopicon mit "in Terminal starten" ausgeführt :

Code: Alles auswählen

clrscr;
      Writeln('Menu');
      Writeln;
      Writeln('m: mount external media drive');
      Writeln('s: mount encrypted school data');
      Writeln('h: execute command hidden from bash history');
      Writeln('any other key: nothing');
      Writeln;
      Writeln('Your choice now');
      c2:=readkey;
      if c2 = 'm' then begin
        S := fpsystem ('mount /dev/sdb1');
      end;
      if c2 = 's' then begin
        S := fpsystem ('encfs /home/xxx/schoolvault/.enc /home/xxx/schoolvault/enc');
      end;
      IF c2 = 'h' THEN BEGIN
        Writeln;
        Write('Enter hidden command:');
        Readln(stri);
        S := fpsystem (stri);
      end;
      writeln(' ');
      writeln ('Maybe something done with exit-status : ', S)
Das geht ohne Probleme. Wie krieg ich das in Lazarus rüber? Ich brauch auf jeden Fall eine Konsolenausgabe, denn das Porgramm oben lief ja in der Konsole, dort erfolgte dann auch die encfs-Passwortabfrage.

Benutzeravatar
didi
Beiträge: 46
Registriert: Mo 10. Mai 2010, 20:43
OS, Lazarus, FPC: Linux / Windows
CPU-Target: AMD 64-Bit
Wohnort: Plauen im Vogtland
Kontaktdaten:

Re: Aufruf von Linux-Kosolenbefehl mit Passworteingabe

Beitrag von didi »

Moin,
bin auch ein Einsteiger und habe unter Pardus ein kleines Lazarus-Programm geschrieben, welches Programme und die Konsole mit root-Rechten startet. Es ist an KDE4 gebunden, aber vielleicht hilft es Dir!
Link auf die Quelle: http://dieterjohn.di.funpic.de/Projekte ... Start.html
Gruß didi ><>

frisil
Beiträge: 11
Registriert: Mi 19. Mai 2010, 18:58

Re: Aufruf von Linux-Kosolenbefehl mit Passworteingabe

Beitrag von frisil »

Danke, didi,
ich hab mal nen schnellen Blick drauf geworfen, aber wie ich sehe startest du die Sachen in einer Konsole. Das könnte ich zwar auch machen, aber davon möchte ich ja gerade weg. Ich würde in mein Programm gerne so eine Art Pseudo-Konsole einbinden, in der die Passwortabfrage erfolgt und die Rückmeldung kommt, ohne ein separates Konsolenfester öffnen zu müssen.

Targion
Beiträge: 688
Registriert: Mi 3. Okt 2007, 21:00
OS, Lazarus, FPC: Linux (L 0.9.29 FPC 2.4.2)
CPU-Target: x86_64

Re: Aufruf von Linux-Kosolenbefehl mit Passworteingabe

Beitrag von Targion »

Nutzt du Linux? Dann lässt sich da über Pipes mit Sicherheit was machen. Schaue dir mal TProcess genauer an. Mit TProcess kannst du dann auch in stdin schreiben.

frisil
Beiträge: 11
Registriert: Mi 19. Mai 2010, 18:58

Re: Aufruf von Linux-Kosolenbefehl mit Passworteingabe

Beitrag von frisil »

Okay, Danke, ich hab mal folgendes mit TProcess versucht:

Code: Alles auswählen

unit Unit1; 
 
{$mode objfpc}{$H+}
 
interface
 
uses
  Classes, SysUtils, FileUtil, LResources, Forms, Controls, Graphics, Dialogs,
  Buttons, Process, LCLProc, ComCtrls, StdCtrls;
 
type
 
  { TForm1 }
 
  TForm1 = class(TForm)
    BitBtn1: TBitBtn;
    Edit1: TEdit;
    procedure BitBtn1Click(Sender: TObject);
    procedure Edit1Change(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
  end; 
 
var
  Form1: TForm1; 
 
implementation
 
{ TForm1 }
 
procedure TForm1.BitBtn1Click(Sender: TObject);
var AProcess: TProcess;
 
begin
  AProcess := TProcess.Create(nil);
  AProcess.CommandLine := 'encfs /home/frisil/crypt/.enc /home/frisil/crypt/enc';
  AProcess.options:=AProcess.options+[pousepipes];
  AProcess.Execute;
  AProcess.Input.Write(Edit1.Text, length(Edit1.Text));
  AProcess.Free;
end;
 
procedure TForm1.Edit1Change(Sender: TObject);
begin
  BitBtn1.Caption := Edit1.Text
end;
 
initialization
  {$I unit1.lrs}
 
end.
Das Programm hat einen Knopf und ein Editfeld, in dieses wird das Passwort geschrieben und beim Knopfdruck soll encfs ausgeführt werden und was im Editfeld steht soll dann übergeben werden.
Das klappt aber nicht, denn das Übergebene kommt irgendwie nicht an. Wenn ich das Programm in einem Terminal starte, erscheint dort bei Knopfdruck die Passwortabfrage, und ich könnte in der Konsole das Passwort eingeben. Warum kommt das Passwort aus dem Edit-Feld nicht an?

Hitman
Beiträge: 512
Registriert: Mo 25. Aug 2008, 18:17
OS, Lazarus, FPC: ArchLinux x86, WinVista x86-64, Lazarus 0.9.29, FPC 2.4.1
CPU-Target: x86
Wohnort: Chemnitz

Re: Aufruf von Linux-Kosolenbefehl mit Passworteingabe

Beitrag von Hitman »

Siehe meine erste Antwort auf diesen Thread.

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6782
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: Aufruf von Linux-Kosolenbefehl mit Passworteingabe

Beitrag von af0815 »

Test: Geht die Passworteingabe auf der Konsole per pipeing ? Wenn ja, dann ist es auch lösbar.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Hitman
Beiträge: 512
Registriert: Mo 25. Aug 2008, 18:17
OS, Lazarus, FPC: ArchLinux x86, WinVista x86-64, Lazarus 0.9.29, FPC 2.4.1
CPU-Target: x86
Wohnort: Chemnitz

Re: Aufruf von Linux-Kosolenbefehl mit Passworteingabe

Beitrag von Hitman »

Beispielhafter Workaround (wie es mit SSH funktioniert): http://bash.cyberciti.biz/security/expe ... in-script/" onclick="window.open(this.href);return false;

frisil
Beiträge: 11
Registriert: Mi 19. Mai 2010, 18:58

Re: Aufruf von Linux-Kosolenbefehl mit Passworteingabe

Beitrag von frisil »

Danke, euch beiden, aber leider kann ich nicht wirklich was damit anfangen. Ich bin kein erfahrener Programmierer, sondern eher normaler User und Gelegenheitsadmin meines kleinen Heimnetzwerks.

@ af0815: Wie probiere ich das denn auf Konsole aus? Wenn ich einen Befehl dafür hätte, der das Passwort gleich mitsendet, könnte ich den ja in einem String generieren und ausführen lassen.

@Hitman: Ich hab mir das script angesehen, aber ich verstehe nicht, worauf du hinauswillst. Ich hab mal versucht, ein '\r' zum String hinzuzufügen, aber da passiert immer noch nichts. Ich muss aber auch zugeben, dass ich nicht wirklich verstehe, was das script machen soll, außer wohl den ssh Kontakt herzustellen und die Passwortabfrage zu übernehmen.

Oh, und noch eine Frage: Macht es überhaupt Sinn, das encfs-Passwort über mein Programm einzulesen und an den encfs-Befehl weiterleiten zu lassen, oder erhöht das nur das Risiko, dass das Passwort danach im Klartext im Speicher steht und irgendwie irgendwo auf der Platte landet? Falls ja, könnte man sich die Verschlüsselung dann auch schenken - oder besser das Programm einfach eine Konsole mit dem encfs-Befehl öffnen lassen, in der dann das Passwort eingegeben wird. Was meint ihr?

Teekeks
Beiträge: 359
Registriert: Mi 27. Mai 2009, 20:54
OS, Lazarus, FPC: OpenSuse11.4 x86 (Lazarus: 0.9.30 FPC 2.4.2)
CPU-Target: x86
Wohnort: Cottbus

Re: Aufruf von Linux-Kosolenbefehl mit Passworteingabe

Beitrag von Teekeks »

mit dem \r wird vermutlich ein #10 gemeint sein.

Mit folgendem Teil kann man strings an den gerade ausgeführten Prozess senden, auch sogar dann wenn man normalerweise nicht sowas eingeben kann (also wenn z.B. ein bestimmter Befehl gesendet werden soll was normal nicht geht (z.B. beim MPlayer)):

Code: Alles auswählen

procedure SendCommand(ap:TProcess; cmd: string);
begin
  if ap=nil then exit;
  cmd:=cmd+#10;
  if ap.Active then
    ap.Input.Write(cmd[1],Length(cmd));
end;
Gruß Teekeks

frisil
Beiträge: 11
Registriert: Mi 19. Mai 2010, 18:58

Re: Aufruf von Linux-Kosolenbefehl mit Passworteingabe

Beitrag von frisil »

Danke Teekeks,
aber ist das nicht fast das, was ich in meinem Programm (siehe oben) schon mache, nur noch durch ein paar Sicherheitsabfragen erweitert, ob der Prozess überhaupt noch läuft?
Was ich nicht verstehe: Warum ap.Input.Write(cmd[1],... ? Sendet das nicht statt des Strings nur das erste Zeichen, oder hab ich da was falsch in Erinnerung? Wie gesagt, ist 'nen paar Jahre her, seit ich das letzte mal ernsthaft programmiert habe.

frisil
Beiträge: 11
Registriert: Mi 19. Mai 2010, 18:58

Re: Aufruf von Linux-Kosolenbefehl mit Passworteingabe

Beitrag von frisil »

Ich bin ein kleines Stück weiter, ich hab rausgefunden wie das mit der Pipe geht und mit welchem Befehl man direkt (auf Konsole) mounten kann:

Code: Alles auswählen

echo "dasisteintest" | encfs -S /home/frisil/test/.enc /home/frisil/test/enc
Der Parameter -S bewirkt, das von stdin gelesen wird, statt von einem Promt. Ich hätte "man encfs" einfach mal eher machen sollen... :oops:

Wenn ich diesen Befehl einfach in meinem Programm übergebe:

Code: Alles auswählen

st := 'echo "' + Edit1.Text + '" | encfs -S /home/frisil/test/.enc /home/frisil/test/enc';
AProcess.CommandLine := st;
bringt mir das leider nichts, denn ich hab gelesen, dass Tprocess keine Konsole ist, scheint also die Pipe | nicht zu verstehen. Seltsamerweise bringt es mir auch nichts, den -S Parameter bei encfs einfach in mein Programm von oben zu übernehmen, und dann zu versuchen, das Passwort per AProcess.Input.Write zu schicken. Was mache ich falsch? Ist bestimmt nur noch 'ne Kleinigkeit.

Hitman
Beiträge: 512
Registriert: Mo 25. Aug 2008, 18:17
OS, Lazarus, FPC: ArchLinux x86, WinVista x86-64, Lazarus 0.9.29, FPC 2.4.1
CPU-Target: x86
Wohnort: Chemnitz

Re: Aufruf von Linux-Kosolenbefehl mit Passworteingabe

Beitrag von Hitman »

Na du brauchst deine neue Erkenntnis doch nur mit deinem alten Code kombinieren: starte encfs mit dem Parameter -S und schreib das Passwort dann in stdin (also wie schon in deinem Code, einzige Änderung halt der Parameter).

Antworten