[gelöst] "..." in "..." verschachteln/escapen (sh/bash)

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Benutzeravatar
smutbert
Moderator
Beiträge: 8331
Registriert: 24.07.2011 13:27:39
Wohnort: Graz

[gelöst] "..." in "..." verschachteln/escapen (sh/bash)

Beitrag von smutbert » 19.02.2016 22:57:25

Hallo,

gerade stehe ich vor einem unerwarteten Problem bei einem Skript. Als praktische Alternative zu man, habe ich ein Skript (siehe viewtopic.php?f=34&t=148025) bei dem im Endeffekt

Code: Alles auswählen

yelp "man:$1" &> /dev/null &
ausgeführt wird, was auch wunderbar funktioniert. Jetzt will ich das ganze aber noch in ein su packen und dann funktioniert es nicht mehr und ich weiß noch nicht einmal warum genau es nicht funktioniert — zuletzt habe ich es mit

Code: Alles auswählen

su ${USERNAME} -c "yelp \"man:$1\" &> /dev/null" &
versucht…
Zuletzt geändert von smutbert am 20.02.2016 15:32:41, insgesamt 1-mal geändert.

Benutzeravatar
heisenberg
Beiträge: 3556
Registriert: 04.06.2015 01:17:27
Lizenz eigener Beiträge: MIT Lizenz

Re: "..." in "..." verschachteln/escapen (sh/bash)

Beitrag von heisenberg » 20.02.2016 03:35:14

Möglichkeiten
  • Pack' das su-Kommando in eine Datei.
  • Verwende beide Quoting-Zeichen: su ${USERNAME} -c "yelp 'man:$1' &> /dev/null" &
Ansonsten wundere ich mich, ob es wirklich einen Namen einer Man-/Infopage gibt, der Quoting benötigt?
Jede Rohheit hat ihren Ursprung in einer Schwäche.

Benutzeravatar
smutbert
Moderator
Beiträge: 8331
Registriert: 24.07.2011 13:27:39
Wohnort: Graz

Re: "..." in "..." verschachteln/escapen (sh/bash)

Beitrag von smutbert » 20.02.2016 07:52:22

Namen gibts wohl keinen, aber $1 kann zB den Wert cp(1) haben. Wie ich mit ' weiterkomme muss ich noch überlegen - eigentlich will ich es jedenfalls vermeiden das Kommando in eine eigene Datei zu packen.

uname
Beiträge: 12075
Registriert: 03.06.2008 09:33:02

Re: "..." in "..." verschachteln/escapen (sh/bash)

Beitrag von uname » 20.02.2016 09:29:15

Bei mir funktioniert

Code: Alles auswählen

#!/bin/bash
USERNAME="username"
su ${USERNAME} -c "yelp \"man:$1\" &> /dev/null" 
Aufruf:

Code: Alles auswählen

./test.sh test
Das Manuael zu test (man test) wird mit Yelp aufgerufen.

Statt ${USERNAME} sollte auch $USERNAME gehen. Aber das scheint hier nicht das Problem.

Wenn es immer noch nicht geht trag mal

Code: Alles auswählen

...man:test...
ein um zu schauen ob es vielleicht gar nicht an Yelp, sondern an su liegt. Bei mir funktioniert der Aufruf auch beim Benutzerwechsel z.B. von root auf einen normalen Benutzer aber auch umgekehrt. Ich nutze aber auch Openbox. Könnte sein, dass moderne Desktop-Environments diese Möglichkeiten aus Sicherheitsgründen nicht erlauben. Was sagt z.B.

Code: Alles auswählen

su username -c xterm
su username -c iceweasel
...

Benutzeravatar
4A4B
Beiträge: 926
Registriert: 09.11.2011 11:19:55
Kontaktdaten:

Re: "..." in "..." verschachteln/escapen (sh/bash)

Beitrag von 4A4B » 20.02.2016 09:54:46

$1 muss ja gleich zu Anfang von der Shell expandiert werden, also würde ich den Parameter von -c aus drei Teilen zusammensetzen, die allesamt gequotet werden:

Code: Alles auswählen

su ${USERNAME} -c "yelp \"man:""$1""\" &> /dev/null" &
Ist aber ungetestet, da ich kein yelp installiert habe :)

Benutzeravatar
Meillo
Moderator
Beiträge: 8817
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: "..." in "..." verschachteln/escapen (sh/bash)

Beitrag von Meillo » 20.02.2016 10:49:35

