absoluten Pfad einer Datei auf CD bestimmen

Message
Author
Stephan

absoluten Pfad einer Datei auf CD bestimmen

#1 Post by Stephan »

Hallo,

auf einer CD befindet sich ein Programm (kompillierte Flash-Datei (Projektor)), dieses Programm arbeitet nur richtig wenn der aktuelle Pfad vor Start des Programms auf das Verzeichnis eingestellt wird in welchem sich das Programm befindet.

Wie bestimme ich mittels eines Scriptes den absoluten Pfad zum Programm (auf einem mir unbekanntem Zielsystem), damit ich anschließend diesen Pfad mit cd einstellen und das Programm starten kann? Vielleicht kennt auch jemand einen Programmstarter/Launcher o.ä. der selbiges erledigt, ohne das er vorher installiert werden muß?

Hintergrund ist das ich eine CD mit einer Präsentation erstellt habe die der Nutzer durch Mausklick auf das Script starten können soll, das direkte Starten des Programms ist wie gesagt nicht möglich, weil vorher der richtige absolute Pfad eingestellt werden muß damit das Programm korrekt arbeitet.

Gruß
Stephan

Carsten

Re: absoluten Pfad einer Datei auf CD bestimmen

#2 Post by Carsten »

Wie wärs mit einem bash-Script, das einfach "pwd" ausführt... Hab von Shellscripten aber wenig Ahnung. Oder gleich ein C++ Programm schreiben... Schreib mir bei Interesse :P

CU Carsten

Stephan

Re: absoluten Pfad einer Datei auf CD bestimmen

#3 Post by Stephan »

Hallo Carsten,

pwd habe ich bereits probiert, geht nicht. Zum Beispiel:

#! /bin/bash
pwd > xxx

schreibt den Pfad des Homeverzeichnisses in die Datei xxx, welche im eben diesem Homeverzeichnis angelegt wird.
Was geht ist find (mit Parametern), jedoch dauert die Suche unakzeptabel lange um damit eine Präsentation zu starten.
Ich würde das Ganze auch in C++ schreiben, wenn ich wüßte wie, aber das einzige was ich mit C++ bisher gemacht habe ist mit dem BorlandKommandozeilenCompiler Programme des Niveaus "Hello World" unter Windows zu kompillieren. Vom Linux habe ich kaum Ahnung.
Die CD soll etwa so sein:
im Wurzelverzeichnis befindet sich das Script (oder C++ Programm o.ä.)dessen Name "Start" "Index" oder so wäre, der Benutzer legt die CD ein, mountet und öffnet in Dateimanager und startet die Datei mit Mausklick. Die Datei stellt dann den Pfad ein und ruft mein Programm auf (dessen Pfad _relativ_ zum Wurzelverzeichnis der CD bekannt ist). Wenn ich mich auf einem System befinde wo ich den Mountpunkt des CD-LW kenne (/mnt/cdrom) und das Programm (programm) im Wurzelverzeichnis ist, funktioniert unabhängig vom aktuellen Benutzer z.B.:

#! /bin/bash
# ich kenne nicht das Homeverzeichnis, also es zur Wurzel
cd /
# ich kenne den Mountpunkt, also
cd mnt/cdrom
# und starten
./programm

Das Problem ist das ich auf einem _unbekannten_ System nicht den Mountpunkt des CD-Laufwerks kenne. Wie ich feststellen konnte ist es keine gute Idee anzunehmen das dieser bei /mnt/cdrom liegt, weil er z.B. auch /mnt/dvd lauten kann und letztlich wohl "beliebig" gewählt sein kann. Und die CD soll auf einem beliebigen Linux-System funktionieren, wo ich den Mountpunkt also vorher nicht kenne.

Ich habe schon tagelang das Internet durchsucht und kann nicht glauben das es für das geschilderte Problem unter Linux keine Lösung gibt (es muß nicht unbedingt ein Script sein), ich wäre also für jeden Vorschlag offen.

