web-dev-qa-db-fra.com

Exécuter le script en tant que root lors de la connexion (pas d'utilisateur sudoer, session Shell)

Tout comme /etc/profile et ~/.profile, mais exécuté par la racine au lieu de l'utilisateur se connecte. /etc/rc.local s'exécute après le démarrage, mais j'ai besoin d'exécuter le script avant de me connecter. L'utilisateur n'est pas un sudoer.

Merci!

8
Antonio Sánchez

Pour revenir à la méthode sudoers, je pense que vous y étiez presque avant d’abandonner. En regardant vos derniers commentaires, je voudrais juste aborder quelque chose qui va probablement arranger les choses pour vous:

Si vous exécutez un script en tant que root, vous n'avez pas besoin d'appeler Sudo à partir de celui-ci.

J'ai un script comme ça:

#! /bin/bash

echo $USER
whoami

Si je lance Sudo ./myscript je vois root renvoyé pour les deux. La session en cours d'exécution du script est un shell racine.

En bref, cela signifie que tout ce que vous faites dans votre script a déjà des autorisations root. Vous n'avez pas besoin d'appeler Sudo (mais cela ne devrait pas faire mal - root a généralement les autorisations Sudo.).

Alors écrivez votre script, chown il en root et chmod en 700 (de sorte que seul root puisse l'exécuter, le lire ou le modifier), puis autoriser simplement votre utilisateur [ s] pour le faire passer par les sudoers. Cela devrait fonctionner.

Si cela ne fonctionne pas, il s'agit probablement d'un problème plus grave lié au script, et non au cadre des autorisations. Je suggérerais de donner à un utilisateur un accès complet Sudo (l'ajout à un groupe d'administration est le moyen le plus simple), puis d'exécuter votre script.

3
Oli

Étape 1. Créez un script avec la commande bind en utilisant n’importe quel éditeur. Par exemple:

Sudo emacs bind_user_directories.sh

contenu:

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

Étape 2. Sauvegardez bind_user_directories.sh et rendez-le exécutable:

chmod a+x bind_user_directories.sh

Étape 3. associez-le à un emplacement approprié tel que/usr/local/sbin:

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

Étape 4. Créez le script de démarrage:

Sudo emacs /etc/init/bind_user_directories.conf

contenu:

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

Si cela fonctionne pour vous, s'il vous plaît faites le moi savoir. Vous pouvez consulter le journal système pour les messages après vous être connecté. (Je ne l'ai pas encore testé et je n'ai jamais implémenté une telle installation auparavant.) Si vous passez à la solution, partagez votre solution finale ici. Merci.

2
MountainX

Pour exécuter un script en tant que root avant la connexion

  1. Vous pouvez commencer le script avec le Upstart .

  2. Vous pouvez ajouter l'appel de script aux scripts de démarrage existants de kdm/gdm/etc .

Exemples: Sujet: FAQ: Démarrage automatique/Autorun, exécution périodique .

0
user26687