2010-10-04 9 views
6

Il existe un script shell (/ bin/sh, pas bash) qui nécessite des autorisations root pour l'exécution. S'il est exécuté par un utilisateur normal, il doit demander un mot de passe à l'utilisateur pour obtenir un accès root et se réexécuter lui-même.su et sudo dans un script shell

Maintenant, il utilise le code suivant:

if [ $(id -u) -ne 0 ]; then su root -- $0 [email protected] ; ... fi

Cela fonctionne très bien, mais il y a certains OS comme Ubuntu qui n'a pas de mot de passe root du tout. D'un autre côté, beaucoup de systèmes utilisent sudo pour les permissions root.

La question est: comment le script peut détecter si vous souhaitez utiliser su ou sudo sans demander à l'utilisateur d'entrer des mots de passe trop (par exemple entrer sudo mot de passe, si elle échoue - terme su).

Répondre

3

Il n'existe pas de méthode pare-balles, car toute distribution peut placer des fichiers de la façon dont elle le souhaite. Debian et Ubuntu placent souvent les fichiers système dans des répertoires autres que Red Hat, par exemple. Il est beaucoup plus facile de personnaliser le script pour le système d'exploitation sur lequel il est installé.

2

Vous pouvez configurer le compte de ne pas avoir besoin d'un mot de passe pour sudo/etc/sudoers:

yourusername ALL=(ALL) NOPASSWD: ALL 

Si vous ne voulez pas le faire, vous pouvez les forcer à exécuter le script en tant que root. Ajouter quelque chose comme ça en haut de votre script shell:

if [ "$UID" -ne 0 ]; then 
    echo "You must be root to run this script" 
    exit 1 
fi 

De cette façon, l'utilisateur peut obtenir d'être root mais ils choisissent (su ou sudo).

+0

Ce script est une sorte d'installation - Je ne lance pas à mon hôte, mais d'autres utilisateurs exécuter à leurs machines. – zserge

+0

Qu'en est-il de la deuxième partie? Quitter tôt et les inviter à exécuter le script en tant que root. – gpojd

+0

C'était le code utilisé dans les anciennes versions. Maintenant, j'essaie d'obtenir les privilèges root du script, donc l'utilisateur n'a pas besoin de le redémarrer.Semble être un peu plus convivial – zserge

0

Vérifiez si sudo ist installé

SU='su' 
which sudo > /dev/null && SU='sudo' 
+0

Un bon moyen Mais: il peut y avoir sudo installé sur la machine, mais l'utilisateur n'a pas les permissions pour exécuter ce script avec sudo – zserge

+0

Cela n'a pas d'importance, car alors, sudo échouera, sans demander de mot de passe, et vous pouvez invoquer 'su' à la place (observez simplement le résultat de' sudo true') – bitmask

+0

Peut-être que je me trompe, mais si l'utilisateur est autorisé à fonctionner, il n'est pas garanti qu'il puisse exécuter notre script Et, si l'utilisateur est autorisé Pour exécuter des programmes avec un mot de passe, il sera invité à exécuter 'sudo true' J'essaie d'éviter les demandes de mot de passe inutiles – zserge

0

Bien que cela ne répond pas complètement à votre question, il convient de noter que vous pouvez vérifier si le paquet sudo est installé à l'aide les suivantes:

systèmes basés sur Debian :

dpkg -s sudo 

systèmes à base de RPM:

rpm -q sudo 
+1

Qu'en est-il des utilisateurs de gentoo, arch ou slackware? À mon avis, 'quel sudo' est un moyen plus général de tester si le programme est installé. – zserge

+0

Et d'ailleurs, qu'en est-il de Free/Open/Net BSD, macOS, Illumos, HP/UX, Android, webOS? Si vous devez compter sur quelque chose, comptez sur POSIX.1. Certainement pas des outils d'emballage spécifiques à une plate-forme. – ghoti

+0

'hash somebinary' est aussi une bonne façon de trouver un binaire, surtout si vous appelez à nouveau le binaire car il met en cache le chemin pour une exécution plus rapide, mais vous devrez peut-être rediriger toutes les sorties vers/dev/null si vous attendre un échec et je veux juste le code de sortie. – dragon788

6

Il ne devrait pas. Si le script requiert des privilèges root, il doit être exécuté en tant que root. C'est l'affaire de l'utilisateur comment il va accomplir cela - en utilisant su, sudo ou un autre mécanisme.

Si vous êtes concerné par des problèmes de sécurité et que vous ne voulez pas tout faire depuis root, vous pouvez supprimer les privilèges root pour ces parties.

+0

Le commentaire de zserge ci-dessous explique "C'est le code utilisé dans les anciennes versions.J'essaie d'obtenir les privilèges root du script [installation], donc l'utilisateur n'a pas besoin de le redémarrer.Il semble être un peu plus utilisateur -amical". Semble la base juste pour une question, et pas intrinsèquement mauvais ;-). –

+0

@Tony: Mon point est que c'est * pas * convivial du tout. Ceci est un exemple d'essayer d'être plus intelligent que l'utilisateur. Dans certains cas, cela peut fonctionner, mais il est beaucoup plus susceptible de causer des problèmes à l'utilisateur. Aussi, vous devriez suivre le principe de la moindre surprise. Je serais surpris (et aurais quelques questions à l'auteur) si un programme essayait d'acquérir des privilèges root en utilisant sudo sans mon consentement. –

1

Créer un fichier plus .sh de ce fichier appelez votre fichier original comme .sh -

su - oracle /u01/enlightics/Enlightiks/UploadFTP/ExportScript2.sh