J'ai récemment eu des problèmes à cause de cela.
$sudo vim /etc/motd
[sudo] password for bruce:
bruce is not in the sudoers file. This incident will be reported.
Est-il possible de vérifier si j'ai un accès sudo ou non?
J'ai récemment eu des problèmes à cause de cela.
$sudo vim /etc/motd
[sudo] password for bruce:
bruce is not in the sudoers file. This incident will be reported.
Est-il possible de vérifier si j'ai un accès sudo ou non?
Réponses:
Courez sudo -v
. Il est généralement utilisé pour prolonger le délai d’expiration de votre mot de passe sudo, mais peut également servir à déterminer si vous avez des sudo
privilèges.
$ sudo -v
Sorry, user [username] may not run sudo on [hostname].
Extrait de la page de manuel:
Si l'option -v (validate) est donnée, sudo mettra à jour l'horodatage de l'utilisateur, lui demandant son mot de passe si nécessaire. Cela prolonge le délai d'expiration sudo de 5 minutes supplémentaires (ou quel que soit le délai d'expiration défini dans sudoers), mais n'exécute pas de commande.
Si votre utilisateur est uniquement autorisé à exécuter des commandes spécifiques , cette commande fonctionnera, indiquant que vous êtes autorisé à exécuter quelque chose avec des privilèges différents. Bien que le message ait un aspect différent lorsque vous essayez d'exécuter une commande que vous n'êtes pas autorisé à faire dans ce cas (et qu'aucun courrier n'est envoyé à la racine ), il est toujours possible que vous ayez des problèmes si les administrateurs le lisent /var/log/secure
.
$ sudo ls
[sudo] password for [username]:
Sorry, user [username] is not allowed to execute '/bin/ls' as root on [hostname].
Pour savoir ce que vous êtes autorisé à exécuter avec différents privilèges, vous pouvez utiliser sudo -l
. Notez que cette commande nécessite que vous entriez votre mot de passe.
patrick@<host>:~$ sudo -v sudo: unable to resolve host <host>
? J'ai entré mon mot de passe et je n'ai rien eu à propos de non autorisé. Je sais que j'ai sudo
réussi à exécuter d'autres commandes, mais ce unable to resolve host
message m'a fait craindre que quelque chose d'autre ne soit funky sur l'hôte.
sudoers
fichier. Vous pouvez y spécifier sur quel hôte un utilisateur est autorisé à exécuter une commande spécifique (cela est utile lorsque vous utilisez le même sudoers
fichier sur plusieurs ordinateurs). Le nom d'hôte spécifié dans ce fichier n'a peut-être pas pu être résolu. Essayez de vérifier avec la host
commande par exemple.
sudo -v
a déclaré "xx n'est pas dans le fichier sudoers. Cet incident sera signalé."
C'est très simple. Courez sudo -l
. Ceci listera tous les privilèges sudo que vous avez.
sudo -l
un mot de passe si vous pouvez ou non utiliser votre mot de passe. sudo -v
ne demande que si vous le pouvez, et "$(whoami)" != "root"
ne demandera jamais rien dans aucun Linux.
sudo
privilèges.
Voici la version conviviale du script:
timeout 2 sudo id && echo Access granted || echo Access denied
car il ne sera pas bloqué sur l'entrée du mot de passe si vous n'avez pas l' sudo
accès.
Vous pouvez également le définir dans une variable comme:
timeout 2 sudo id && sudo="true" || sudo="false"
echo "$sudo"
Remarque: sur macOS, vous devez installer coreutils
, par exemple brew install coreutils
.
timeout
ne sont pas disponibles par défaut, par exemple sous OS X?
coreutils
, par exemple brew install coreutils
.
La réponse de Gerald Schade ici , peut encore être améliorée!
Utilisation
prompt=$(sudo -nv 2>&1)
if [ $? -eq 0 ]; then
# exit code of sudo-command is 0
echo "has_sudo__pass_set"
elif echo $prompt | grep -q '^sudo:'; then
echo "has_sudo__needs_pass"
else
echo "no_sudo"
fi
Voici un exemple complet d'utilisation dans un script :
#!/usr/bin/env bash
is_root () {
return $(id -u)
}
has_sudo() {
local prompt
prompt=$(sudo -nv 2>&1)
if [ $? -eq 0 ]; then
echo "has_sudo__pass_set"
elif echo $prompt | grep -q '^sudo:'; then
echo "has_sudo__needs_pass"
else
echo "no_sudo"
fi
}
elevate_cmd () {
local cmd=$@
HAS_SUDO=$(has_sudo)
case "$HAS_SUDO" in
has_sudo__pass_set)
sudo $cmd
;;
has_sudo__needs_pass)
echo "Please supply sudo password for the following command: sudo $cmd"
sudo $cmd
;;
*)
echo "Please supply root password for the following command: su -c \"$cmd\""
su -c "$cmd"
;;
esac
}
if is_root; then
echo "Error: need to call this script as a normal user, not as root!"
exit 1
fi
elevate_cmd which adduser
Pour moi, ' sudo -v
' et ' sudo -l
' ne fonctionnaient pas dans un script car parfois interactifs (me demandant un mot de passe, comme mentionné ci-dessus). ' sudo -n -l
' n'a pas non plus fonctionné, il a donné le code de sortie '1' bien que j'ai des autorisations sudo, à cause du mot de passe manquant. Mais étendre la commande à:
A=$(sudo -n -v 2>&1);test -z "$A" || echo $A|grep -q asswor
a réussi pour moi pour le script. Cette expression indique 0
si l'utilisateur actuel peut appeler «sudo» et 1
sinon.
Explication:
Le paramètre supplémentaire -n
destiné à sudo
empêcher l'interactivité.
Le résultat $A
de la commande ' sudo -n -v 2>&1
' peut être:
- vide (dans ce cas, l'utilisateur actuel peut appeler sudo), ou:
- une note indiquant que l'utilisateur actuel n'est pas autorisé à utiliser Sudo, ou:
- un texte de question pour le mot de passe (dans ce cas, l'utilisateur est autorisé).
("asswor" conviendra aussi bien pour un "mot de passe" anglais que pour un "mot de passe allemand").
J'ai un rang inférieur à voter et à commenter, mais je voulais faire remonter la réponse de Gerald Schade, car je trouvais que c'était le seul moyen précédemment, et je pensais que personne d'autre ne le sait - jusqu'à maintenant: D
ma solution:
[[ "$(whereis sudo)" == *'/'* && "$(sudo -nv 2>&1)" != 'Sorry, user'* ]]
(à partir de fin 2015 mwhahaaa)
"Accès Sudo" vient en saveurs. Deux types principaux: Tout d'abord, vous (ou un groupe dont vous êtes membre) devez être configuré pour un accès sudo dans le fichier / etc / sudoers.
Deuxièmement, vous devez connaître votre mot de passe ou vous devez avoir effectué une commande sudo récemment. Assez récemment, le délai d'attente n'a pas expiré. (Fait amusant: vous pouvez faire passer le temps d'arrêt très longtemps dans le fichier de votre sudoer.)
Je veux souvent tester le second type d'accès dans le prologue d'un script qui nécessite quelques étapes. Lorsque cette vérification échoue, je peux informer l'utilisateur qu'il doit activer le deuxième type d'accès avant d'exécuter le script.
bash-3.2$ if sudo -S -p '' echo -n < /dev/null 2> /dev/null ; then echo 'Sudo is enabled.' ; else echo 'Sudo is not enabled' ; fi
Sudo is enabled.
bash-3.2$ sudo -K
bash-3.2$ if sudo -S -p '' echo -n < /dev/null 2> /dev/null ; then echo 'Sudo is enabled.' ; else echo 'Sudo is not enabled' ; fi
Sudo is not enabled
Le -S dit à sudo de lire le mot de passe à partir de stdin. Le -p définit une invite vide. Le -K efface la deuxième fois de l'accès.
Puisqu'il envoie stderr à / dev / null, il vérifiera également si l'utilisateur dispose du premier type d'accès sudo.
Suivez ces étapes pour afficher le fichier sudoers. Si vous êtes là-bas, vous avez sudo. Sinon, vous pouvez ajouter vous-même.
su
visudo
your_username_here ALL=(ALL) ALL
:wq
exit
sudo
sudo
, il n'est donc probablement pas l' administrateur système, ni même l'un des administrateurs système d'élite. Il est probablement juste un utilisateur qui pensait avoir obtenu des pouvoirs limités. Qu'est-ce qui vous fait penser qu'il peut partir su
?