[gelöst] Einhängen eines Verzeichnisses mit "sshfs"

Antworten
Linkat
Lazarusforum e. V.
Beiträge: 530
Registriert: So 10. Sep 2006, 23:24
OS, Lazarus, FPC: Linux Mint 21.3; Lazarus 3.0 FPC 3.2.2; RaspiOS
CPU-Target: AMD 64, ARM 32
Wohnort: nr Stuttgart

[gelöst] Einhängen eines Verzeichnisses mit "sshfs"

Beitrag von Linkat »

Unter Linux kann ich, wenn sshfs installiert ist, ein Verzeichnis eines hosts in mein Verzeichnis einhängen.
Der Konsolenbefehl hierfür lautet:

Code: Alles auswählen

sshfs user@host:/home/user/ /verzeichnis/
Darauf folgt die Passworteingabe in der Konsole.

Man kann die Passworteingabe auch in einem Rutsch mit eine Befehl eingeben. Dieser lautet:

Code: Alles auswählen

 sshfs -o password_stdin user@host:/home/host/ /verzeichnis <<< password
Dies funktioniert auf der Kommandoebene auch wie es soll.

Pack ich aber die Befehle in TProcess, so funktioniert es nicht.

Code: Alles auswählen

  Process1:=TProcess.Create(Self);
  Process1.Executable:='sshfs';
  Process1.Parameters.Add('-o');
  Process1.Parameters.Add('password_stdin');
  Process1.Parameters.Add('user@host:/home/user/');
  Process1.Parameters.Add('/verzeichnis/');
  Process1.Parameters.Add('<<<');
  Process1.Parameters.Add('password');
  Process1.Options:=Process1.Options+[poWaitOnExit,poUsePipes];
  Process1.Execute;
  Process1.Free;
Mit den Options habe ich schon variiert, aber ohne Erfolg.

Das Aushängen des über die Konsole eingehängten Verzeichnisses mit dem Befehl

Code: Alles auswählen

fusermount -u /verzeichnis
funktioniert auch mit TProcess.

Code: Alles auswählen

  Process1:=TProcess.Create(Self);
  Process1.Executable:='fusermount';
  Process1.Parameters.Add('-u');
  Process1.Parameters.Add('/verzeichnis/');
  Process1.Execute;
  Process1.Free;
Wer kennt das Problem und kann helfen?
Ich weiß, dass man das Passwort mit ssh keygen umgehen kann. Ich möchte aber verstehen, warum der Befehl nicht durch TProcess ausgeführt wird.



Hier ein Testprojekt:
Aber vorher sshfs installieren!!!
Dateianhänge
test_sshfs.zip
(137.73 KiB) 56-mal heruntergeladen
Zuletzt geändert von Linkat am Mi 19. Okt 2022, 08:44, insgesamt 1-mal geändert.
Linux Mint 21; Lazarus 2.2.4 FPC 3.2.2; RaspiOS

Socke
Lazarusforum e. V.
Beiträge: 3158
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: Einhängen eines Verzeichnisses mit "sshfs"

Beitrag von Socke »

Linkat hat geschrieben:
Di 18. Okt 2022, 09:01
Ich weiß, dass man das Passwort mit ssh keygen umgehen kann. Ich möchte aber verstehen, warum der Befehl nicht durch TProcess ausgeführt wird.
<<< password sind keine Programmparameter sondern werden von deiner Shell interpretiert. D.h. diese Teil musst du selbst in deinem Programm umsetzen.
Das Einlesen der Passwort-Datei sollte kein Problem darstellen (TFileStream). Den Inhalt musst du eigentlich nur auf TProcess.Input kopieren.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Benutzeravatar
theo
Beiträge: 10467
Registriert: Mo 11. Sep 2006, 19:01

Re: Einhängen eines Verzeichnisses mit "sshfs"

Beitrag von theo »