vielleicht noch folgende Erläuterung:
Ich habe eine Präsentation (auf CD) für Windows erstellt und hatte mich eimal informiert was für Möglichkeiten es dafür unter Linux gibt. Wenn ich voraussetze das auf dem Zielsystem keine Installation erfolgen soll bleibt eigentlich nur HTML, jedoch stellte ich vor einiger Zeit fest das es den Macromedia Flash-Player (Standalone, nicht PlugIn) auch für Linux gibt und das man damit wunderbar *.swf in *.exe kompillieren kann. Dadurch kann man ganz problemlos Präsentationen erstellen, jedoch muß vor dem Start der *.exe der Pfad eingestellt werden um später aus der Präsentation herraus Dateien aufrufen zu können.
Wie ich nun feststellen konnte wird unter Linux jede ausführbare Datei (im Sinne Programm, Script o.ä.) im Homeverzeichnis des angemeldeten Benutzers ausgeführt (bei einer z.B. HTML-Datei ist das nicht so, da ist der Pfad gleich dem Verzeichnis aus welchem heraus ich die *.html starte), z.B. CD einlegen > mounten > Script oder Programm durch Klicken im Fenster des Dateimanagers starten > Pfad zur Laufzeit entspricht nun dem Homeverzeichnis (egal wo sich die gestartete Datei befindet).


Gruß
Stephan

P.S. Enschuldige die lange Darstellung, aber vielleicht kannst Du mir weiterhelfen?

jj

Re: absoluten Pfad einer Datei auf CD bestimmen

#4 Post by jj »

Hallo Stephan,

die Informationen, welches Device wo eingehaengt wird, stehen in jedem System in der Datei /etc/fstab. Diese Datei musst Du also auslesen. Wichtig ist nur, dass Du Dir ein Verzeichnis aussuchst, das nicht schon belegt ist.
Also sollte Dein Skript in der /etc/fstab der Reihe nach nach /mnt/cdrom, /cdrom, /mnt/dvd, usw. suchen und beim ersten Treffer Deine CD dort hinmounten.
Ausserdem musst Du wohl darauf achten, dass Deine CD mit der Option -exec gemountet wird, weil andernfalls keine Programme von der CD ausgefuehrt werden koennen.

gruss
jonni

Carsten

Re: absoluten Pfad einer Datei auf CD bestimmen

#5 Post by Carsten »

Jetzt hab auch ichs verstanden ;)
Nun der ansatz mit fstab ist nicht schlecht. Du müsstest dir mal den Quellcode von Gnome/Nautilus anschauen, der öffnet automatisch bei einlegen der CD ein Fenster. Zum fstab-parsing. Es kann sein, dass jemand 2 CD-Laufwerke hat. Wenn man aber nun annimmt, jemand hätte die CD schon gemountet, könnte man mit "mount" alles rausbekommen. Das zeigt alle gemounteten devices an. Die ausgabe hat etwa diese Syntax:
device "on" mountpoint "type" typ "("Rechte")"
Wobei alles was in Anführungszeichen steht, immer gleich bleibt. Nun könnte man nach typ parsen: die CD sollte iso9660 haben :)
mount | grep iso9660... Hilft dir das? Kann vielleicht auchn C++ Programm schreiben, wenn du willst. Sollte sich aber mit nem Script lösen lassen.

CU Carsten

Stephan

Re: absoluten Pfad einer Datei auf CD bestimmen

#6 Post by Stephan »

Hallo jonni,

