table of contents
chmod(2) | System Calls Manual | chmod(2) |
NAZWA¶
chmod, fchmod, fchmodat - zmienia prawa do pliku
BIBLIOTEKA¶
Standardowa biblioteka C (libc, -lc)
SKŁADNIA¶
#include <sys/stat.h>
int chmod(const char *pathname, 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 *pathname, mode_t mode, int flags);
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
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 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 pathname, 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:
- 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 lepkości (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ć 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.
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ólną wartość AT_FDCWD, wtedy ścieżka jest interpretowana względnie do obecnego katalogu roboczego wywołanego procesu (jak w chmod()).
Jeśli ścieżka pathname jest bezwzględna, to dirfd jest ignorowane.
flags mogą być 0 lub zawierać następujące znaczniki:
- AT_SYMLINK_NOFOLLOW
- Jeśli pathname jest dowiązaniem symbolicznym, nie rozwiązuje go: w zamian operuje na samym dowiązaniu. Ten znacznik nie jest obecnie zaimplementowany.
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 ustawiane errno, wskazując błąd.
BŁĘDY¶
W zależności od systemu plików, mogą wystąpić błędy niewymienione poniżej.
Powszechniejsze błędy fchmod są następujące:
- EACCES
- Brak praw do przeszukiwania dla składowej ścieżki (zob. także path_resolution(7)).
- EBADF
- (fchmod()) Deskryptor pliku fd jest nieprawidłowy.
- EBADF
- (fchmodat()) pathname jest względne, lecz dirfd nie wynosi ani AT_FDCWD, ani nie jest prawidłowym deskryptorem pliku.
- EFAULT
- pathname wskazuje poza dostępną dla użytkownika przestrzeń adresową.
- EINVAL
- (fchmodat()) Podano nieprawidłowy znacznik w flags.
- EIO
- Wystąpił błąd wejścia/wyjścia.
- ELOOP
- Podczas rozwiązywania pathname napotkano zbyt wiele dowiązań symbolicznych.
- ENAMETOOLONG
- Ścieżka pathname jest zbyt długa.
- ENOENT
- Plik nie istnieje.
- ENOMEM
- Brak pamięci jądra.
- ENOTDIR
- Składowa ścieżki nie jest katalogiem.
- ENOTDIR
- (fchmodat()) pathname jest względna a dirfd jest deskryptorem pliku odnoszącym się do pliku zamiast do katalogu.
- ENOTSUP
- (fchmodat()) flags określono na AT_SYMLINK_NOFOLLOW, który nie jest obsługiwany.
- EPERM
- Efektywny UID nie odpowiada właścicielowi pliku, a proces nie jest uprzywilejowany (Linux: nie ma przywileju CAP_FOWNER).
- EPERM
- Plik jest oznaczony jako tylko do odczytu lub tylko do nadpisu (zob. również ioctl_iflags(2)).
- EROFS
- Podany plik znajduje się na systemie plików przeznaczonym tylko do odczytu.
WERSJE¶
Różnice biblioteki C/jądra¶
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.
Uwagi dla glibc¶
Na starszych wersjach jądra Linuxa gdzie fchmodat() nie było dostępne, funkcja opakowująca z glibc wraca do używania chmod(). Kiedy pathname jest względną ścieżką, glibc konstruuje ścieżkę na bazie dowiązania symbolicznego w /proc/self/fd, który odpowiada argumentowi dirfd.
STANDARDY¶
POSIX.1-2008.
HISTORIA¶
- chmod()
- fchmod()
- 4.4BSD, SVr4, POSIX.1-2001.
- fchmodat()
- POSIX.1-2008. Linux 2.6.16, glibc 2.4.
ZOBACZ TAKŻE¶
chmod(1), chown(2), execve(2), open(2), stat(2), inode(7), path_resolution(7), symlink(7)
TŁUMACZENIE¶
Autorami polskiego tłumaczenia niniejszej strony podręcznika są: 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.
2 maja 2024 r. | Linux man-pages (niewydane) |