Autorisation de file avec setuid et octal 4000

Lorsque nous définissons setuid sur un file, nous faisons ce qui suit dans le terminal:

 chmod u+s filename 

Cela fonctionne bien. Mais le nombre octal 4000 est toujours associé à setuid (dans les livres, etc.).

Je comprends (dans une certaine mesure) les permissions de files, le concept de umask, setuid et en utilisant des nombres octaux avec chmod . Mais je n'arrive toujours pas à comprendre la relation entre le nombre octal 4000 et setuid. S'il vous plaît, expliquez.

C'est juste une convention. Tous les identificateurs constants sont associés à des nombres dans le code source de Linux. Certains d'entre eux sont très anciens et proviennent des toutes premières versions du kernel tandis que d'autres ont été ajoutées récemment.

La constante S_ISUID associée à "setuid" est définie dans include / uapi / linux / stat.h , l'un des nombreux en-têtes Linux. Il aurait pu être défini à n'importe quoi mais il s'est avéré être 04000.

Comme indiqué par @steeldriver, man 2 stat peut vous aider à comprendre la signification des différentes constantes utilisées pour l'autorisation des files:

  S_IFMT 0170000 bit mask for the file type bit fields S_IFSOCK 0140000 socket S_IFLNK 0120000 symbolic link S_IFREG 0100000 regular file S_IFBLK 0060000 block device S_IFDIR 0040000 directory S_IFCHR 0020000 character device S_IFIFO 0010000 FIFO S_ISUID 0004000 set-user-ID bit S_ISGID 0002000 set-group-ID bit (see below) S_ISVTX 0001000 sticky bit (see below) S_IRWXU 00700 mask for file owner permissions S_IRUSR 00400 owner has read permission S_IWUSR 00200 owner has write permission S_IXUSR 00100 owner has execute permission S_IRWXG 00070 mask for group permissions S_IRGRP 00040 group has read permission S_IWGRP 00020 group has write permission S_IXGRP 00010 group has execute permission S_IRWXO 00007 mask for permissions for others (not in group) S_IROTH 00004 others have read permission S_IWOTH 00002 others have write permission S_IXOTH 00001 others have execute permission 

Dans cet exercice, vous voyez non seulement les constantes et leur valeur numérique, mais aussi la façon dont elles sont choisies. Les développeurs / concepteurs ont choisi les constantes de manière à pouvoir les combiner . Par exemple S_ISUID and S_IRWXU and S_IRUSR and S_IRGRP = 04740 , la permission 04740 signifie précisément "setuid et toutes les permissions pour le propriétaire et l'autorisation de lecture pour posséder le groupe".

Dans la plupart des systèmes de type Unix, un file, un directory ou tout autre object du système de files est représenté par un inode qui contient entre autres un entier appelé mode qui décrit le type d'object et certaines de ses permissions. Il est décrit dans POSIX stat.h.

 The following symbolic names for the values of type mode_t shall also be defined: File type: S_IFREG Regular. S_IFDIR Directory. S_IFLNK Symbolic link. File mode bits: S_IRWXU Read, write, execute/search by owner. S_IRUSR Read permission, owner. S_IWUSR Write permission, owner. S_IXUSR Execute/search permission, owner. ... S_ISUID Set-user-ID on execution. S_ISGID Set-group-ID on execution. ... 

Ce sont tous des noms symboliques pour les constantes entières. S_IFREG est 0100000. S_IRUSR est 000400. S_ISUID est 004000. Ils sont en octal pour la facilité d'utilisation: les bits du mode file peuvent logiquement être considérés comme 4 groupes de 3 bits chacun.

Ici vous pouvez voir les bits de type de file et les bits de mode de file de mon .profile :

 $ perl -e 'printf("%#o\n", (stat(".profile"))[2]);' 0100644 

Les users peuvent définir les bits de mode (mais pas le type de file) en utilisant l'appel système chmod , qui prend un argument entier (éventuellement en utilisant certaines de ces constantes symboliques S_ *) ou l'utilitaire chmod qui prend un nom entier ou symbolique comme u+r ).

Comme dans la pratique, il n'y a pas beaucoup de combinaisons différentes de bits de mode, de nombreux users d'Unix ont appelé chmod (à la fois l'appel système et la command) avec un argument numérique plutôt que des noms symboliques. 0755 signifie "inscriptible par le propriétaire, lisible et exécutable pour tout le monde", 0644 signifie "inscriptible par le propriétaire, lisible par tout le monde", 04755 signifie "setuid, inscriptible par le propriétaire, lisible et exécutable par tout le monde".

De la page man (anglais) pour chmod (debian jessy): (Highlight by me)

Un mode numérique est de un à quatre numbers octaux (0-7), obtenus en additionnant les bits avec les valeurs 4, 2 et 1. Les numbers omis sont supposés être des zéros à gauche. Le premier chiffre sélectionne l'ID d'user défini (4) et définit l'ID de groupe (2) et les attributes de suppression restreinte ou collant (1). Le deuxième chiffre sélectionne les permissions pour l'user qui possède le file: read (4), write (2) et execute (1); le troisième sélectionne les permissions pour les autres users du groupe du file, avec les mêmes valeurs; et le quasortingème pour les autres users ne figurant pas dans le groupe du file, avec les mêmes valeurs.

Je ne sais pas si cela répond à votre question, mais cela explique ce que les numbers signifient.