chmod(2) System Calls Manual chmod(2)

chmod, fchmod, fchmodat - zmienia prawa do pliku

Standardowa biblioteka C (libc-lc)

#include <sys/stat.h>
int chmod(const char *path, mode_t mode);
int fchmod(int fd, mode_t mode);
#include <fcntl.h>           /* Definicja stałych AT_* */
#include <sys/stat.h>
int fchmodat(int dirfd, const char *path, mode_t mode, int flags);
Wymagane ustawienia makr biblioteki glibc (patrz feature_test_macros(7)):
fchmod():
    Od glibc 2.24:
        _POSIX_C_SOURCE >= 199309L
    glibc 2.19 do glibc 2.23
        _POSIX_C_SOURCE
    glibc 2.16 do glibc 2.19:
        _BSD_SOURCE || _POSIX_C_SOURCE
    glibc 2.12 do glibc 2.16:
        _BSD_SOURCE || _XOPEN_SOURCE >= 500
            || _POSIX_C_SOURCE >= 200809L
    glibc 2.11 i wcześniejsze:
        _BSD_SOURCE || _XOPEN_SOURCE >= 500

fchmodat():

    Od glibc 2.10:
        _POSIX_C_SOURCE >= 200809L
    Przed glibc 2.10:
        _ATFILE_SOURCE

Wywołania systemowe chmod() oraz fchmod() modyfikują bity trybu pliku. (Tryb pliku składa się z bitów uprawnień do pliku plus set-user-ID, set-group-ID oraz bitu lepkości). Te wywołania systemowe różnią się tylko sposobem określenia pliku:

chmod() zmienia tryb określonego pliku, którego ścieżka jest podana w path, która jest rozwiązywana, jeśli jest to dowiązanie symboliczne.
fchmod() zmienia tryb pliku przypisanego do deskryptora otwartego pliku fd.

Tryb nowego pliku jest określony w mode, który jest maską bitową stworzoną jako suma logiczna (OR) zera lub więcej następujących:

set-user-ID (ustawia efektywny ID użytkownika procesu na execve(2))
set-group-ID (ustawia efektywny ID grupy na procesie na execve(2); obowiązkowe blokowanie, jak opisano w fcntl(2); bierze grupę nowego pliku z katalogu nadrzędnego, jak opisano w chown(2) i mkdir(2))
bit lepkości (flaga ograniczonego usuwania, jak opisano w unlink(2))
odczyt przez właściciela
zapis przez właściciela
wykonanie/wyszukiwanie przez właściciela („wyszukiwanie” dotyczy katalogów, oraz oznacza możliwość wejścia do katalogu)
odczyt przez grupę
zapis przez grupę
uruchomianie/przeszukiwanie przez grupę
odczyt przez pozostałych
zapis przez pozostałych
uruchomianie/przeszukiwanie przez pozostałych

Efektywny UID wywoływanego procesu musi zgadzać się z właścicielem pliku, lub proces musi być uprzywilejowany (Linux: musi mieć przywilej (ang. capability) CAP_FOWNER).

Jeśli wywołany proces nie jest uprzywilejowany (Linux: nie ma przywileju CAP_FSETID), oraz grupa pliku nie zgadza się z efektywnym ID grupy procesu lub jednej z jego dodatkowych ID grupy, S_ISGID zostanie wyłączony, lecz nie spowoduje to zwrócenia błędu.

Jako wyznacznik bezpieczeństwa, zależnie od systemu plików, bity SUID i SGID mogą zostać wyłączone podczas zapisywania pliku (na Linuksie, zdarza się to jeśli zapisujący proces nie ma przywileju CAP_FSETID). Na niektórych systemach plików, tylko superużytkownik może ustawić bit lepkości, który może mieć specjalne znaczenie. Znaczenie bitów lepkości, SUID i SGID dla katalogów opisano w inode(7).

