Führen Sie das Skript beim Anmelden als Root aus (kein Sudoer-Benutzer, Shell-Sitzung).

8

Ähnlich wie /etc/profileund ~/.profileaber von root ausgeführt, anstatt dass der Benutzer sich anmeldet. /etc/rc.localLäuft nach dem Booten, aber ich muss das Skript vor dem Anmelden ausführen. Der Benutzer ist kein Sudoer.

Vielen Dank!

Antonio Sánchez
quelle
Es kann eine Möglichkeit geben, dies zu tun, aber es wäre nicht so, /etc/profileoder ~/.profileweil das Ausführen von Code in diesen Skripten von der Benutzer-Shell durchgeführt wird und der Kontrolle des Benutzers unterliegt, während, wenn Sie nicht möchten, dass der Benutzer die hat Um Programme als sich rootselbst ausführen zu können, muss dies von einem Dienst ausgeführt werden, der außerhalb der Prozesse des Benutzers ausgeführt wird. ... Es könnte hilfreich sein, wenn Sie uns den Zweck des Skripts mitteilen, das Sie ausführen möchten.
Eliah Kagan
Ich muss einen bestimmten (--bind) Mount für einen bestimmten Benutzer durchführen. Ich habe versucht, fstab mit Eigentümer- und Benutzeroptionen, aber es funktioniert nicht. /etc/rc.local ist eine Option, führt jedoch immer die Bereitstellung durch, unabhängig davon, ob sich der Benutzer anmeldet oder nicht. Ich habe dem Benutzer derzeit Sudoer-Berechtigungen für "Mount" erteilt, dies ist jedoch eine Problemumgehung und möchte Standardbenutzern keine Berechtigungen gewähren. Ich denke, ich werde stattdessen rc.local verwenden. Vielen Dank!
Antonio Sánchez
Sie können ein Root-Skript nur mit diesem bestimmten mountBefehl erstellen und dem Benutzer die Berechtigung erteilen, nur dieses Skript auszuführen (Konfiguration /etc/sudoers). Ein Befehl mit vorgegebenen Optionen kann direkt in gesetzt werden sudoers.
Enzotib
Ich habe es schon so versucht. Die Sache ist, dass, wenn die Zeit für das Ausführen von 'mount' innerhalb des Skripts kommt, wieder 'sudo' obligatorisch ist, da das Skript von 'user' und nicht von 'root' ausgeführt wird, also am Ende des Tages 'mount'. muss auch für 'user' gewährt werden und statt nur einer einzigen sudoers regel habe ich jetzt zwei. Dies ist meine Erfahrung. Denken Sie also bitte daran, dass ich kein Experte bin und vielleicht etwas falsch gemacht habe. Vielen Dank!
Antonio Sánchez

Antworten:

3

Um auf die Sudoers-Methode zurückzukommen: Ich glaube, Sie waren fast da, bevor Sie aufgaben. Wenn ich mir Ihre neuesten Kommentare anschaue, möchte ich nur etwas ansprechen, das wahrscheinlich Abhilfe für Sie schafft:

Wenn Sie ein Skript als root ausführen, müssen Sie sudo nicht von dort aus aufrufen.

Ich habe ein Skript wie dieses:

#! /bin/bash

echo $USER
whoami

Wenn ich renne, sudo ./myscriptsehe ich rootfür beide zurückgegeben. Die Sitzung, in der das Skript ausgeführt wird, ist eine Root-Shell.

Kurz gesagt bedeutet dies, dass alles, was Sie in Ihrem Skript tun, bereits über Root-Berechtigungen verfügt. Sie müssen nicht anrufen sudo(nicht, dass es weh tun sollte - hat rootnormalerweise sudoBerechtigungen).

Schreiben Sie also Ihr Skript, chownes an rootund chmodes an 700(damit nur root es ausführen, lesen oder bearbeiten kann) und erlauben Sie dann Ihren Benutzern, es durch Sudoer auszuführen. Das sollte funktionieren.

Wenn es nicht funktioniert, ist es wahrscheinlich ein größeres Problem mit dem Skript, nicht mit dem Berechtigungsframework. Ich würde vorschlagen, einem Benutzer vollen sudoZugriff zu gewähren (das Hinzufügen zur Administratorgruppe ist der einfachste Weg) und dann Ihr Skript auszuführen.

