Ich habe ein Init-Skript, das als Nicht-Root-Benutzer ausgeführt werden soll. Wie kann ich das erstellen? Ubuntu 12.04
#!/bin/sh
DEPLOY_BIN=/usr/share/deploy/bin
PID_FILE=/var/run/deploy.pid
PATH=/bin:/usr/bin:/sbin:/usr/sbin:$DEPLOY_BIN DAEMON=$DEPLOY_BIN/reporting
NAME=deploy
DESC="Deploy" if [ `id -u` -ne 0 ]; then
echo "You need root privileges to run this script"
exit 1 fi . /lib/lsb/init-functions if [ -r /etc/default/rcS ]; then
. /etc/default/rcS fi case "$1" in
start)
log_daemon_msg "Starting $DESC"
pid=`pidofproc -p $PID_FILE deploy`
if [ -n "$pid" ] ; then
log_begin_msg "Already running."
log_end_msg 0
exit 0
fi
# Start Daemon
start-stop-daemon --start --pidfile "$PID_FILE" --make-pidfile --background --exec $DAEMON
log_end_msg $?
;;
stop)
log_daemon_msg "Stopping $DESC"
if [ -f "$PID_FILE" ]; then
start-stop-daemon --stop --pidfile "$PID_FILE" \
--retry=TERM/20/KILL/5 >/dev/null
if [ $? -eq 1 ]; then
log_progress_msg "$DESC is not running but pid file exists, cleaning up"
elif [ $? -eq 3 ]; then
PID="`cat $PID_FILE`"
log_failure_msg "Failed to stop $DESC (pid $PID)"
exit 1
fi
rm -f "$PID_FILE"
else
log_progress_msg "(not running)"
fi
log_end_msg 0
;;
status)
status_of_proc -p $PID_FILE deploy && exit 0 || exit $?
;;
restart|force-reload)
if [ -f "$PID_FILE" ]; then
$0 stop
sleep 1
fi
$0 start
;;
*)
log_success_msg "Usage: $0 {start|stop|restart|force-reload|status}"
exit 1
;; esac exit 0
Antwort1
Lösung 1: sudo
Regeln
Fügen Sie Ihrer sudoers
Datei (mithilfe von visudo
) die folgende Regel hinzu:
<user_name> ALL=(root) NOPASSWD:<path/to/your/script>
Ersetzen Sie <user_name>
durch Ihren Nicht-Root-Benutzer-Anmeldenamen und <path/to/your/script>
mit demabsolutPfad zu dem, was Sie ausführen möchten.
Derselbe Vorgang kann durchgeführt werden, indem die Regel in einer Datei unter abgelegt wird /etc/sudoers.d
. Beachten Sie, dass diese Datei Eigentum von sein root:root
und den Modus 0440 haben muss, um mit arbeiten zu können sudo
.
Das NOPASSWD
Flag ist hier optional, je nachdem, ob Ihr Benutzer das Kennwort zur Authentifizierung der Aktion angeben soll oder nicht. Es hängt ganz von Ihren Entscheidungen ab, wer was tun kann und wie einfach es ist.
Danach ist es erledigt und Sie können es als sudo <script>
Nicht-Root-Benutzer ausführen.
HINWEIS: Überprüfen Sie Ihre Benutzerregeln sudo
mitsudo -l
Lösung 2: (PITA) Überprüfen Sie alle Eigentümer und Berechtigungen
Damit ein Nicht-Root-Benutzer das Skript als er selbst ausführen kann, müssen Sie sicherstellen, dass alle Aktionen, die das Skript und der darin gestartete Daemon ausführen, innerhalb der zulässigen Aktionen des ausführenden Benutzers liegen. Das bedeutet:
- Der Benutzer muss über die entsprechenden Berechtigungen für alle vom Daemon verwendeten Geräte verfügen.
- Der Benutzer muss über die entsprechenden Berechtigungen verfügen, um alle Ordner in einem Pfad lesen/schreiben/ausführen zu können, auf den zugegriffen werden soll.
- Der Benutzer muss über die entsprechenden Berechtigungen zum Lesen/Schreiben aller zu öffnenden Dateien verfügen.
Also ja, es ist möglich, aber ich würde mich definitiv für die sudo
Regel entscheiden
BEARBEITEN: Natürlich müssen Sie die Zeile im Skript löschen, in der die UID mit 0 (Root) verglichen wird. Dies geschieht hier
[...]
if [ `id -u` -ne 0 ]; then
[...]