Ohne mich genauer damit befasst zu haben, würde ich vermuten, dass du dort Shell Kommandos verwendest.
Wenn du das machen willst, müsste dein Executable '/bin/sh' heissen und nicht 'sshfs'.

S.a. z.B.

Code: Alles auswählen

Process.Commandline := 'sh -c "pwd | grep / -"';
https://wiki.lazarus.freepascal.org/Exe ... l_Programs

EDIT: Socke war schneller. :wink:

Linkat
Lazarusforum e. V.
Beiträge: 530
Registriert: So 10. Sep 2006, 23:24
OS, Lazarus, FPC: Linux Mint 21.3; Lazarus 3.0 FPC 3.2.2; RaspiOS
CPU-Target: AMD 64, ARM 32
Wohnort: nr Stuttgart

Re: Einhängen eines Verzeichnisses mit "sshfs"

Beitrag von Linkat »

@Socke @theo vielen Dank für Tipps. Ich denke schon, dass ich es verstanden habe, aber bei der Umsetzung habert es. Die Beispiele im Wiki sind zu komplex bzw. sind weit von meinem Problem. Konnte leider keine Erkenntnisse herausziehen.

Dies (und vieles andere) habe ich leider ohne Erfolg getestet:

Code: Alles auswählen

  var s             :ansistring;
  
  
  s:='password';
  Process1:=TProcess.Create(Self);
  Process1.Executable:='sshfs';
  Process1.Parameters.Add('-o');
  Process1.Parameters.Add('password_stdin');
  Process1.Parameters.Add('user@host:/home/user/');
  Process1.Parameters.Add('/verzeichnis/');
  //Process1.Parameters.Add('<<<');
  //Process1.Parameters.Add('password');
  Process1.Options:=Process1.Options+[poWaitOnExit,poUsePipes];
  Process1.Execute;
  
  Process1.Input.Write(s[1],Length(s));
  
  Process1.Free;

Wie kann ich das Passwort mit einem Stream in den Process1.Input schieben??
Linux Mint 21; Lazarus 2.2.4 FPC 3.2.2; RaspiOS

Benutzeravatar
Winni
Beiträge: 1577
Registriert: Mo 2. Mär 2009, 16:45
OS, Lazarus, FPC: Laz2.2.2, fpc 3.2.2
CPU-Target: 64Bit
Wohnort: Fast Dänemark

Re: Einhängen eines Verzeichnisses mit "sshfs"

Beitrag von Winni »

Hi!

Und noch einmal:

TProcess ist keine Shell!

Du musst als erstes executable die shell rufen:

Code: Alles auswählen

Process1.Executable:='/bin/sh -c';
Und daran hängst Du dann das sshfs Zeugs als Parameter

Winni

Linkat
Lazarusforum e. V.
Beiträge: 530
Registriert: So 10. Sep 2006, 23:24
OS, Lazarus, FPC: Linux Mint 21.3; Lazarus 3.0 FPC 3.2.2; RaspiOS
CPU-Target: AMD 64, ARM 32
Wohnort: nr Stuttgart

Re: Einhängen eines Verzeichnisses mit "sshfs"

Beitrag von Linkat »

Hatte ich schon vergeblich probiert. Und jetzt noch mal.

Code: Alles auswählen

procedure TForm1.btsshfsClick(Sender: TObject);
begin
  Process1:=TProcess.Create(Self);
  Process1.Executable:='/bin/sh -c';
  Process1.Parameters.Add('sshfs');
  Process1.Parameters.Add('-o');
  Process1.Parameters.Add('password_stdin');
  Process1.Parameters.Add('user@host:/home/user/');
  Process1.Parameters.Add('/verzeichnis/');
  Process1.Parameters.Add('<<<');
  Process1.Parameters.Add('password');
  Process1.Options:=Process1.Options+[poWaitOnExit,poUsePipes];
  Process1.Execute;
  Process1.Free;
end;