Oli
quelle
2

Schritt 1. Erstellen Sie ein Skript mit dem Befehl bind mit einem beliebigen Editor. Zum Beispiel:

sudo emacs bind_user_directories.sh

Inhalt:

#!/bin/bash

#NOTE: this file would be placed in /usr/local/sbin/ folder as bind_user_directories.sh
#alternatively it could be placed in /etc/init.d/ ... (I guess)

### BEGIN INIT INFO
# Provides:          bind_user_directories
# Required-Start:    
# Required-Stop:     
# Should-Start:      $named
# Default-Start:     0 2 3 4 5 6 (I guess...)
# Default-Stop:      1
# Short-Description: mount --bind for a user
# Description:       runs mount --bind command for certain pre-defined directories for a specific user
### END INIT INFO

# What is this?
DESC="bind_user_directories"

# See how we were called.
case "$1" in

    start)
        log_progress_msg "bind directories for user..."
        sudo mount --bind /source/path /target/path
        log_progress_msg "done: bind directories for user"
        ;;

    stop)
        log_progress_msg "umount --bind directories for user..."
        sudo umount /target/path
        log_progress_msg "done: unbind directories for user"
        ;;

    restart)
        $0 stop
        sleep 1
        $0 start
        ;;

    *)
        #log_success_msg "Usage: bind_user_directories {start|stop|restart}"
        log_success_msg "Usage: service bind_user_directories <start|stop|restart>"
        exit 1
        ;;
esac

exit 0

Schritt 2. Speichern Sie bind_user_directories.sh und machen Sie es ausführbar:

chmod a+x bind_user_directories.sh

Schritt 3. Verknüpfen Sie es mit einem geeigneten Ort wie / usr / local / sbin:

sudo ln -s bind_user_directories.sh /usr/local/sbin/bind_user_directories.sh

Schritt 4. Erstellen Sie das Upstart-Skript:

sudo emacs /etc/init/bind_user_directories.conf

Inhalt:

description "runs mount --bind command for certain pre-defined directories for a specific user"

start on filesystem and net-device-up IFACE!=lo

stop on runlevel [!023456]
console output
respawn
respawn limit 10 5

exec /usr/local/sbin/bind_user_directories.sh start

Wenn dies für Sie funktioniert, lassen Sie es mich bitte wissen. Sie können das Systemprotokoll nach dem Anmelden auf Nachrichten überprüfen. (Ich habe es noch nicht getestet und noch nie zuvor so etwas implementiert.) Wenn Sie die Lösung verbessern, teilen Sie Ihre endgültige Lösung hier mit. Vielen Dank.

MountainX
quelle
Ja es funktioniert! Es ist eine großartige Alternative zu dem mdms - /etc/mdm/PostLogin/Skripte in Ubuntus Welt !!
Adam Ryczkowski
Haben Sie eine ähnliche Lösung in systemd? ... vgl. askubuntu.com/questions/847930/…
Adam Ryczkowski
0

So führen Sie einen Scrip als Root vor der Anmeldung aus

  1. Sie können den Scrip mit dem Upstart starten .

  2. Sie können den Skriptaufruf zu den vorhandenen Startskripten kdm / gdm / etc hinzufügen .

Beispiele: Thema: FAQ: Autostart / Autorun, periodischer Lauf .

user26687
quelle
Aber was Antonio Sánchez sucht ist wie ein Skript laufen zu lassen , wie root zu der Zeit ein bestimmter Benutzer anmeldet .
Eliah Kagan
Das Skript muss unabhängig ausgeführt werden. Die Sitzung ist eine Grafik- oder Standard-Shell. Ich habe den Titel aktualisiert, um dies zu bemerken. Ich habe etwas über Upstart gelesen, aber es sieht für die (scheinbar) einfache Aufgabe, die es ist, kompliziert aus. Wie auch immer und bis jetzt scheint Upstart der einzige Weg zu sein, dies zu tun. Wenn Sie Upstart kennen, wäre es schwierig, genug zu lernen, um diesen Job zu erledigen? Vielen Dank!
Antonio Sánchez