ich bin unter Linux wirklich Anfänger, ich verstehe jedoch vom Grundsatz her was Du bezüglich der fstab und dem
mounten schreibst. Ich habe gerade mal nachgelesen was zum Befehl mount im Linux-Buch von Kofler steht (Kofler;
"Linux - Installation,Konfiguration,Anwendung") steht. Andererseits gehe ich jedoch praktisch davon aus das der
Benutzer meiner CD sie dadurch mountet das er das CD-Symbol auf dem Deskop anklickt (ich meine das Symbol,
welches CD mounted in in Konqueror den Inhalt anzeigt, bei meiner SUSE 8.1 ist der Typ mit "DVD-Rom mounten und
öffnen" angegeben).
Frage:
Wenn es mir nun gelänge ein Script zu schreiben, welches die CD mountet, wie von Dir beschrieben, kann ich denn
dann davon das dieses, unabhängig von den Rechten des aktuellen Benutzers, läuft?
Ich sehe das Problem das das Script auf CD liegt und nicht ausgeführt werden kann bevor die CD gemountet ist.

>Ausserdem musst Du wohl darauf achten, dass Deine CD mit der Option -exec gemountet wird, weil andernfalls
keine Programme von der CD ausgefuehrt werden koennen.

Wenn also das Symbol auf dem Desktop, welches ich zum mounten der CD anklicke die -exec Option nicht
beinhaltet, würde es also garnicht möglich sein ein Programm von CD auszuführen?


Gruß
Stephan

carsten
Posts: 25
Joined: 18. Oct 2003 15:22

Re: absoluten Pfad einer Datei auf CD bestimmen

#7 Post by carsten »

Nun, da das CD-LW in der fstab drinnen ist, kannst du es ganz einfach mit "mount mountpunkt" mounten. Es sollten in der fstab die richtigen Rechte drinnen stehen...

CU Carsten

Stephan

Re: absoluten Pfad einer Datei auf CD bestimmen

#8 Post by Stephan »

Hallo Carsten,

Danke für Deine Antwort, aber: Sorry - ich bin wirklich Linux-Anfänger.

>Du müsstest dir mal den Quellcode von Gnome/Nautilus anschauen

ich nehme an ich müßte dazu die Datei in einem Editor öffnen, aber selbst wenn ich wüßte welche Datei, würde mir der Quellcode nichts sagen <img src="http://www.pl-forum.de/UltraBoard/Images/Sad.gif" border="0" align="middle">

>der öffnet automatisch bei einlegen der CD ein Fenster

verstehe ich nicht wie Du das meinst, Ich muß nach Einlegen der CD ein Desktopsymbol anklicken, damit die CD gemountet und der Inhalt im Konqueror angezeigt wird

>Wenn man aber nun annimmt, jemand hätte die CD schon gemountet, könnte man mit "mount" alles rausbekommen

ja, das verstehe ich jetzt:

[root@localhost cdrom]# mount
/dev/hdb4 on / type ext3 (rw)
none on /proc type proc (rw)
usbdevfs on /proc/bus/usb type usbdevfs (rw)
/dev/hdb1 on /boot type ext2 (rw)
none on /dev/pts type devpts (rw,gid=5,mode=620)
none on /dev/shm type tmpfs (rw)
/dev/cdrom on /mnt/cdrom type iso9660 (ro,nosuid,nodev)

oder

>Nun könnte man nach typ parsen: die CD sollte iso9660 haben :) mount | grep iso9660...

[root@localhost cdrom]# mount | grep iso9660
/dev/cdrom on /mnt/cdrom type iso9660 (ro,nosuid,nodev)

die jeweils letzte Zeile ist ja wohl die Information die ich benötige. Ich muß nun nur noch die relevante Information extrahieren so das ich sie für den cd Befehl weiterverwenden kann...

Kannst Du mir verraten wie ich das mittels Script möglichst einfache mache? Oder kannst Du mir verraten ob ich definitiv darauf vertrauen kann das auf jedem Linux-System die Zeile exakt lautet:

...on<ein Leerzeichen><der absolute Pfad zum Wurzelverzeichnis der CD><ein Leerzeichen>type<ein Leerzeichen>iso9660...

damit ich mir überlegen kann wie ich die Zeichenkette (/dev/cdrom on /mnt/cdrom type iso9660 (ro,nosuid,nodev)) zerlege.



Vielen Dank, Du hast mir schon jetzt entscheident weitergeholfen.

Gruß
Stephan

P.S.
Dein letztes Posting kam schneller als ich das vorletzte durchdenken und beantworten konnte:

