| chown(2) | System Calls Manual | chown(2) |
chown, fchown, lchown, fchownat - zmieniają właściciela pliku
Standardowa biblioteka C (libc, -lc)
#include <unistd.h>
int chown(const char *pathname, uid_t owner, gid_t group); int fchown(int fd, uid_t owner, gid_t group); int lchown(const char *pathname, uid_t owner, gid_t group);
#include <fcntl.h> /* Definicja stałych AT_* */ #include <unistd.h>
int fchownat(int dirfd, const char *pathname,
uid_t owner, gid_t group, int flags);
fchown(), lchown():
/* Od glibc 2.12: */ _POSIX_C_SOURCE >= 200809L
|| _XOPEN_SOURCE >= 500
|| /* glibc <= 2.19: */ _BSD_SOURCE
fchownat():
Od glibc 2.10:
_POSIX_C_SOURCE >= 200809L
Przed glibc 2.10:
_ATFILE_SOURCE
Niniejsze wywołania systemowe zmieniają właściciela i grupę pliku. Wywołania systemowe chown(), fchown() i lchown() różnią się jedynie sposobem określenia pliku:
Zmiany właściciela pliku może dokonać jedynie proces uprzywilejowany (Linux: z przywilejem (ang. capability) CAP_CHOWN). Właściciel pliku może zmienić grupę pliku na dowolną grupę, której jest członkiem. Proces uprzywilejowany (Linux: z przywilejem CAP_CHOWN) może zmienić grupę w sposób dowolny.
Jeśli owner lub group jest podane jako -1, to ten identyfikator nie jest wtedy zmieniany.
Jeśli właściciel lub grupa pliku wykonywalnego są zmieniane przez użytkownika nieuprzywilejowanego, to bity trybu S_ISUID i S_ISGID są usuwane. Standard POSIX nie precyzuje, czy powinno to nastąpić również przy wykonaniu przez roota chown(); zachowanie w Linuksie zależy od wersji jądra, od Linuksa 2.2.13, root jest traktowany tak samo jak inni użytkownicy. W przypadku pliku, który nie jest wykonywalny dla grupy (tj. którego bit S_IXGRP nie jest ustawiony), bit S_ISGID oznacza obowiązkowe blokowanie pliku i wówczas nie jest usuwany przez chown.
Jeśli właściciel lub grupa pliku wykonywalnego zostanie zmieniona (przez dowolnego użytkownika), wszystkie zbiory przywilejów pliku zostaną usunięte.
Wywołanie systemowe fchownat() operuje w dokładnie taki sam sposób jak chown(), z wyjątkiem różnic opisanych tutaj.
Jeśli ścieżka podana w pathname jest względna, jest to interpretowane w odniesieniu do katalogu do którego odnosi się deskryptor pliku dirfd (zamiast w odniesieniu do bieżącego katalogu roboczego procesu wywołującego, jak w stosunku do ścieżek względnych robi to chown()).
Jeśli pathname jest względna a dirfd ma wartość specjalną AT_FDCWD, to pathname jest interpretowana w odniesieniu do bieżącego katalogu roboczego procesu wywołującego (jak chown()).
Jeśli ścieżka pathname jest bezwzględna, to dirfd jest ignorowane.
Parametr flags jest maską bitową, utworzoną jako suma logiczna (OR) zera lub więcej następujących wartości;
Więcej informacji o potrzebie wprowadzenia fchownat() można znaleźć w podręczniku openat(2).
Po pomyślnym zakończeniu zwracane jest zero. Po błędzie zwracane jest -1 i ustawiane errno, wskazując błąd.
W zależności od systemu plików, mogą wystąpić błędy niewymienione poniżej.
Ogólne błędy chown() to:
Wersja 4.4BSD może być użyta jedynie przez superużytkownika (tj. zwykły użytkownik nie może oddawać plików).
POSIX.1-2008.
Przy tworzeniu nowego pliku (przez np. open(2) lub mkdir(2)), jego właścicielem staje się identyfikator użytkownika systemu plików tworzącego procesu. Grupa zależy od wielu czynników, w tym typu systemu plików, opcji użytych przy jego zamontowaniu oraz tego, czy dla jego katalogu ustawiono bit ustawienia ID grupy podczas wykonania (sgid). Jeśli system plików obsługuje opcje montowania mount(8): -o grpid (lub równoważnie -o bsdgroups) i -o nogrpid (lub równoważnie -o sysvgroups), to zasady są następujące:
Z aktualnością na jądro Linux 4.12, opcje montowania -o grpid i -o nogrpid są obsługiwane przez systemy plików ext2, ext3, ext4 i XFS. Systemy plików nieobsługujące tych opcji, przestrzegają reguł -o nogrpid.
Na starszych wersjach jądra Linux, gdzie fchownat() nie jest dostępne, funkcja opakowująca z glibc wraca do używania chown() i lchown(). Gdy pathname jest względną ścieżką, glibc konstruuje ścieżkę na bazie dowiązania symbolicznego w /proc/self/fd, które odpowiada argumentowi dirfd.
Semantyka chown() jest pogwałcona na systemach plików NFS, z włączonym mapowaniem UID. Dodatkowo, semantyka wszystkich wywołań systemowych, które uzyskują dostęp do zawartości plików jest dla NFS pogwałcona, bo chown() może spowodować natychmiastowe unieważnienie dostępu do już otwartych plików. Buforowanie po stronie klienta może spowodować opóźnienie możliwości uzyskania dostępu do pliku przez użytkowników innych stacji klienckich w stosunku do chwili dokonania zmiany właściciela umożliwiającej ten dostęp.
Oryginalne linuksowe wywołania systemowe chown(), fchown() i lchown() obsługiwały tylko 16-bitowe identyfikatory użytkownika i grupy. Następnie w Linuksie 2.4 dodano chown32(), fchown32() i lchown32(), obsługujące 32-bitowe identyfikatory. Funkcje opakowujące chown(), fchown() i lchown() z glibc obsługują te warianty wywołań w różnych wersjach jądra w sposób przezroczysty dla użytkownika.
Przed Linuksem 2.1.81 (z wyjątkiem 2.1.46) chown() nie podąża za dowiązaniami symbolicznymi. Od wersji 2.1.81 Linuksa chown() podąża za dowiązaniami symbolicznymi, została także dodana nowa funkcja systemowa lchown(), która nie podąża za dowiązaniami symbolicznymi. Od wersji 2.1.86 Linuksa, ta nowa funkcja (mająca taką samą semantykę jak stare chown() ma taki sam numer funkcji, a chown() otrzymała nowy numer.
Poniższy program zmienia właściciela pliku nazwanego w drugim argumencie wiersza poleceń na wartość podaną w pierwszych argumencie wiersza poleceń. Nowego właściciela pliku można podać albo za pomocą jego numerycznego identyfikatora użytkownika, albo jako nazwę użytkownika (konwertowaną do identyfikatora za pomocą getpwnam(3), aby wykonać zapytanie w systemowym pliku haseł).
#include <pwd.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.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 <owner> <file>\n", argv[0]);
exit(EXIT_FAILURE);
}
uid = strtol(argv[1], &endptr, 10); /* Akceptuje łańcuch numeryczny */
if (*endptr != '\0') { /* Nie był to łańcuch czysto numer. */
pwd = getpwnam(argv[1]); /* Próba uzyskania UID dla nazwy użytk. */
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);
}
chgrp(1), chown(1), chmod(2), flock(2), path_resolution(7), symlink(7)
Tłumaczenie niniejszej strony podręcznika: Przemek Borys <pborys@dione.ids.pl>, Andrzej Krzysztofowicz <ankry@green.mf.pg.gda.pl> i Michał Kułach <michal.kulach@gmail.com>
Niniejsze tłumaczenie jest wolną dokumentacją. Bliższe informacje o warunkach licencji można uzyskać zapoznając się z GNU General Public License w wersji 3 lub nowszej. Nie przyjmuje się ŻADNEJ ODPOWIEDZIALNOŚCI.
Błędy w tłumaczeniu strony podręcznika prosimy zgłaszać na adres listy dyskusyjnej manpages-pl-list@lists.sourceforge.net.
| 15 czerwca 2024 r. | Linux man-pages 6.9.1 |