[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