C'est principalement une question de ce que l'outil ou le programme fait . En gardant à l'esprit qu'un non-superutilisateur ne peut toucher que les fichiers qu'il possède ou auxquels il a accès, tout outil qui doit pouvoir mettre les doigts dans tout nécessitera un accès superutilisateur pour faire ce qu'il fait. Voici un exemple rapide d'objets pouvant nécessiter un accès superutilisateur, mais sans s'y limiter :
- Ouverture d'un socket TCP en écoute sur un port inférieur à 1024
- Modification des configurations système (par exemple, tout ce qui se trouve dans
/etc
) - Ajout de nouvelles bibliothèques accessibles globalement (
/lib
et/usr/lib
) ou binaires (/bin
,/usr/bin
) - Toucher tous les fichiers n'appartenant pas à l'utilisateur qui fait le toucher qui n'ont pas un mode suffisamment permissif
- Modification de la propriété des fichiers d'autres utilisateurs
- Augmentation des priorités de processus (par exemple,
renice
) - Démarrer ou arrêter la plupart des services
- Configuration du noyau (par exemple, ajustement de la permutation)
- Ajuster les quotas du système de fichiers
- Écrire sur des disques "pleins" (la plupart des systèmes de fichiers réservent de l'espace pour l'utilisateur root)
- Effectuer des actions comme d'autres utilisateurs
Sous Linux, les privilèges de root étaient à un moment donné divisés en "capacités", vous pouvez donc obtenir une liste complète des privilèges spéciaux de root en consultant cette documentation :man 7 capabilities
.
Pour répondre à votre question, une commande devra être exécutée en tant que root lorsqu'elle a besoin de l'un de ces privilèges, et son exécutable non script n'a pas la capacité appropriée définie dans ses métadonnées de fichier (par exemple, si un script python nécessite la capacité, alors la capacité devrait être dans l'interpréteur python spécifié dans la ligne shebang).
Notez que certaines commandes nécessitant un accès root n'ont pas besoin de quelque chose comme sudo
car ils ont le bit SUID défini dans leur exécutable. Ce bit provoque l'exécution de l'exécutable en tant que propriétaire (généralement root) lorsqu'il est exécuté par toute personne disposant d'un accès d'exécution. Un exemple est sudo
lui-même en tant que changement d'utilisateurs est une action privilégiée qu'il doit faire.
EDIT :Je note d'après votre question que vous pourriez avoir l'idée que vous pouvez déterminer si une commande aura besoin d'un accès root avant de l'exécuter. Ce n'est pas le cas. Un programme peut parfois nécessiter des privilèges root et d'autres fois non, et cela peut être une décision prise par le programme en raison des données fournies lors de l'exécution. Prenons par exemple l'appel du vim
, juste comme ça sans arguments, puis à travers une série de touches et de collages, lui disant d'écrire quelque chose dans un fichier qu'il n'a pas l'autorisation d'écrire, ou peut-être d'exécuter une autre commande qui elle-même nécessitera des privilèges root. Rien sur la commande avant son exécution ne pourrait indiquer qu'elle nécessiterait éventuellement un accès root. C'est quelque chose qui ne peut être déterminé qu'au moment où il essaie de faire quelque chose qui l'exige.
Quoi qu'il en soit, voici très peu d'exemples tirés de la page de manuel référencée des privilèges de root :
- Effectuer des manipulations arbitraires des UID de processus (setuid(2), setreuid(2), setresuid(2), setfsuid(2)) ;
- Contourne les vérifications d'autorisation de lecture, d'écriture et d'exécution de fichiers. (DAC est l'abréviation de "contrôle d'accès discrétionnaire".)
- Contourner les vérifications d'autorisation pour l'envoi de signaux (voir kill(2)). Cela inclut l'utilisation de l'opération ioctl(2) KDSIGACCEPT.
- Effectuer diverses opérations liées au réseau :
- configuration de l'interface ;
- administration du pare-feu IP, du masquage et de la comptabilité ;
- modifier les tables de routage ;
- Liez un socket aux ports privilégiés du domaine Internet (numéros de port inférieurs à 1 024).
- Charger et décharger les modules du noyau (voir init_module(2) et delete_module(2)) ;
- Régler l'horloge système (settimeofday(2), stime(2), adjtimex(2)) ; définir l'horloge (matérielle) en temps réel.
- Effectuer une série d'opérations d'administration système, notamment :quotactl(2), mount(2), umount(2), swapon(2), swapoff(2), sethostname(2) et setdomainname(2) ;
- Utilisez reboot(2) et kexec_load(2).
- Utilisez chroot(2).
- Augmenter la valeur de nice du processus (nice(2), setpriority(2)) et modifier la valeur de nice pour les processus arbitraires ;