J'ai un script qui peut fonctionner comme sudo script.sh
oupkexec script.sh
Ce serait beaucoup plus agréable du point de vue de l'utilisateur si le script demandait le mot de passe à l'utilisateur lorsqu'il l'exécutait simplement par son nom script.sh
.
Comment puis-je "incorporer" une demande pkexec
ou sudo
exécuter le script entier avec le privilège root?
Notez que tout exécuter avec sudo sh -c
n'est peut-être pas la meilleure solution car j'ai des fonctions dans le script.
command-line
bash
scripts
Sergiy Kolodyazhnyy
la source
la source
exec
- appeler lui-même mais en même temps remplacer le processus, donc nous ne"$@"
s'étendra à plusieurs mots, un pour chaque paramètre.Si vous souhaitez une jolie boîte de dialogue, essayez quelque chose comme ça. J'ai arraché ça directement de quelque chose d'autre que j'ai écrit, donc il y a des trucs supplémentaires dont vous pourriez ne pas avoir besoin ou que vous voulez, mais cela montre l'idée générale:
Cela utilise whiptail, que vous pouvez installer si vous ne l'avez pas déjà:
la source
exec echo [PASSWORD]
! Il engendrera un processus avec le mot de passe sur la ligne de commande que tout utilisateur peut voir. Soit utiliser la commande intégréeecho
(forcer la version intégrée avecbuiltin echo
) ou le bashisme<<<
(comme ceci :)sudo ... <<< "$pass"
; Sh et d'autres obus ont des documents ici pour ces cas. Indiquez également le mot de passe s'il contient des caractères spéciaux.whiptail
commande dans un script séparé et utilisez quelque chose commeSUDO_ASKPASS=/path/to/askpass-with-whiptail.sh sudo -A -p "My password prompt" -- "$0" "$@"
poursudo
gérer l'invite de mot de passe personnalisé.La réponse de blade19899 est en effet la voie à suivre, mais on pourrait aussi appeler
sudo bash
le shebang:La mise en garde évidente est que cela ne fonctionnera que tant que le script sera appelé avec
./script
et échouera dès que le script sera appelé avecbash script
.la source
bash script
sur la ligne de commande pour appeler un script. Si le script spécifie autre chose quebash
dans la#!
ligne, alors l'invoquer avecbash script
échouera. Si j'essayais d'invoquer un script python à l'aide,bash script.py
il échouerait également.perl script
. Perl, dans un effort pour être vraiment très gentil, vérifie la ligne shebang, et s'il n'invoque pas perl, il exécute le programme correct.Je fais précéder les commandes du script qui nécessitent un accès root avec
sudo
- si l'utilisateur n'a pas déjà obtenu les autorisations, le script demande un mot de passe à ce stade.Exemple
Ce script peut être exécuté en tant que
sudo <scriptname>
ou en tant que<scriptname>
. Dans les deux cas, il ne demandera le mot de passe qu'une seule fois.la source
sudo
25 commandes différentes redondantes - il est plus facile d'appeler sudo une fois. Ici cependant, la raison pour laquelle votre script n'appelle sudo qu'une seule fois est que sudo a un délai de 15 minutes - les commandes qui prennent plus de temps devront être repromptées. Votre chemin fonctionne juste. . . pas la façon dont j'en ai besoin pour travailler.Il semble que personne d'autre n'ait abordé la question évidente ici. Mettre
sudo
dans votre script que vous distribuez ensuite favorise les mauvaises habitudes des utilisateurs . (Je suppose que vous le distribuez parce que vous mentionnez "d'un point de vue utilisateur.")La vérité est qu'il existe une directive dans l'utilisation des applications et des scripts qui est similaire au principe de sécurité dans les opérations bancaires de: Ne donnez jamais vos informations personnelles à quelqu'un qui vous appelle et dit qu'il appelle "de votre banque" , et qui existe pour des raisons similaires.
La règle pour les candidatures est:
Ne tapez jamais votre mot de passe lorsque vous y êtes invité, sauf si vous êtes certain de ce qui est fait avec. Cela s'applique trois fois à toute personne ayant
sudo
accès.Si vous saisissez votre mot de passe parce que vous avez exécuté
sudo
sur la ligne de commande, tant mieux. Si vous le saisissez parce que vous avez exécuté une commande SSH, très bien. Si vous le saisissez lorsque vous vous connectez à votre ordinateur, c'est parfait, bien sûr.Si vous exécutez simplement un script ou un exécutable étranger et saisissez discrètement votre mot de passe lorsque vous y êtes invité, vous n'avez aucune idée de ce que le script fait avec. Il pourrait être en train de le stocker dans un fichier temporaire en clair, pour autant que vous le sachiez, et pourrait même ne pas se nettoyer après lui-même.
Évidemment, il existe des préoccupations distinctes et supplémentaires concernant l'exécution d'un ensemble inconnu de commandes
root
, mais ce dont je parle ici est de maintenir la sécurité sur le mot de passe lui-même . Même en supposant que l'application / le script n'est pas malveillant, vous souhaitez toujours que votre mot de passe soit traité en toute sécurité pour empêcher d' autres applications de s'en emparer et de l'utiliser de manière malveillante.Donc, ma réponse personnelle à cela est, la meilleure chose à mettre dans votre script s'il a besoin des privilèges root, est:
la source
sudo script_name
est tout aussi vulnérable, c'est la même chose. Peut-être que cette idée favorise de mauvaises habitudes - je ne dirai rien à ce sujet. Mais la clé est de savoir ce que fait un programme, et c'est la responsabilité de l'utilisateur. C'est toute l'idée derrière les logiciels open source. Quant à mon propre script, eh bien. . . un script est du texte brut - les utilisateurs peuvent le lire s'ils veulent savoir ce qu'il faitJe l'ai fait de cette façon:
la source