Inviter l'utilisateur à se connecter en tant que root lors de l'exécution d'un script shell

17

Le problème que je reçois est, lorsque j'entre la commande,

su - root

au début de mon fichier de script shell, il invite l'utilisateur à saisir le mot de passe, puis NE PAS continuer avec le reste du script shell. Je dois ensuite localiser et exécuter manuellement le script shell via le terminal. Je veux que le script s'assure que l'utilisateur se connecte en tant que root, puis continue avec le reste du script shell.

En d'autres termes, je veux exécuter le script en tant qu'utilisateur, mais dès que le script commence à s'exécuter, l'utilisateur doit passer à root et continuer avec le reste du script en tant que root jusqu'à ce qu'il soit terminé. Cela peut-il être fait?

Redson
la source

Réponses:

34

Ceci est très simple à réaliser:

#!/bin/sh
[ "$(whoami)" != "root" ] && exec sudo -- "$0" "$@"

Lorsque l'utilisateur actuel n'est pas root, réexécutez le script via sudo.

Notez que j'utilise sudoici au lieu de su. En effet, cela vous permet de conserver les arguments. Si vous utilisez su, votre commande devrait être celle su -c "$0 $@"qui gênerait vos arguments s'ils ont des espaces ou des caractères de shell spéciaux.

Si votre shell est bash, vous pouvez éviter l'appel externe à whoami:

(( EUID != 0 )) && exec sudo -- "$0" "$@"
Patrick
la source
Désolé, j'ai fait une erreur dans l'explication, donc cela pourrait avoir été mal interprété. Voici une explication plus claire. Merci pour l'aide!
Redson
@ user68857 Votre question était claire. Cette réponse fait exactement ce que vous voulez.
Patrick
je continue à recevoir cette erreur: sudo: doit être root setuid
Redson
je veux exécuter le script en tant qu'utilisateur normal via le terminal, mais le script doit ensuite basculer l'utilisateur en root jusqu'à la fin du script
Redson
@Nosscire si vous obtenez sudo: must be setuid root, alors quelque chose est arrivé à votre sudo. Pour résoudre ce problème: chmod u+s $(which sudo). Et oui, je suis bien conscient de ce que vous essayez de faire, je fais toujours la même chose dans mes scripts.
Patrick
7

Vous pouvez également vérifier l'UID:

 if [ $(id -u) != 0 ]; then
     echo "You're not root"
     # elevate script privileges
 fi
Ruisseau
la source
5

Vous pouvez appeler le script lui-même et vérifier:

#! /bin/bash

if [ "root" != "$USER" ]; then
  su -c "$0" root
  exit
fi

...
Hauke ​​Laging
la source
0

Au point où vous souhaitez vous connecter, ajoutez simplement la commande suivante

sudo su

Cela fonctionne parfaitement avec mon code

user245333
la source