Scroll to navigation

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.07 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>.

15 września 2017 r. Linux