Esegui script come root all'accesso (nessun utente sudoer, sessione di shell)


8

Molto simile /etc/profilee ~/.profilegestito da root invece che l'utente sta effettuando l'accesso. /etc/rc.localviene eseguito dopo l'avvio ma è necessario eseguire lo script prima dell'accesso. L'utente non è sudoer.

Grazie!


Potrebbe esserci un modo per farlo, ma non sarebbe come /etc/profileo ~/.profileperché l'esecuzione del codice in quegli script è fatta dalla shell dell'utente ed è soggetta al controllo dell'utente, mentre se non si desidera che l'utente abbia il potere di eseguire i programmi come rootloro stessi, quindi questo dovrà essere fatto da alcuni servizi in esecuzione esterni ai processi dell'utente. ... Potrebbe essere utile se tu potessi dirci lo scopo dello script che vuoi eseguire.
Eliah Kagan,

Devo eseguire un mount specifico (--bind) per un utente specifico. Ho provato fstab con le opzioni del proprietario e dell'utente, ma non funziona. /etc/rc.local è un'opzione ma esegue sempre il mount indipendentemente dal fatto che l'utente acceda o meno. Al momento ho concesso i privilegi di sudoer per "mount" all'utente, ma questa è una soluzione alternativa e non mi piace concedere alcun privilegio agli utenti standard. Penso che userò invece rc.local. Grazie!
Antonio Sánchez,

È possibile creare uno script di root con solo quel particolare mountcomando e dare all'utente il privilegio di eseguire solo quello script (configurazione /etc/sudoers). Un comando con determinate opzioni può essere impostato direttamente in sudoers.
enzotib,

Ho già provato in questo modo. Il fatto è che quando arriva il momento di eseguire 'mount' all'interno dello script, di nuovo 'sudo' è obbligatorio, perché lo script viene eseguito da 'user' e non da 'root', quindi alla fine della giornata 'mount' deve essere concesso anche per 'utente' e invece di una sola regola sudoers ora ne ho due. Questa è la mia esperienza, quindi per favore, tieni presente che non sono un esperto e forse ho fatto qualcosa di sbagliato. Grazie!
Antonio Sánchez,

Risposte:


3

Solo per tornare al metodo sudoers, penso che tu fossi quasi arrivato prima di arrenderti. Guardando i tuoi ultimi commenti, vorrei solo affrontare qualcosa che probabilmente risolverà le cose per te:

Se esegui uno script come root, non è necessario chiamare sudo al suo interno.

Ho una sceneggiatura come questa:

#! /bin/bash

echo $USER
whoami

Se corro sudo ./myscriptvedo rootrestituito per entrambi. La sessione in cui è in esecuzione lo script è una shell di root.

In breve, ciò significa che tutto ciò che fai nel tuo script ha già i permessi di root. Non è necessario chiamare sudo(non che dovrebbe fare male - di rootsolito ha i sudopermessi).

Quindi scrivi il tuo script, chownsu roote chmodsu 700(così solo root può eseguirlo, leggerlo o modificarlo) e poi consenti ai tuoi utenti di eseguirlo su sudoer. Dovrebbe funzionare.

Se non funziona, è probabilmente un problema maggiore con lo script, non con il framework delle autorizzazioni. Suggerirei di dare a un utente pieno sudoaccesso (l'aggiunta al gruppo admin è il modo più semplice) e quindi l'esecuzione del tuo script.


2

Passaggio 1. creare uno script con il comando bind utilizzando qualsiasi editor. Per esempio:

sudo emacs bind_user_directories.sh

Contenuti:

#!/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

Passaggio 2. Salva bind_user_directories.sh e rendilo eseguibile:

chmod a+x bind_user_directories.sh

Passaggio 3. collegarlo a una posizione adatta come / usr / local / sbin:

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

Passaggio 4. crea lo script upstart:

sudo emacs /etc/init/bind_user_directories.conf

Contenuti:

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

Se questo funziona per te, per favore fatemi sapere. È possibile verificare la presenza di messaggi nel registro di sistema dopo aver effettuato l'accesso. (Non l'ho ancora testato e non ho mai implementato nulla di simile prima.) Se si migliora la soluzione, condividere qui la soluzione finale. Grazie.


Sì funziona! È un'ottima alternativa agli script di mdms /etc/mdm/PostLogin/nel mondo di Ubuntu !!
Adam Ryczkowski,

Hai qualche soluzione simile in systemd? ... Cfr. askubuntu.com/questions/847930/…
Adam Ryczkowski

0

Per eseguire uno script come root prima dell'accesso

  1. Potresti iniziare lo script con Upstart .

  2. È possibile aggiungere la chiamata di script agli script di avvio kdm / gdm / etc esistenti .

Esempi: Argomento: FAQ: avvio automatico / esecuzione automatica, esecuzione periodica .


Ma ciò che Antonio Sánchez sta cercando è come eseguire uno script come root al momento in cui un determinato utente accede .
Eliah Kagan,

Lo script deve essere eseguito indipendentemente, la sessione è grafica o shell standard. Ho aggiornato il titolo per notare questo. Ho letto qualcosa su Upstart, ma sembra complicato per il compito (apparentemente) semplice che è. Comunque e fino ad ora Upstart sembra essere l'unico modo per farlo. Se conosci Upstart, sarebbe difficile imparare abbastanza da portare a termine questo lavoro? Grazie!
Antonio Sánchez,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.