Skript als vorgegebenen User ausführen

CombatEgg

New member
Themenstarter
Registriert
19 Aug. 2007
Beiträge
555
Ist es möglich, ein Shell-Skript oder Programm als ein bestimmter User auszuführen oder sogar auf einem bestimmten Display?

Ich hab folgendes vor: Ich habe mir zwei Skripte "dock.sh" und "undock.sh" geschrieben, die den Monitor jeweils Notebook-LCD <-> externen TFT umschalten und die Auflösung entsprechend einstellen (aticonfig und xrandr). Diese Skripte muss ich allerdings in der aktuellen X-Session aufrufen, damit sie überhaupt was machen. Nun möchte ich das gerne automatisiert in die /etc/acpi/lid.sh einfügen, damit beim Auf- und Zuklappen des Displays automatisch diese Skripte ausgeführt werden, aber soweit ich weiß, wird diese als root ausgeführt und damit zeigen meine Skripts keine Wirkung. Hat dafür jemand einen Vorschlag? Oder vielleicht einen anderen Ansatz?
 
Um welche Distribution handelt es sich, was enthält/tut die /etc/acpi/lid.sh? Eventuell könntest du auch deine beiden eigenen Skripte posten.

Nur so ein paar Ideen:
Die Skripte haben vermutlich so "keine Wirkung",
weil die DISPLAY-Umgebungsvariable als root nicht gesetzt ist. Dies kannst du jedoch einfach manuell nachholen, indem du vor den Aufruf des Skriptes
Code:
DISPLAY=:0.0 <script>
setzt.
(:0.0 kennzeichnet das erste Display/den ersten Screen des ersten XServers)
Zum "als User ausführen":
eventuell könntest du erst mit "su - <user>" eine Shell als User starten und dann das Skript. Laut Manpage muss auch das Folgende funktionieren (quasi genau das, was du möchtest):
Code:
su - <user> -c <script>
 
Es ist ein Ubuntu 8.04 (siehe Sig). Die /etc/acpi/lid.sh wird aufgerufen, wenn das Notebook-Display zu- oder aufgeklappt wird und nimmt entsprechende Änderungen vor.

Die "Skripte" sind nur einfache Funktionsaufrufe und sehen jetzt so aus:
Code:
#!/bin/bash

DISPLAY=:0.0
su -c "aticonfig --enable-monitor=tmds1,none --nobackup" - combat
su -c "xrandr -s 1680x1050" - combat
und
Code:
#!/bin/bash

DISPLAY=:0.0
su -c "aticonfig --enable-monitor=lvds,none --nobackup" - combat
su -c "xrandr -s 1400x1050" - combat
su -c "aticonfig --set-powerstate=1 --nobackup" - combat
Als Fehler bekomme ich nun:
Code:
No protocol specified
xset:  unable to open display ":0"
aticonfig: This program must be run as root when no X server is active

Update: Laut /tmp/.X11-unix ist das laufende Display die 0, also kann man den Versuch mit 1 o.ä. ausschließen.
Update2: Weiß nicht obs nötig ist, aber habe vor DISPLAY noch ein "export" vorangestellt, ändert aber auch nichts :P

Vielleicht fällt dir noch was ein, wäre super wenn das irgendwie ginge. Vielleicht gibts dafür ja auch noch einen anderen sinnvolleren Ansatz.
 
Da muss Du ja 2x das Root-Passwort eingeben ;) Du kannst mehrere Befehle mit einem doppelten kaufm. Und (&&) verbinden:
su -c "befehl1 && befehl2 -parameter..."

Du solltest Die Display Variable auch exportieren,
und ich würde damit ich nicht jedes mal das Passwort für Root eingeben muss das SetUID-Recht verwenden, so kann jeder Nutzer ein Skript/Programm mit den Rechten des Besitzers des Skriptes/Programmes aufrufen:
Code:
chmod 4711 <dateiname>
Darauf achten, dass andere Nutzer die Datein nicht beschreiben dürfen, sonst hast Du ein Sicherheitsleck :-)
 
Warum muss ich das Root-Passwort eingeben? Ich vermute, dass das Skript als root ausgeführt wird und wenn root einen Befehl "im Namen" eines anderen Users ausführen soll ist doch eigentlich kein PW nötig.

Das sind jetzt Sicherheitsaspekte, die sind zwar wichtig, aber es funktioniert ja nichtmal.

In "Update2" habe ich genannt, dass ich die Variable exportiert habe.
 
Original von CombatEgg
Warum muss ich das Root-Passwort eingeben? Ich vermute, dass das Skript als root ausgeführt wird und wenn root einen Befehl "im Namen" eines anderen Users ausführen soll ist doch eigentlich kein PW nötig.
Dein System sagt doch in:
su -c "aticonfig --enable-monitor=lvds,none --nobackup" - combat
su -c "xrandr -s 1400x1050" - combat
su -c "aticonfig --set-powerstate=1 --nobackup" - combat[/code]
Als Fehler bekomme ich nun:
Code:
No protocol specified
xset:  unable to open display ":0"
aticonfig: This program must be run as root when no X server is active
das es root rechte benötigt, weil kein X-Server läuft :-)

mit 'su' (super user) wechselst Du ja zum root, wenn das Skript als root aus geführt würde bräuchtest Du ja 'su' garnicht...
ich empfehle Dir das SetUID-Recht zu verwenden...


btw. die Befehle im einzelnen Deines Skriptes (also wenn Du sie nicht als Skript ausführst) erfüllen aber ihren Zweck, oder?


In "Update2" habe ich genannt, dass ich die Variable exportiert habe.
über lesen ...
 
Anscheinend ist es ganz egal, wer die Befehle ausführt. Ich habe den su-Befehl wieder herausgenommen und mir mal die Ausgabe angeguckt, die ist identisch mit der, die ich bekomme, wenn ichs selbst manuell aufrufe, aber es passiert trotzdem nichts. aticonfig wie auch xrandr tun nichts, geben aber keine Fehlermeldung aus.

Mit su wechsle ich nicht zum root, wenn ich einen anderen User übergebe, also in diesem Fall "combat".

Und der Link zu Wikipedia hilft mir auch nur insofern weiter, dass ich sudo oder su verwenden soll, aber das hatte ich doch?

Klar, die Befehle funktionieren, bisher rufe ich die "Skripte" ja auch immer manuell auf, bevor ich abdocke/zuklappe. Nun möchte ich ja, dass es automatisiert ausgeführt wird.

Was habt ihr denn für Lösungen mit euren externen Monitoren? Wie schaltet ihr denn auf Notebook-Display bzw. auf externen Monitor um? Oder ging sowas bei euch schon out-of-the-box automatisiert?
 
  • ok1.de
  • ok2.de
  • thinkstore24.de
  • Preiswerte-IT - Gebrauchte Lenovo Notebooks kaufen

Werbung

Zurück
Oben