Aufruf von Linux-Kosolenbefehl mit Passworteingabe
Aufruf von Linux-Kosolenbefehl mit Passworteingabe
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?
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?
-
- 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
Das dürfte nicht so leicht werden, da die meisten Passwortabfragen in Linux direkt von der Hardware, und nicht von stdin lesen.
Re: Aufruf von Linux-Kosolenbefehl mit Passworteingabe
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 :
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.
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)
- 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
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 ><>
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 ><>
Re: Aufruf von Linux-Kosolenbefehl mit Passworteingabe
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.
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.
-
- 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
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.
Re: Aufruf von Linux-Kosolenbefehl mit Passworteingabe
Okay, Danke, ich hab mal folgendes mit TProcess versucht:
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?
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 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?
-
- 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
Siehe meine erste Antwort auf diesen Thread.
- af0815
- Lazarusforum e. V.
- Beiträge: 6780
- 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
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).
-
- 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
Beispielhafter Workaround (wie es mit SSH funktioniert): http://bash.cyberciti.biz/security/expe ... in-script/" onclick="window.open(this.href);return false;
Re: Aufruf von Linux-Kosolenbefehl mit Passworteingabe
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?
@ 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?
-
- 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
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)):
Gruß Teekeks
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;
Re: Aufruf von Linux-Kosolenbefehl mit Passworteingabe
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.
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.
Re: Aufruf von Linux-Kosolenbefehl mit Passworteingabe
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:
Der Parameter -S bewirkt, das von stdin gelesen wird, statt von einem Promt. Ich hätte "man encfs" einfach mal eher machen sollen...
Wenn ich diesen Befehl einfach in meinem Programm übergebe:
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.
Code: Alles auswählen
echo "dasisteintest" | encfs -S /home/frisil/test/.enc /home/frisil/test/enc

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;
-
- 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
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).