>Nun, da das CD-LW in der fstab drinnen ist, kannst du es ganz einfach mit "mount mountpunkt" mounten

das verstehe ich nun wieder nicht so richtig.
Es ist doch so das der Benutzer meiner CD diese _erst_ einmal mounten muß _bevor_ er irgendetwas davon lesen bzw. ein Script ausführen kann ? Oder ist es etwa möglich von einer gemounteten CD ein Script auszuführen, welches diese Cd auf einen anderen Mountpunkt "ummountet"?

Stephan

carsten
Posts: 25
Joined: 18. Oct 2003 15:22

Re: absoluten Pfad einer Datei auf CD bestimmen

#9 Post by carsten »

Hi,
ja, das mit dem Quellcode war nicht wirklich ernst gemeint... Bis du da die richtige Stelle gefunden hast, dauerts ewig...

Nun, ich denke, ich habe dich falsch verstanden... Ich habs so verstanden: Der User hat irgendwo ein Script liegen, das einfach da ist. Er legt nun die CD ein und ruft sein Script auf. Oder ist dieses Script auf der CD? Dann wäre es ja kein Problem -> pwd sagt den ganzen Pfad.
Bitte klär mich mal auf.

Zu mount: ja die Ausgabe sollte immer gleich sein. Vielleicht ists in 3 Jahren mal anders, das kann man nie wissen... Solange du die CD immer gleich brennst und kein anderes Dateisystem benutzt bleibt iso9660 auch immer gleich.
Ich denke, das parsen der Zeile sollte auch mit Standart-Programmen geben. (grep?!?)

Aber sag mir erstmal wo das Script jetzt liegen soll?

CU Carsten

P.S. Auf einen anderen Mountpunkt ummounten? Klar sollte das gehen! benutze $HOME (das homeverzeichnis) Erstelle ein Verzeichnis mkdir $HOME/deineCD, wo du sie dann hinmounten kannst... Aber sag mir erstmal wo dieses verdammte Script liegen soll...
Last edited by carsten on 18. Oct 2003 18:43, edited 1 time in total.

Stephan

Re: absoluten Pfad einer Datei auf CD bestimmen

#10 Post by Stephan »

Hallo Carsten,

Tschuldigung, bin etwas langsam.
Das Script soll sich im Wurzelverzeichnis der CD befinden.

also ich versuche es mal zu erklären:

ich habe eine Präsentation in Form einer *.exe, ich meine damit das es sich um eine Datei des Typs Programm handelt (*.exe stammt ja aus der Windows-Welt), diese Datei funktioniert nur dann richtig wenn vor dem Starten zuerst der Pfad auf das Verzeichnis gesetzt wird in welchem sich die Datei befindet. Ich kann das unter Linux mittels einer Konsole per Hand machen und dann mit ./<Programm> mein Programm starten. Funktioniert einwandfrei.

Nun will ich eine CD erstellen in deren Wurzelverzeichnis sich ein Script befindet, welches den Pfad einstellt und dann mein Programm startet.

>Aber sag mir erstmal wo das Script jetzt liegen soll?

Also, das Script ist _im Wurzelverzeichnis der CD_. Falls mein Script "Start" heißt und das CD-Rom z.B. unter /media/cdrom gemountet wird ist der vollständige Pfad (Pfad + Dateiname): /media/cdrom/Start . Das Programm welches von dem Script gestartet werden soll befindet sich ebenfalls auf der CD, wobei ich den Pfad so wählen kann wie ich will, da ich die CD selbst erstelle.

Das Problem:
diese CD will ich nun weitergeben an jemanden der meine Präsentation ansehen soll. Im Prinzip weiß ich nur das diese Person auf dem Rechner Linux installiert hat (ich kenne nicht den Mountpunkt des CD-LW und kenne z.B. auch nicht die Rechte der aktuellen Benutzeranmeldung auf diesem System).
Diese Person soll nun einfach unter Linux meine CD einlegen, das Laufwerk mounten und den Inhalt der CD anzeigen lassen. Im Wurzelverzeichnis der CD wäre nun das Script Namens "Start", dieses müßte angeklickt werden um die Präsentation zu starten.


