chmod

CHMOD(2)                 Podręcznik programisty Linuksa                 CHMOD(2)



NAZWA
       chmod, fchmod, fchmodat - zmiana praw do pliku

SKŁADNIA
       #include <sys/stat.h>

       int chmod(const char *pathname, mode_t mode);
       int fchmod(int fd, mode_t mode);

       #include <fcntl.h>           /* Definition of AT_* constants */
       #include <sys/stat.h>

       int fchmodat(int dirfd, const char *pathname, 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 2.23
               _POSIX_C_SOURCE
           Glibc 2.16 do 2.19:
               _BSD_SOURCE || _POSIX_C_SOURCE
           Glibc 2.12 do 2.16:
               _BSD_SOURCE || _XOPEN_SOURCE >= 500 ||
                   _POSIX_C_SOURCE >= 200809L
           Glibc 2.11 oraz wcześniejsze:
               _BSD_SOURCE || _XOPEN_SOURCE >= 500

       fchmodat():
           Od glibc 2.10:
               _POSIX_C_SOURCE >= 200809L
           Przed glibc 2.10:
               _ATFILE_SOURCE

OPIS
       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 sticky bitu.) 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
         pathname, która jest rozwiązana, jeśli jest to link symboliczny.

       * fchmod() zmienia tryb pliku przypisanego do deskryptora otwartego pliku
         fd.

       Tryb nowego pliku jest określony w mode, który jest maską bitową
       stworzoną przez ORing łącznie zero lub więcej następujących:

       S_ISUID  (04000)  set-user-ID (ustawia efektywny ID użytkownika procesu
                         na execve(2))

       S_ISGID  (02000)  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))

       S_ISVTX  (01000)  bit sticky (flaga ograniczonego usuwania, jak opisano w
                         unlink(2))

       S_IRUSR  (00400)  odczyt przez właściciela

       S_IWUSR  (00200)  zapis przez właściciela

       S_IXUSR  (00100)  wykonanie/wyszukiwanie przez właściciela
                         ("wyszukiwanie" dotyczy katalogów, oraz oznacza
                         możliwość wejścia do katalogu)

       S_IRGRP  (00040)  odczyt przez grupę

       S_IWGRP  (00020)  zapis przez grupę

       S_IXGRP  (00010)  uruchomianie/przeszukiwanie przez grupę

       S_IROTH  (00004)  odczyt przez pozostałych

       S_IWOTH  (00002)  zapis przez pozostałych

       S_IXOTH  (00001)  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ć funkcjonalność
       CAP_FOWNER

       Jeśli wywołany proces nie jest uprzywilejowany (Linux: nie ma
       funkcjonalności 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 Linuxie, zdarza
       się to jeśli zapisujący proces nie ma funkcjonalności CAP_FSETID.) Na
       niektórych systemach plików, tylko superużytkownik może ustawić bit
       "sticky", który może mieć specjalne znaczenie. Znaczenie bitów "sticky",
       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 sa przez klienta. Rozszerzenie
       uprawnień może zostać udostępnione z opóźnieniem innym klientom, jeśli
       mają włączone buforowanie atrybutów.

   fchmodat()
       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 podana w ścieżka 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 ścieżka jest względna, a dirdf ma szczególna wartość AT_FDCWD,
       wtedy ścieżka jest interpretowana względnie do obecnego katalogu
       roboczego wywołanego procesu (jak w chmod()).

       Jeśli pathname jest bezwzględna, wtedy dirfd jest ignorowane.

       flags mogą być 0 lub zawierać następujące flagi:

       AT_SYMLINK_NOFOLLOW
              Jeśli pathname jest linkiem symbolicznym, nie rozwiązuje go: w
              zamian operuje na samym linku. Ta flaga nie jest obecnie
              zaimplementowana.

       Potrzeba fchmodat() jest wyjaśniona w openat(2)

WARTOŚĆ ZWRACANA
       Po pomyślnym zakończeniu zwracane jest zero. Po błędzie zwracane jest -1
       i odpowiednio ustawiane jest errno.

BŁĘDY
       W zależności od systemu plików, mogą wystąpić błędy nie wymienione
       poniżej.

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

       EACCES Brak praw do przeszukiwania dla składnika ścieżki. (Sprawdź
              również path_resolution(7).)

       EFAULT pathname wskazuje poza dostępną dla użytkownika przestrzeń
              adresową.

       EIO    Wystąpił błąd we/wy.

       ELOOP  Podczas rozwiązywania pathname napotkano zbyt wiele dowiązań
              symbolicznych.

       ENAMETOOLONG
              pathname jest zbyt długie.

       ENOENT Plik nie istnieje.

       ENOMEM Brak pamięci jądra.

       ENOTDIR
              Element składowy ścieżki nie jest katalogiem.

       EPERM  Efektywny UID nie odpoiwada właścicielowi pliku, a proces nie jest
              uprzywilejowany (Linux: nie ma funkcjonalności CAP_FOWNER).

       EPERM  Plik jest oznaczony jako tylko do odczytu lub tylko do nadpisu.
              (Sprawdź również ioctl_iflags(2).)

       EROFS  Podany plik znajduje się na systemie plików przeznaczonym tylko do
              odczytu.

       Ogólne błędy fchmod() to:

       EBADF  Deskryptor pliku fd jest nieprawidłowy.

       EIO    Zobacz wyżej.

       EPERM  Zobacz wyżej.

       EROFS  Zobacz wyżej.

       Błędy, które mogą wystąpić w chmod() mogą również wystąpić w fchmodat().
       Następujące dodatkowe błędy mogą wystąpić w fchmodat().

       EBADF  dirfd nie jest poprawnym deskryptorem pliku.

       EINVAL Niepoprawna flaga zdefiniowana w flags.

       ENOTDIR
              pathname jest względna, a dirfd jest deskryptorem pliku odnoszącym
              się do pliku nie będącego katalogiem.

       ENOTSUP
              flags określono na AT_SYMLINK_NOFOLLOW, który nie jest wspierany.

WERSJE
       fchmodat() został dodany do jądra Linuxa w wersji 2.6.16; wsparcie dla
       biblioteki zostało dodane do glibc w wersji 2.4.

ZGODNE Z
       chmod(), fchmod(): 4.4BSD, SVr4, POSIX.1-2001i, POSIX.1-2008.

       fchmodat(): POSIX.1-2008.

UWAGI
   Biblioteka C/Różnice w jądrze Linuxa
       Funkcja wrapper fchmodat() z biblioteki GNU C implementuje określony
       przez POSIX'a interfejs opisany na tej stronie. Ten interfejs różni się
       od zaszytego w Linuxie wywołania systemowego, które nie ma argumentu
       flags.

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

ZOBACZ TAKŻE
       chmod(1), chown(2), execve(2), open(2), stat(2), inode(7),
       path_resolution(7), symlink(7)

O STRONIE
       Angielska wersja tej strony pochodzi z wydania 5.08 projektu Linux
       man-pages. Opis projektu, informacje dotyczące zgłaszania błędów oraz
       najnowszą wersję oryginału można znaleźć pod adresem
       https://www.kernel.org/doc/man-pages/.


TŁUMACZENIE
       Autorami polskiego tłumaczenia niniejszej strony podręcznika są: Przemek
       Borys <pborys@dione.ids.pl> i Andrzej Krzysztofowicz
       <ankry@green.mf.pg.gda.pl>

       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
       <manpages-pl-list@lists.sourceforge.net>.



Linux                          15 września 2017 r.                      CHMOD(2)