[linux-l] Logik von "Syntax-Fehler" in Bash

Michael Gisbers m.gisbers at linux-schmie.de
Fr Dez 27 16:09:30 CET 2013


On Fri, 27 Dec 2013 15:32:44 +0100
Hasko Bern <pascal.hasko.bernhard at googlemail.com> wrote:

> Also beide folgenden Ansätze funktionieren:

Hallo Hasko, 

> $ sudo bash -c 'for i in 1 2 3 4 5; do hdparm -tT /dev/sda; done'

Ja.

> Ebenso:
> 
> $ for i in 1 2 3 4 5; do sudo hdparm -tT /dev/sda; done

Ja.
 
> Sprich:
> 
> - Der Befehl hdparm ist im Suchpfad eines "normalen" Benutzers

Wenn sich das Kommando wirklich im Suchpfad des Benutzers befindet.

Ansonsten müsste man den Pfad angeben oder über den Parameter '-i' des sudo - Befehls diesen auffordern eine Login-Shell zu nutzen um darin dann das gewünschte Programm zu starten. Die Login-Shell hat dann die komplette Umgebung des Benutzers root inkl. der Suchpfade geladen.

> - Anscheinend kann sudo mit Zeilenumbrüchen à la ';' umgehen, sonst
> dürfte der zweite Ansatz nicht funktionieren.

Der 2. Ansatz hat im sudo keinen Zeilen-Umbruch. Wenn Du die Zeile auflöst und daraus statt des Einzeilers ein Script machst kommt folgendes dabei heraus:

for i in 1 2 3 4 5
do 
sudo hdparm -tT /dev/sda
done

Im sudo selber ist *kein* Zeilenumbruch enthalten.

> Hauke hat neben einer Erklärung, wieso meine Herangehensweise nicht
> erfolgreich war, AUCH eine Lösung geliefert - wollte ich nur anmerken.
> 
> 
> Allerdings weiß ich immer noch nicht, wie man ganz konkret
> Zeilenumbrüche in der Shell umsetzt:
> 
> also
> for i in 1 2 3 4 5
> do sudo hdparm -tT /dev/sda
> done
> 
> Dies geht bei mir weder in der TTY-Konsole, noch in KDEs Konsole,
> oder im MATE-Terminal
> 
> Welche "Tastenkombination" ist denn hierfür notwendig? CTRL+Enter geht
> nicht wie etwa bei einem Chat-Client.

Das war von mir nur der Umbau um zu zeigen was die Bash intern aus dem Einzeiler macht und warum das dann den Fehler liefert. Das lässt sich so direkt nicht im sudo nutzen.

> Wie nicht allzu schwer zu erkennen, stehe ich hier wie der Ochs vor
> dem Berge.

Der sudo startet immer *ein* Programm und übergibt dem Programm dann den Rest als Übergabeparameter. Also ist die Vorgehensweise mit

$ sudo bash -c 'for i in 1 2 3 4 5; do hdparm -tT /dev/sda; done'

die Lösung.

Es wird per sudo das Programm 'bash' gestartet und über '-c' mitgeteilt, dass in der Folge Daten folgen, die von der Bash abgearbeitet werden sollen. Durch die ' um den Code wird sichergestellt, dass nichts innerhalb dieses Textes vorab interpretiert und durch die aufrufende Shell verändert werden soll.

Ich würde diese Lösung auch einer Schleife mit mehrfachen 'sudo' - Aufrufen vorziehen. Zumindest bei meinen Installationen muss sich der Benutzer bei einem sudo regelmäßig neu autorisieren (das ist so gewünscht ;-) ) und bei zu lang laufenden Prozessen innerhalb der Schleife könnte es dann zu dem unschönen Fall kommen, dass man sich ständig neu autorisieren müsste.

-- 
 Mit freundlichem Gruß,

 Linux-Schmie.de

 Michael Gisbers

 Neukölner Str. 94
 46147 Oberhausen
 Telefon: +49 208 628 950
 Telefax: +49 208 628 951
 Mobil: +49 173 510 68 22
 http://linux-schmie.de
 USt-IdNr. DE 189 020 052
-------------- nächster Teil --------------
Ein Dateianhang mit Binärdaten wurde abgetrennt...
Dateiname   : signature.asc
Dateityp    : application/pgp-signature
Dateigröße  : 198 bytes
Beschreibung: nicht verfügbar
URL         : <https://mlists.in-berlin.de/pipermail/linux-l-mlists.in-berlin.de/attachments/20131227/6e58edfb/attachment.sig>


Mehr Informationen über die Mailingliste linux-l