>Oder ist dieses Script auf der CD? Dann wäre es ja kein Problem -> pwd sagt den ganzen Pfad

Genau eben nicht!? Ich habe jetzt gerade eine CD erstellt welche nur das eine Script enthält (32 Byte auf 700MB CD <img src="http://www.pl-forum.de/UltraBoard/Images/Happy.gif" border="0" align="middle">) :

#!/bin/bash
pwd > Ergebnis.txt

Lege ich diese CD ein und mounte und klicke das Script an (starte es) liefert es folgendes Ergebnis:

(a)wenn ich als /root angemeldet bin wird die Datei /root/Ergebnis.txt mit dem Inhalt: "/root" (ohne Anführungsstriche) erzeugt.
(b)wenn ich als Benutzer abc angemeldet bin (Homeverzeichnis /home/abc)wird die Datei /home/abc/Ergebnis.txt mit dem Inhalt: "/home/abc" (ohne Anführungsstriche) erzeugt.

Sowohl bei (a) und (b) befindet sich das Script (wenn die CD gemountet ist) in /media/dvd/Start ,(was jedoch nur bei mir so ist, da der Mountpunkt auf einem anderen Linux-Rechner anderes liegen kann).



Gruß Stephan

Stephan

Re: absoluten Pfad einer Datei auf CD bestimmen

#11 Post by Stephan »

Ich habe jetzt folgendes Skript geschrieben:

