Leica über USB mounten - script mit user als root

Hinweis: In dem Thema Leica über USB mounten - script mit user als root gibt es 11 Antworten auf 2 Seiten. Der letzte Beitrag () befindet sich auf der letzten Seite.
  • Hallo,


    ich möchte einen Leica Höhenmesser, auf dem Screenshots sind, mounten um die Screenshots auszulesen.


    Bisher habe ich das Script immer als root laufen lassen.
    Ich möchte es gerne als user starten, im Script zu root wechseln, dafür das Kennwort eingeben.
    Dann soll das Script wieder als user den Konqueror öffnen und sich beenden, dabei den Konqueror offen lassen.


    Ich habe jetzt zig Varianten von su, sudo, Eintrag in /etc/sudoers.d/user durchprobiert. Und die manpage macht mich leider auch nicht schlau.
    Es funktioniert zwar oft, aber ist eine elende Abfolge von Fehlermeldungen, Passworteingabe, Konqueror öffnet erst nach zwei mal exit im Terminal usw.
    Das sollte doch sauber hin zu kriegen sein?


    Das folgende Script funktioniert wenn ich es als root aufrufe. Allerdings mit etwas Chaos, s.o.
    Die auskommentierten Zeilen stammen noch von meinen diversen Versuchen.


    Kann mir jemand beim Vorgehen und der Syntax helfen? Vielleicht verstehe ich das dann auch besser...

    Dell Latitude 7470, 4 x i7 6600U, 32 GB, 1TB NVMe

    Tumbleweed, KDE Plasma

    Für den Inhalt des Beitrages 138622 haftet ausdrücklich der jeweilige Autor: baumkraxler

  • Hallo,


    ich denke dein Hauptmissverständnis liegt beim su-Befehl. Wenn du den innerhalb eines Skriptes aufrufst, dann startet dieser eine getrennte Shell, die von deinem Skript gar nichts mehr weiß. Die Lösung liegt im -c Parameter von su, wo du ein Kommando oder eine Kommandofolge mitgeben kannst, die dann als root ausgeführt werden soll. Also sowas wie

    Code
    su - -c "mount -r $geraet /mnt/leica"

    Das führt den Mount-Befehl als root aus und macht dann im Skript ganz normal wieder als User weiter.

  • Danke. Das hilft mir erst mal im Verständnis weiter, was da so passiert ist mit den Ausgaben und Reihenfolgen.


    Ausprobieren kann ich es erst nachher mal.


    Ohne -c, da wartet das aufrufende Script dann bis die neu aufgerufene root-Shell fertig ist und zurück kommt, oder?

    Dell Latitude 7470, 4 x i7 6600U, 32 GB, 1TB NVMe

    Tumbleweed, KDE Plasma

    Für den Inhalt des Beitrages 138645 haftet ausdrücklich der jeweilige Autor: baumkraxler

  • Es kommt:

    Code
    frank@7470tw:~> lei.sh
    bash: /home/frank/bin/scripte/lei.sh: Keine Berechtigung
    frank@7470tw:~>

    Eigentümer des Scripts ist frank:users.
    Ich bräuchte die Möglichkeit, das Passwort einzugeben?

    Dell Latitude 7470, 4 x i7 6600U, 32 GB, 1TB NVMe

    Tumbleweed, KDE Plasma

    Für den Inhalt des Beitrages 138654 haftet ausdrücklich der jeweilige Autor: baumkraxler

  • Es kommt:

    Code
    frank@7470tw:~> lei.sh
    bash: /home/frank/bin/scripte/lei.sh: Keine Berechtigung
    frank@7470tw:~>

    Eigentümer des Scripts ist frank:users.
    Ich bräuchte die Möglichkeit, das Passwort einzugeben?

    Und wie sind die Flags gesetzt? Ist das x-Bit gesetzt? Sonst erst mal

    Code
    chmod a+x /home/frank/bin/scripte/lei.sh

    Und zeig uns mal ein ls -l /home/frank/bin/scripte/lei.sh

  • Code
    frank@7470tw:~/bin/scripte> ls -l lei.sh
    -rwxr-xr-x 1 frank users 315 21. Jan 05:39 lei.sh

    Das Script war schon ausführbar.


    Das Script sieht jetzt so aus:

    Die echos hab ich rein, damit man in der Ausgabe sieht wo das Schript grad steht.
    Das Ergebnis ist, auf der Konsole:

    - Datei nicht gefunden: Script ist mit Kate geschrieben, die erste Zeile habe ich nochmal mit vi ausgetauscht. "bash" ist in "/bin" vorhanden. Trotzdem Codierung? Kate sollte doch funktionieren?
    - Script startet ja trotzdem.
    - fdisk scheint nicht zu funktionieren. Die Passwortabfrage kommt erst nach der Fehlerausgabe.
    Dememtsprechend bleibt /mnt/leica auch leer.

    Dell Latitude 7470, 4 x i7 6600U, 32 GB, 1TB NVMe

    Tumbleweed, KDE Plasma

    Für den Inhalt des Beitrages 138708 haftet ausdrücklich der jeweilige Autor: baumkraxler

  • Hallo,


    Zum Zeile-1-Fehler: Hat die Datei womöglich Windows Zeilenenden, also CRLF statt nur LF? Das führt zu genau diesem Fehler! Abhilfe: Umwandeln mit dos2unix lei.sh. Prüfe sonst auch auf andere Sonderzeichen oder überflüssige Leerzeichen am Zeilenende.


    Zum Rest des Skriptes: Das Problem ist noch deine erste su-Zeile mit fdisk. Die Variable geraetlang würde so innerhalb der root-Shell gesetzt und ist dann außerhalb nicht mehr verfügbar. Deine beiden su-Kommandos führen außerdem dazu, dass du das Passwort zweimal eingeben musst. Außerdem hast du ein Problem mit den Anführungszeichen. Meine Version wäre:

    Bash
    #!/bin/bash
    # Leica mounten
    su - -c 'mount -r $(fdisk -l | grep Novell | cut -d " " -f 1) /mnt/leica'
    konqueror /mnt/leica &

    Also alles, was root braucht, in einer einzigen Zeile machen. cut bevorzuge ich da auch vor dem Substring, weil es bei beliebigen Stringlängen funktionieren würde.


    Zur Erklärung: ein weiteres Problem bei dir waren die Anführungszeichen. Bei "" werden Variablen und $-Ausdrücke im String zuerst ersetzt, bevor der String an das umgebende Kommando weitergereicht wird. Damit wurde als fdisk noch als User aufgerufen. Erst das Ergebnis davon würde an su weitergegeben werden.


    '' (also die einfachen Anführungszeichen) jedoch macht das nicht. Der Inhalt wird direkt übergeben. Damit wird fdisk nun erst von su ausgeführt und damit im root-Modus.

  • Was diese Zeile
    su - -c "geraetlang=$(fdisk -l | grep Novell)"
    wirklich tut:


    Die Shell parst diese Zeile in ihren fünf typischen Schritten.
    Einer davon ist das Expandieren der $- Ausdrücke. Also das Ersetzen der Variablennamen mit dem Wert, der in der Variable steht.
    In deinem Fall handelt es sich um eine Prozessexpansion.
    Die Pipe fdisk -l | grep Novell wird in einer Subshell ausgeführt und die Ausgabe der Pipe wird anstelle des $() Konstruktes in die Kommandozeile eingesetzt.
    Danach wird su aufgerufen. was eine neue Shell startet, die ihrerseits ein Kommando ausführt, wobei nur eine Variable gesetzt wird ( Die Pipe selbst ist ja schon ausgeführt worden).
    Nach dieser Zeile ist diese Variable wieder weg, da ja auch die neue Shell, die der su- Befehl selbst startet, wieder endet nach dem Befehl (dem schlichten Setzen einer Variablen).
    Und die Ausführungsreihenfolge erklärt, warum dir die Meldungen zeitlich verkehrt herum erscheinen.


    Es ist prinzipiell nicht möglich in einer Subshell die Parentshell zu beeinflussen. Insbesondere kann man damit keine Variablen setzen, die dann - Magie, Magie - in der rufenden Shell erreichbar wären.
    Das wäre ein ganz grober Designfehler.


    Du möchtest evtl. gar nicht mit su arbeiten.
    fusermount ist dein Freund.
    Und damit der arme Konqueror nicht gleich wieder gekillt wird, möchtest du help disown und man nohup lesen.

  • Super, ich Danke euch sehr für die ausführliche Erklärung.
    Das hilft mir sehr weiter. Ich lese mich schon auch kreuz und quer, aber für mich Anfänger ist Vieles erst mal nicht klar einzuordnen.
    An dem konkreten Beispiel und mit eurer Erklärung wirds mir deutlich, so kann ich lernen.


    Ich muss ab und an auch was arbeiten, deshalb kann ich das jetzt nicht gleich ausprobieren, das hat nämlich bei mir Suchteffekt...
    ... wollte aber erst mal Danke sagen und werde sicher berichten.

    Dell Latitude 7470, 4 x i7 6600U, 32 GB, 1TB NVMe

    Tumbleweed, KDE Plasma

    Für den Inhalt des Beitrages 138745 haftet ausdrücklich der jeweilige Autor: baumkraxler

  • wonderful, es geht.


    dos2unix lei.sh. hat schon mal gut getan.


    Nach etwas probieren... ... erst das "#" vor "Leica" vergessen, da hat er gemotzt...


    ...aber noch weiter gemotzt (das Script habe ich umbenannt, es steht exakt Dein Code drin),

    Code
    frank@7470tw:~> leica
    Passwort: 
    mount: /mnt/leica: special device /dev/sdc2 does not exist.
    frank@7470tw:~>

    habe ich verschiedene Einzelschritte in der Konsole, als user und als root, probiert. Des Rätsels Lösung:

    Code
    7470tw:~ # mount -r /dev/sdc2 /mnt/leica
    mount: /mnt/leica: special device /dev/sdc2 does not exist.

    aber:

    Code
    7470tw:~ # mount -r /dev/sdc /mnt/leica
    7470tw:~ #

    Nachdem ich Deinen cut - Befehl nicht angemessen modifizieren konnte habe ich mal

    Code
    su - -c 'mount -r $(fdisk -l | grep Novell | cut -c 1-8) /mnt/leica'

    probiert, und das geht bestens.
    Im sich öffnenden Konqueror muss ich erst noch mal 'neu laden' klicken. damit etwas angezeigt wird, aber mei...
    Eine Frage noch zu meinem Verständnis: Wenn ich das Script von der Schnellstartleiste (Kicker?), also vom Desktop mit ALT-Space -> sh leica.sh -> ENTER aufrufe, passiert gar nichts. Auch im Systemmonitor kein Zucken. Andere Scripte im gleichen Verzeichnis kann ich wohl von dort aufrufen.


    Also vielen Dank nochmal, für die Hilfe bei der Lösung meines (diesmal nicht so dringenden) Problems, vor allem aber die Erklärung! :thumbup:

    Dell Latitude 7470, 4 x i7 6600U, 32 GB, 1TB NVMe

    Tumbleweed, KDE Plasma

    Für den Inhalt des Beitrages 138876 haftet ausdrücklich der jeweilige Autor: baumkraxler