Wie kann ich dieses Deployment/Init als Nicht-Root-Benutzer ausführen?

Wie kann ich dieses Deployment/Init als Nicht-Root-Benutzer ausführen?

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: sudoRegeln

Fügen Sie Ihrer sudoersDatei (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:rootund den Modus 0440 haben muss, um mit arbeiten zu können sudo.

Das NOPASSWDFlag 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 sudomitsudo -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 sudoRegel 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
[...]

verwandte Informationen