Na systemach plików NFS, ograniczanie praw będzie miało natychmiastowy wpływ na aktualnie otwarte pliki, gdyż kontrola dostępu dokonywana jest na serwerze, a otwarte pliki obsługiwane są przez klienta. Rozszerzenie uprawnień może zostać udostępnione z opóźnieniem innym klientom, jeśli mają włączone buforowanie atrybutów.

Wywołanie systemowe fchmodat() operuje w dokładnie taki sam sposób jak chmod(), z wyjątkiem różnic opisanych tutaj.

Jeśli ścieżka path jest względna, wtedy jest ona interpretowana względem katalogu przypisanego przez deskryptor pliku dirfd (zamiast względem obecnego katalogu roboczego wywołanego procesu, tak jak dzieje się to w przypadku chmod() dla względnych ścieżek.

Jeśli path jest względna a dirfd ma wartość specjalną AT_FDCWD, to path jest interpretowana w odniesieniu do bieżącego katalogu roboczego procesu wywołującego (jak chmod()).

Jeśli ścieżka path jest bezwzględna, to dirfd jest ignorowane.

flags can either be 0, or include the following flags:

Jeśli path jest pustym łańcuchem, działa na pliku do którego odnosi się dirfd (który mógł być pozyskany za pomocą znacznika O_PATH open(2)). W tym przypadku dirfd może odnosić się do dowolnego typu pliku, a nie tylko katalogu. Jeśli dirfd wynosi AT_FDCWD, to wywołanie działa na bieżącym katalogu roboczym. Znacznik ten jest charakterystyczny dla Linuksa; należy zdefiniować _GNU_SOURCE, aby pozyskać jego definicję.
If path is a symbolic link, do not dereference it: instead operate on the link itself.

Potrzeba fchmodat() jest wyjaśniona w 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.

Powszechniejsze błędy fchmod są następujące:

Brak praw do przeszukiwania dla składowej ścieżki (zob. także path_resolution(7)).
(fchmod()) Deskryptor pliku fd jest nieprawidłowy.
(fchmodat()) path jest względna, lecz dirfd nie wynosi ani AT_FDCWD, ani nie jest prawidłowym deskryptorem pliku.
path wskazuje poza dostępną dla użytkownika przestrzeń adresową.
(fchmodat()) Podano nieprawidłowy znacznik w flags.
Wystąpił błąd wejścia/wyjścia.
Podczas rozwiązywania path napotkano zbyt wiele dowiązań symbolicznych.
path jest zbyt długie.
Plik nie istnieje.
Brak pamięci jądra.
Składowa ścieżki nie jest katalogiem.
(fchmodat()) path jest względna a dirfd jest deskryptorem pliku odnoszącym się do pliku zamiast do katalogu.
(fchmodat()) flags określono na AT_SYMLINK_NOFOLLOW, który nie jest obsługiwany.
Efektywny UID nie odpowiada właścicielowi pliku, a proces nie jest uprzywilejowany (Linux: nie ma przywileju CAP_FOWNER).
Plik jest oznaczony jako tylko do odczytu lub tylko do nadpisu (zob. również FS_IOC_SETFLAGS(2const)).
Podany plik znajduje się na systemie plików przeznaczonym tylko do odczytu.

Funkcja opakowująca fchmodat() z biblioteki GNU C implementuje określony w POSIX interfejs opisany na tej stronie. Ten interfejs różni się od zaszytego w Linuksie wywołania systemowego, które nie ma argumentu flags.

Na starszych wersjach jądra Linuxa gdzie fchmodat() nie było dostępne, funkcja opakowująca z glibc wraca do używania chmod(). Kiedy path jest względną ścieżką, glibc konstruuje ścieżkę na bazie dowiązania symbolicznego w /proc/self/fd, który odpowiada argumentowi dirfd.

POSIX.1-2008.

4.4BSD, SVr4, POSIX.1-2001.
POSIX.1-2008. Linux 2.6.16, glibc 2.4.
glibc 2.32, Linux 6.5.

chmod(1), chown(2), execve(2), open(2), stat(2), inode(7), 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.

28 czerwca 2025 r. Linux man-pages 6.15