[linux-l] Benutzerwechsel im Shellscript

Volker Grabsch vog at notjusthosting.com
Fr Apr 6 01:48:52 CEST 2007


Liebe Gruppe,

ich bin beim Schreiben eines init.d-Scriptes über folgendes Problem
gestoßen: Es soll ein Prozess (Daemon) gestartet werden, aber nicht
als root, sondern als ein bestimmter User. Die Logdaten landen aber
in einem Logfile, das root gehört.

Die Standardlösung wäre "start-stop-daemon", aber das geht leider
nicht, weil es auf nem RHEL-4-System laufen muss, und dort habe ich
leider kein "start-stop-daemon" gefunden.

Kein Problem, dachte ich mir, und schrieb:
    su - myuser -c /usr/bin/mydaemon >> /var/log/mydaemon.log &
oder, um genauer zu sein:

    su - "$USER" -c "'$DAEMON'" >> "$LOGFILE" &


Das läuft soweit, aber zwei Details stinken:

1) Wenn nicht als root ausgeführt, kommt eine absolut irreführende
   Fehlermeldung: "stdin is not a tty" bzw. "su: must be run from a
   terminal".

        (Wenn su nicht als root gestartet wird, will es ein
         Passwort, und aus Sicherheitsgründen will es das Passwort
         nicht von "irgendeinem stdin", sondern von einer Tastatur
         haben.)

2) Das mit "-c" übergebende Kommando ist ein String, der als
   Shellkommando ausgeführt wird. Sauberes Quoting wird damit
   unmöglich.


Problem 2) lässt sich durch den "-s"-Parameter lösen:
    su - "$USER" -s "$DAEMON" >> "$LOGFILE" &
wobei die Angabe des Daemons als "Login-Shell" nicht wirklich
intuitiv ist. Aber Problem 1) kriege ich nicht in den Griff.

Warum kann "su" nicht so schön sein wie "ssh"? Da kann ich
das alles direkt ausdrücken:
    ssh -n "$USER at localhost" -- "$DAEMON" >> "$LOGFILE" &
wobei "-n" die Passwortabfrage unterdrückt. Oder "-f", dann
kümmert sich ssh besser darum, im Hintergrund zu laufen:
    ssh -f "$USER at localhost" -- "$DAEMON" >> "$LOGFILE"


Gibt es irgendeine Alternative zu "su", die ich nicht kenne?
Wie löst ihr das Problem in init.d-Scripten?


Viele Grüße,

    Volker

-- 
Volker Grabsch
---<<(())>>---
Administrator
NotJustHosting GbR



Mehr Informationen über die Mailingliste linux-l