chown
Section: System Calls (2)
Updated: 5 février 2023
Index
Return to Main Contents
NOM
chown, fchown, lchown, fchownat - Modifier l'appartenance d'un fichier
BIBLIOTHÈQUE
Bibliothèque C standard (libc, -lc)
SYNOPSIS
#include <unistd.h>
int chown(const char *chemin, uid_t owner, gid_t group);
int fchown(int fd, uid_t owner, gid_t group);
int lchown(const char *chemin, uid_t owner, gid_t group);
#include <fcntl.h> /* Définition des constantes AT_* */
#include <unistd.h>
int fchownat(int dirfd, const char *chemin,
uid_t owner, gid_t group, int flags);
Exigences de macros de test de fonctionnalités pour la glibc (consulter
feature_test_macros(7)) :
fchown(), lchown() :
/* Depuis la glibc 2.12: */ _POSIX_C_SOURCE >= 200809L
|| _XOPEN_SOURCE >= 500
|| /* Versions de la glibc <= 2.19: */ _BSD_SOURCE
fchownat() :
Depuis la version 2.10 de la glibc :
_POSIX_C_SOURCE >= 200809L
Avant la version 2.10 de la glibc :
_ATFILE_SOURCE
DESCRIPTION
Ces appels système modifient le propriétaire et le groupe d'un fichier. Les
appels système chown(), fchown() et lchown() diffèrent seulement
dans la façon dont le fichier est indiqué :
- •
-
chown() modifie l'appartenance du fichier indiqué dans chemin, qui est
déréférencé s'il s'agit d'un lien symbolique.
- •
-
fchown() modifie l'appartenance du fichier référencé par le descripteur
de fichier ouvert fd.
- •
-
lchown() est comme chown(), mais ne déréférence pas les liens
symboliques.
Seul un processus privilégié (sous Linux : un processus qui a la capacité
CAP_CHOWN) peut modifier le propriétaire d'un fichier. Le propriétaire
peut modifier le groupe du fichier pour n'importe quel groupe auquel il
appartient. Un processus privilégié (sous Linux : avec la capacité
CAP_CHOWN) peut modifier le groupe arbitrairement.
Si l'argument owner ou group vaut -1, l'élément correspondant n'est
pas changé.
Quand le propriétaire ou le groupe d'un fichier exécutable sont modifiés par
un utilisateur ordinaire, les bits S_ISUID et S_ISGID sont
effacés. POSIX ne précise pas s'il faut agir de même lorsque c'est le
superutilisateur qui invoque chown(). Le comportement de Linux dans ce
cas dépend de la version du noyau et depuis la version 2.2.13, root est
traité comme les autres utilisateurs. Si le fichier n'est pas exécutable par
les membres de son groupe (c'est-à-dire un fichier pour lequel le bit
S_IXGRP n'est pas positionné), le bit S_ISGID indique la présence d'un
verrou impératif sur le fichier, et n'est donc pas effacé par un chown().
Quand le propriétaire ou le groupe d'un fichier exécutable est modifié (quel
que soit l'utilisateur), tous les paramètres de capacités du fichier sont
effacés.
fchownat()
L'appel système fchownat() fonctionne exactement comme chown(), les
seules différences étant celles décrites ici.
Si chemin est un chemin relatif, il est interprété par rapport au
répertoire référencé par le descripteur de fichier dirfd (plutôt que
relativement au répertoire de travail courant du processus appelant, comme
cela est fait par chown() pour un chemin relatif).
Si chemin est relatif et si dirfd est la valeur spéciale AT_FDCWD,
chemin est interprété comme étant relatif au répertoire courant du
processus appelant (comme chown()).
Si pathname est absolu, alors dirfd est ignoré.
L'argument flags est un masque de bits construit en réalisant un OU
logique entre zéro ou plusieurs des valeurs suivantes :
- AT_EMPTY_PATH (depuis Linux 2.6.39)
-
Si chemin est une chaîne vide, opérer sur le fichier référencé par
dirfd (qui peut avoir été obtenu en utilisant open(2) avec le drapeau
O_PATH). Dans ce cas, dirfd peut référer à tout type de fichier, pas
uniquement un répertoire. Si dirfd vaut AT_FDCWD, l'appel opère sur le
répertoire en cours. Ce drapeau est spécifique à Linux, _GNU_SOURCE doit
être définie pour obtenir sa définition.
- AT_SYMLINK_NOFOLLOW
-
Si chemin est un lien symbolique, ne pas le déréférencer, mais renvoyer
des informations sur le lien lui-même, comme le fait lchown(). (Par
défaut, fchownat() suit les liens symboliques, comme chown().)
Consultez openat(2) pour une explication de la nécessité de
fchownat().
VALEUR RENVOYÉE
En cas de succès, zéro est renvoyé. En cas d'erreur, -1 est renvoyé et
errno est définie pour préciser l'erreur.
ERREURS
Suivant le type de système de fichiers, d'autres erreurs que celles listées
ci-desous peuvent être renvoyées.
Les erreurs les plus courantes pour chown() sont les suivantes :
- EACCES
-
L'accès à un élément du chemin est interdit. (Voir aussi
path_resolution(7).)
- EBADF
-
(fchown()) Le descripteur de fichier fd est non valable.
- EBADF
-
(fchownat()) pathname est relatif mais dirfd ne vaut ni
AT_FDCWD, ni un descripteur de fichier valable.
- EFAULT
-
nom_chemin pointe en dehors de l'espace d'adressage accessible.
- EINVAL
-
(fchownat()) flags contient un attribut non valable.
- EIO
-
(fchown()) Une erreur d'entrée-sortie bas niveau s'est produite durant la
modification de l'inœud.
- ELOOP
-
Trop de liens symboliques ont été rencontrés en parcourant nom_chemin.
- ENAMETOOLONG
-
nom_chemin est trop long.
- ENOENT
-
Le fichier n'existe pas.
- ENOMEM
-
La mémoire disponible du noyau n'était pas suffisante.
- ENOTDIR
-
Un élément du chemin d'accès n'est pas un répertoire.
- ENOTDIR
-
(fchownat()) pathname est relatif et dirfd est un descripteur de
fichier faisant référence à un fichier qui n'est pas un dossier.
- EPERM
-
Le processus appelant n'a pas les permissions nécessaires (voir plus haut)
pour modifier le propriétaire et/ou le groupe.
- EPERM
-
Le fichier est indiqué comme immuable ou uniquement complétable (voir
ioctl_iflags(2)).
- EROFS
-
Le fichier indiqué réside sur un système de fichiers en lecture seule.
VERSIONS
fchownat() a été ajouté dans Linux 2.6.16 ; la prise en charge de la
bibliothèque a été ajoutée dans la glibc 2.4.
STANDARDS
chown(), fchown(), lchown() : 4.4BSD, SVr4, POSIX.1-2001,
POSIX.1-2008.
La version BSD 4.4 ne peut être appelée que par le superutilisateur (ce qui
signifie qu'un utilisateur ordinaire ne peut pas céder la propriété d'un
fichier).
fchownat() : POSIX.1-2008.
NOTES
Propriétaire des nouveaux fichiers
Lorsqu'un nouveau fichier est créé (par exemple avec open(2) ou
mkdir(2)), son propriétaire est le même que l'UID du système de fichiers
du processus créateur. Le groupe du fichier dépend de plusieurs facteurs,
incluant le type du système de fichiers, les options utilisées pour monter
le système de fichiers, et si le bit de permission SGID est activé pour le
répertoire parent. Si le système de fichiers accepte les options -o grpid
(ou de façon identique -o bsdgroups) et -o nogrpid (ou de façon
identique -o sysvgroups) de mount(8), les règles sont alors les
suivantes :
- •
-
Si le système de fichiers est monté avec l'option -o grpid, le groupe du
nouveau fichier est celui du répertoire parent.
- •
-
Si le système de fichiers est monté avec l'option -o nogrpid et si le
bit SGID est déactivé pour le répertoire parent, le groupe du nouveau
fichier est le GID du système de fichiers du processus.
- •
-
Si le système de fichiers est monté avec l'option -o nogrpid et si le
bit SGID est activé pour le répertoire parent, le groupe du nouveau fichier
est celui du répertoire parent.
À partir de Linux 4.12, les options de montage -o grpid et -o nogrpid sont acceptées par ext2, ext3, ext4 et XFS. Les systèmes de
fichiers qui n'acceptent pas ces options de montage suivent les règles de
l'option -o nogrpid.
Notes de la glibc
Sur les anciens noyaux où fchownat() n'est pas disponible, la fonction
enveloppe de glibc se rabat sur l'utilisation de chown() et de
lchown(). Quand chemin est relatif, glibc construit un chemin à partir
du lien symbolique dans /proc/self/fd qui correspond à un paramètre
dirfd.
NFS
La sémantique de chown() est volontairement modifiée sur les systèmes de
fichiers NFS où la correspondance d'UID est activée. De plus, c'est la
sémantique de tous les appels système accédant au contenu des fichiers qui
est modifiée, puisque chown() peut déclencher une interdiction immédiate
d'accès à des fichiers déjà ouverts. Un cache situé du côté client peut
induire un délai entre l'instant où l'appartenance du fichier est modifiée
et le moment où l'accès est effectivement accordé à l'utilisateur.
Détails historiques
Les appels système chown(), fchown() et lchown() originaux de Linux
ne géraient que des identifiants d'utilisateur et de groupe sur 16 bits. En
conséquence, Linux 2.4 a ajouté chown32(), fchown32() et lchown32()
qui prennent en charge des identifiants 32 bits. Les fonctions chown(),
fchown() et lchown() de la glibc qui les encapsulent gèrent de manière
transparente ces différences entre noyaux.
Avant Linux 2.1.81 (sauf 2.1.46), chown() ne suivait pas les liens
symboliques. Depuis Linux 2.1.81, chown() suit les liens symboliques, et
il existe un nouvel appel système, lchown(), qui ne les suit pas. Depuis
Linux 2.1.86, ce nouvel appel système (qui a donc la même sémantique que
l'ancien chown()) a pris son numéro de syscall, et chown() a reçu un
nouveau numéro.
EXEMPLES
Le programme suivant change le propriétaire d'un fichier fourni comme second
paramètre de la ligne de commande, en l'attribuant au propriétaire fourni en
premier argument. Le nouveau propriétaire peut être précisé par une valeur
numérique ou par le nom de l'utilisateur (qui sera converti en UID avec
getpwnam(3) pour rechercher dans le fichier des mots de passe du
système).
Source du programme
#include <pwd.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
"int
"main(int argc, char *argv[])
{
char *endptr;
uid_t uid;
struct passwd *pwd;
if (argc != 3 || argv[1][0] == '\0') {
fprintf(stderr, "%s <propriétaire> <fichier>\n", argv[0]);
exit(EXIT_FAILURE);
}
uid = strtol(argv[1], &endptr, 10); /* Permet une chaîne numérique */
if (*endptr != '\0') { /* N'était pas une chaîne numérique */
pwd = getpwnam(argv[1]); /* Essai de récupérer l'UID de l'utilisateur */
if (pwd == NULL) {
perror("getpwnam");
exit(EXIT_FAILURE);
}
uid = pwd->pw_uid;
}
if (chown(argv[2], uid, -1) == -1) {
perror("chown");
exit(EXIT_FAILURE);
}
exit(EXIT_SUCCESS);
}
VOIR AUSSI
chgrp(1), chown(1), chmod(2), flock(2), path_resolution(7),
symlink(7)
TRADUCTION
La traduction française de cette page de manuel a été créée par
Christophe Blaess <https://www.blaess.fr/christophe/>,
Stéphan Rafin <stephan.rafin@laposte.net>,
Thierry Vignaud <tvignaud@mandriva.com>,
François Micaux,
Alain Portal <aportal@univ-montp2.fr>,
Jean-Philippe Guérard <fevrier@tigreraye.org>,
Jean-Luc Coulon (f5ibh) <jean-luc.coulon@wanadoo.fr>,
Julien Cristau <jcristau@debian.org>,
Thomas Huriaux <thomas.huriaux@gmail.com>,
Nicolas François <nicolas.francois@centraliens.net>,
Florentin Duneau <fduneau@gmail.com>,
Simon Paillard <simon.paillard@resel.enst-bretagne.fr>,
Denis Barbier <barbier@debian.org>,
David Prévot <david@tilapin.org>
et
Jean-Philippe MENGUAL <jpmengual@debian.org>
Cette traduction est une documentation libre ; veuillez vous reporter à la
GNU General Public License version 3
concernant les conditions de copie et
de distribution. Il n'y a aucune RESPONSABILITÉ LÉGALE.
Si vous découvrez un bogue dans la traduction de cette page de manuel,
veuillez envoyer un message à
Index
- NOM
-
- BIBLIOTHÈQUE
-
- SYNOPSIS
-
- DESCRIPTION
-
- fchownat()
-
- VALEUR RENVOYÉE
-
- ERREURS
-
- VERSIONS
-
- STANDARDS
-
- NOTES
-
- Propriétaire des nouveaux fichiers
-
- Notes de la glibc
-
- NFS
-
- Détails historiques
-
- EXEMPLES
-
- Source du programme
-
- VOIR AUSSI
-
- TRADUCTION
-
This document was created by
man2html,
using the manual pages.
Time: 03:51:26 GMT, May 23, 2024