#!/bin/sh
gesamt=$(mount | grep iso9660)
links=${gesamt#*on}
pfad=${links%type*}
cd $pfad
./test2

dieses Skript und das Programm mit Namen "test2" befinden sich im Wurzelverzeichnis einer CD, alles funktioniert wie gewünscht.

Aber:
Kann mir jemand sagen was der Ausdruck:

mount | grep iso9660

liefert (allgemein), wenn zur Zeit der Ausführung des Skripts 2 CD-Rom gemountet sind?

(Kann ich nicht ausprobieren, weil ich nur 1 CD-Rom habe)


Gruß
Stephan

carsten
Posts: 25
Joined: 18. Oct 2003 15:22

Re: absoluten Pfad einer Datei auf CD bestimmen

#12 Post by carsten »

Ganz einfach: er liefert zwei Zeilen.
Dann solltest du zuerst beide überprüfen, ob sich Datei xy auf der CD befindet...
Cool, dass du das geschafft hast. Kann ich vielleicht auch mal gebrauchen... Kannst du mir vielleicht mal erklären was die Zeilen machen? Verstehen tu ich schon, aber was bedeutet dieses $? Kenn ich nur von PHP als Variable. Und wann man ( und wann { benutzt ;)

CU Carsten
Last edited by carsten on 19. Oct 2003 13:10, edited 1 time in total.

Stephan

Re: absoluten Pfad einer Datei auf CD bestimmen

#13 Post by Stephan »

Da ich sehr lange gebraucht habe dieses Skript zu erstellen (ist wohl das erste sinnvolle Skript was ich unter Linux geschrieben habe) kann ich es nun aber auch gut erklären (hoffe ich <img src="http://www.pl-forum.de/UltraBoard/Images/Wilk.gif" border="0" align="middle"> ):

gesamt=$(mount | grep iso9660)

wenn man einer Variablen (gesamt) einen Wert zuweist welcher welcher der Ausgabe eines Kommandos (mount | grep iso9660) entspricht muß dieser Wert mit $ angesprochen werden. Allgemein: <Variable>=$(<Kommando>)

links=${gesamt#*on}

der Variablen (links) wird der Wert zugewiesen welcher dem Teil der Gesamtzeichenkette (entspricht Variable gesamt) enspricht der hinter den erstmaligen (!) auftauchen des Suchausdrucks (on) folgt
Beispiel:
dat=/home/mk/buch/buch.tar.gz
echo ${dat#*/} ---> liefert: home/mk/buch/buch.tar.gz
echo ${dat#*.} ---> liefert: tar.gz

pfad=${links%type*}

der Variablen (pfad) wird der Wert zugewiesen welcher dem Teil der Gesamtzeichenkette (entspricht Variable links) enspricht der vor dem letztmaligen (!) auftauchen des Suchausdrucks (type) folgt
Beispiel:
dat=/home/mk/buch/buch.tar.gz
echo ${dat%/*} ---> liefert: /home/mk/buch
echo ${dat%.*} ---> liefert: /home/mk/buch/buch.tar

cd $pfad

zum ermittelten Pfad wechseln, ob der Gebrauch von $<Variable> immer nötig ist weiß ich nicht, aber bei z.B. echo $<Variable> ist es genauso

./test2
mein Programm (test2) starten, ./ ist das aktuelle Verzeichnis


Warum man "{" oder "}" benutzen muß weiß ich nicht, die Überschrift des Kapitels in meinem Linux-Buch woher ich das habe heißt: "Parametersubstitution"

Gruß
Stephan

carsten
Posts: 25
Joined: 18. Oct 2003 15:22

Re: absoluten Pfad einer Datei auf CD bestimmen

#14 Post by carsten »

Aja, danke.
Du musst also jetzt noch das mit mehreren Zeilen implementieren. Vielleicht gibts dafür was, aber normalerweise dürfte ein Zeilenumbruch
sein.

1. Arrays benutzen!
2. Zum überprüfen: "ls" parsen!

CU Carsten

jj

Re: absoluten Pfad einer Datei auf CD bestimmen

#15 Post by jj »

Hallo Stephan,

Das richtige CDROM-LW sollte Dein Skript durch Versuch und Irrtum herausfinden koennen. Mir fehlt gerade die Zeit, das zusammenzuflicken, also hier nur die Beschreibung:

Das Skript muss nach
...
cd $pfad
den aktuellen Verzeichnisnamen mit dem (vorgegebenen) CD-Verzeichnisnamen vergleichen.
Bei Uebereinstimung kann es losgehen mit ./<praesentation>.
Bei Nicht-Uebereinstimmung bist Du auf der falschen CD zugange. Dann muss der Vergleich zwischen aktuellem Verzeichnisnamen und dem CD-Verzeichnisnamen auf dem naechsten CD-LW wiederholt werden.

> Wenn also das Symbol auf dem Desktop, welches ich zum mounten der CD anklicke die -exec Option nicht
> beinhaltet, würde es also garnicht möglich sein ein Programm von CD auszuführen?
M.E. waere es tatsaechlich unmoeglich. Dazu
man mount

> ob der Gebrauch von $<Variable> immer nötig ist weiß ich nicht, aber bei z.B. echo $<Variable> ist es genauso
Mit $Variable greifst Du auf den Wert der Variablen zurueck, ohne $ geht das nicht.

> Warum man "{" oder "}" benutzen muß weiß ich nicht
Versuch es in Deinem Beispiel mal ohne die Klammern, dann bekommst Du

$ dat=/home/mk/buch/buch.tar.gz
$ echo $dat#*/
/home/mk/buch/buch.tar.gz#*/
[$ echo $dat#*.
/home/mk/buch/buch.tar.gz#*.

weil erst die Variable $dat aufgeloest wird und echo dann #*/ bzw. #*. einfach dranhaengt. Das verhinderst Du mit den Klammern.


Aber hier noch ein paar Fragen, die Du nach Fertigstellung des Skripts beantworten kannst <img src="http://www.pl-forum.de/UltraBoard/Images/Happy.gif" border="0" align="middle">
- Woher weisst Du, dass auf dem unbekannten System KDE laeuft mit einem CDROM-Icon? Ich habe sowas nicht (benutze IceWM).
- Wieso eigentlich muss der absolute Pfad des CD-Verzeichnisses ermittelt werden?

gruss
jj

Post Reply