Das Resultat: Siehe Bild im Anhang
Dateianhänge
Fehlermeldung.png
Fehlermeldung.png (20.67 KiB) 1304 mal betrachtet
Linux Mint 21; Lazarus 2.2.4 FPC 3.2.2; RaspiOS

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6198
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: Einhängen eines Verzeichnisses mit "sshfs"

Beitrag von af0815 »

Die Frage ist welche Shell verwendet du und wo liegt sie bei dir, nachdem /bin/sh nicht gefunden wird. Das ist leider etwas distributionsabhängig.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Socke
Lazarusforum e. V.
Beiträge: 3158
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: Einhängen eines Verzeichnisses mit "sshfs"

Beitrag von Socke »

af0815 hat geschrieben:
Mi 19. Okt 2022, 06:21
Die Frage ist welche Shell verwendet du und wo liegt sie bei dir, nachdem /bin/sh nicht gefunden wird. Das ist leider etwas distributionsabhängig.
Ihr habt jetzt bei den selben Fehler gemacht :) /bin/sh -c ist kein Programm. Wenn schon per Shell, dann so:

Code: Alles auswählen

procedure TForm1.btsshfsClick(Sender: TObject);
begin
  Process1:=TProcess.Create(Self);
  Process1.Executable:='/bin/sh';
  Process1.Parameters.Add('-c');
  Process1.Parameters.Add('sshfs');
  Process1.Parameters.Add('-o');
  Process1.Parameters.Add('password_stdin');
  Process1.Parameters.Add('user@host:/home/user/');
  Process1.Parameters.Add('/verzeichnis/');
  Process1.Parameters.Add('<<<');
  Process1.Parameters.Add('password');
  Process1.Options:=Process1.Options+[poWaitOnExit,poUsePipes];
  Process1.Execute;
  Process1.Free;
end;
Wobei das mit dem Stream auch gehen sollte. In deinem Code konnte das Kennwort gar nicht gesendet werden, da dein Programm vorher noch auf das Ende von sshfs gewartet hat. Möglicherweise musst du auch noch den Stream schließen, damit sshfs weiß, dass das Passwort komplett gesendet wurde.

Code: Alles auswählen

  var s             :ansistring;
  
  
  s:='password';
  Process1:=TProcess.Create(Self);
  Process1.Executable:='sshfs';
  Process1.Parameters.Add('-o');
  Process1.Parameters.Add('password_stdin');
  Process1.Parameters.Add('user@host:/home/user/');
  Process1.Parameters.Add('/verzeichnis/');
  Process1.Options:=Process1.Options+[poUsePipes]; // kein poWaitOnExit, sonst wartet das Pascal-Programm bei Execute
  Process1.Execute;
  
  Process1.Input.Write(s[1],Length(s));
  Process1.CloseInput; // Standard Input von sshfs schließen
  Process1.WaitOnExit(); // warten bis sshfs fertig ist.
  Process1.Free;
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Linkat
Lazarusforum e. V.
Beiträge: 530
Registriert: So 10. Sep 2006, 23:24
OS, Lazarus, FPC: Linux Mint 21.3; Lazarus 3.0 FPC 3.2.2; RaspiOS
CPU-Target: AMD 64, ARM 32
Wohnort: nr Stuttgart

[gelöst] Re: Einhängen eines Verzeichnisses mit "sshfs"

Beitrag von Linkat »

Kaum macht man es richtig, funktioniert es.

Die drei Zeilen von @Socke

Code: Alles auswählen

  Process1.Input.Write(s[1],Length(s));
  Process1.CloseInput; // Standard Input von sshfs schließen
  Process1.WaitOnExit(); // warten bis sshfs fertig ist.
sind der Schlüssel zum Erfolg.

Die Lösung mit der Bash hab` ich nicht zum Laufen gekriegt.

Vielen Dank für die Unterstützung.

Gruß, Linkat
Linux Mint 21; Lazarus 2.2.4 FPC 3.2.2; RaspiOS

Antworten