Beim Debuggen solcher Probleme hilft meist `set -x' weiter.
Use ed once in a while!

Benutzeravatar
smutbert
Moderator
Beiträge: 8331
Registriert: 24.07.2011 13:27:39
Wohnort: Graz

Re: "..." in "..." verschachteln/escapen (sh/bash)

Beitrag von smutbert » 20.02.2016 14:00:00

Das ist merkwürdig. Das hier funktioniert natürlich

Code: Alles auswählen

$ yelp "man:cp(1)"
und diese beiden auch (uname hat also recht und mit 4A4Bs Variante ist es genau gleich!)

Code: Alles auswählen

$ ARGS="cp(1)"
$ yelp "man:${ARGS}"
$ su ${USERNAME} -c "yelp \"man:${ARGS}\""
aber in meinem Skript funktioniert es nicht. Testweise habe ich die Zeile durch

Code: Alles auswählen

echo su ${USERNAME} -c "yelp \"man:""${ARGS}""\" &> /dev/null"
ersetzt und erhalte als Ausgabe

Code: Alles auswählen

su smutbert -c yelp "man:cp(1)" &> /dev/null
was mir richtig zu sein scheint, ich erhalte aber nur ein leeres yelp-Fenster :?:
Also habe ich mir noch die Prozessliste angeseehen und auch da sieht der Aufruf eigentlich richtig aus (es wundert mich allerdings, dass es gleich 3 sind und nicht nur 2)

Code: Alles auswählen

$ ps aux | grep yelp
root       4162  0.0  0.0  60656  3620 pts/0    S+   13:54   0:00 su smutbert -c yelp "man:cp(1)" &> /dev/null
smutbert   4163  0.0  0.0  14928  2852 ?        Ss   13:54   0:00 bash -c yelp "man:cp(1)" &> /dev/null
smutbert   4164  5.2  0.2 2358260 72652 ?       Sl   13:54   0:00 yelp man:cp(1)

Benutzeravatar
smutbert
Moderator
Beiträge: 8331
Registriert: 24.07.2011 13:27:39
Wohnort: Graz

Re: "..." in "..." verschachteln/escapen (sh/bash)

Beitrag von smutbert » 20.02.2016 14:08:18

Halli, hallo, danke, ihr habt mich glaube ich auf die Lösung gebracht. Ich melde mich, wenn ich sicher bin :idea:

Benutzeravatar
smutbert
Moderator
Beiträge: 8331
Registriert: 24.07.2011 13:27:39
Wohnort: Graz

Re: [gelöst] "..." in "..." verschachteln/escapen (sh/bash)

Beitrag von smutbert » 20.02.2016 19:46:58

Es war tatsächlich etwas ganz anderes. Das "su $USERNAME -c ..." habe ich als Benutzer root aufgerufen — Sinn der Sache war es ja eine grafische Anwendung, auch wenn es nur yelp ist, nicht als root auszuführen. Was ich nicht bedacht habe, ist dass yelp auf diese Weise uU in einem Verzeichnis aufgerufen wird, das es nicht einmal lesen kann (in diesem Fall »/root«) und das mag es offensichtlich gar nicht.

So funktionierts :facepalm:

Code: Alles auswählen

su ${USERNAME} -c "cd && yelp \"man:$1\" &> /dev/null" &

uname
Beiträge: 12075
Registriert: 03.06.2008 09:33:02

Re: [gelöst] "..." in "..." verschachteln/escapen (sh/bash)

Beitrag von uname » 20.02.2016 22:18:52

Dann solltest du es vielleicht besser gleich so lösen:

Code: Alles auswählen

su - ${USERNAME} -c "yelp \"man:$1\" &> /dev/null" &

Benutzeravatar
smutbert
Moderator
Beiträge: 8331
Registriert: 24.07.2011 13:27:39
Wohnort: Graz

Re: [gelöst] "..." in "..." verschachteln/escapen (sh/bash)

Beitrag von smutbert » 21.02.2016 14:12:18

Wäre wohl eleganter? Spricht noch etwas anderes für die Lösung mit der Login-Shell?

Weil die Loginshell löscht/überschreibt einige vorher von mir gesetzte Variablen (XAUTHORITY, DISPLAY, GTK_THEME).
edit: Jetzt habe ich es doch mit der Loginshell gemacht und setze einfach direkt im sudo-Kommando die Variablen mittels env.

Antworten