access(2) - wariua/manpages-ko GitHub Wiki
access, faccessat - νμΌμ λν μ¬μ©μμ κΆν νμΈνκΈ°
#include <unistd.h>
int access(const char *pathname, int mode);
#include <fcntl.h> /* AT_* μμ μ μ */
#include <unistd.h>
int faccessat(int dirfd, const char *pathname, int mode, int flags);
glibc κΈ°λ₯ νμΈ λ§€ν¬λ‘ μ건 (feature_test_macros(7) μ°Έκ³ ):
-
faccessat()
: -
- glibc 2.10λΆν°:
_POSIX_C_SOURCE >= 200809L
- glibc 2.10 μ :
_ATFILE_SOURCE
access()
λ νΈμΆ νλ‘μΈμ€κ° νμΌ pathname
μ μ κ·Όν μ μλμ§ μ¬λΆλ₯Ό νμΈνλ€. pathname
μ΄ μ¬λ³Όλ¦ λ§ν¬μ΄λ©΄ μμ°Έμ‘°λ₯Ό νλ€.
mode
λ μνν μ κ·Ό κ°λ₯ κ²μ¬(λ€)μ λνλ΄λλ°, F_OK
κ°μ΄κ±°λ R_OK
, W_OK
, X_OK
μ€ νλ μ΄μμ λΉνΈ OR ν΄μ λ§λ λ§μ€ν¬μ΄λ€. F_OK
λ νμΌ μ‘΄μ¬ μ¬λΆλ₯Ό κ²μ¬νλ€. R_OK
, W_OK
, X_OK
λ νμΌμ΄ μ‘΄μ¬νλ©° κ°κ° μ½κΈ°, μ°κΈ°, μ€ν κΆνμ νκ°νλμ§ μ¬λΆλ₯Ό κ²μ¬νλ€.
νΈμΆ νλ‘μΈμ€μ μ€μ UID λ° GIDλ‘ κ²μ¬λ₯Ό μννλ€. μ¦ νμΌμ λν λμ(κ°λ Ή open(2))μ μ€μ μλν λμ²λΌ μ€ν¨ IDλ‘ νλ κ² μλλ€. λ§μ°¬κ°μ§λ‘ λ£¨νΈ μ¬μ©μμ λν΄ μ€ν¨ μλ₯ μ§ν©μ΄ μλλΌ νμ© μλ₯ μ§ν©μ κ²μ¬μ μ¬μ©νλ€. λ£¨νΈ μλ μ¬μ©μμ λν΄μ κ²μ¬μ λΉ μλ₯ μ§ν©μ μ΄λ€.
μ΄ λλ¬Έμ set-user-ID νλ‘κ·Έλ¨κ³Ό μλ₯μ λΆμ¬λ°μ νλ‘κ·Έλ¨μμ μκΈ°λ₯Ό νΈμΆν μ¬μ©μμ κΆνμ μ½κ² νλ¨ν μ μλ€. λ¬λ¦¬ λ§νμλ©΄ access()
λ "λ΄κ° μ΄ νμΌμ μ½μ/μΈ/μ€νν μ μλκ°?"λΌλ μ§λ¬Έμ λ΅νμ§ μλλ€. μ΄μ§ λ€λ₯Έ μ§λ¬Έ, μ¦ "(λ΄κ° setuid λ°μ΄λ리λΌκ³ νκ³ ) λλ₯Ό νΈμΆν μ¬μ©μκ° μ΄ νμΌμ μ½μ/μΈ/μ€νν μ μλκ°?"μ λ΅νλ€. κ·Έλμ set-user-ID νλ‘κ·Έλ¨μΈ κ²½μ°μ, μ
μμ μ¬μ©μκ° μ½μ μ μμ΄μΌ λλ νμΌμ μ½κ²λ λ§λλ κ±Έ λ§μ μ μκ² λλ€.
νΈμΆ νλ‘μΈμ€μκ² νΉκΆμ΄ μλ (μ¦ μ€μ¬ UIDκ° 0μΈ) κ²½μ°μλ μ κ· νμΌμ μμ μ, κ·Έλ£Ή, κΈ°ν μ€ μ΄λμλ μ€ν κΆνμ΄ μΌμ Έ μμΌλ©΄ κ·Έ νμΌμ λν X_OK
κ²μ¬κ° μ±κ³΅νλ€.
faccessat()
μμ€ν
νΈμΆμ μ¬κΈ° μ€λͺ
νλ μ°¨μ΄μ μ λΉΌλ©΄ access()
μ λκ°μ΄ λμνλ€.
pathname
μ μ€ κ²½λ‘λͺ
μ΄ μλ κ²½λ‘μ΄λ©΄ (μλ κ²½λ‘λͺ
μ λν΄ access()
μμ νλ― νΈμΆ νλ‘μΈμ€μ νμ¬ μμ
λλ ν°λ¦¬λ₯Ό κΈ°μ€μΌλ‘ νλ κ² μλλΌ) νμΌ λμ€ν¬λ¦½ν° dirfd
κ° κ°λ¦¬ν€λ λλ ν°λ¦¬λ₯Ό κΈ°μ€μΌλ‘ κ²½λ‘λͺ
μ ν΄μνλ€.
pathname
μ΄ μλ κ²½λ‘μ΄κ³ dirfd
κ° νΉμ κ° AT_FDCWD
μ΄λ©΄ (access()
μ²λΌ) νΈμΆ νλ‘μΈμ€μ νμ¬ μμ
λλ ν°λ¦¬λ₯Ό κΈ°μ€μΌλ‘ pathname
μ ν΄μνλ€.
pathname
μ΄ μ λ κ²½λ‘μ΄λ©΄ dirfd
λ₯Ό 무μνλ€.
flags
λ λ€μ κ°λ€μ 0κ° μ΄μ OR ν΄μ ꡬμ±νλ€.
AT_EACCESS
- μ€ν¨ μ¬μ©μ λ° κ·Έλ£Ή IDλ‘ μ κ·Ό κ²μ¬λ₯Ό μννλ€. κΈ°λ³Έμ μΌλ‘
faccessat()
μμλ (access()
μ²λΌ) μ€μ IDλ₯Ό μ¬μ©νλ€. AT_SYMLINK_NOFOLLOW
-
pathname
μ΄ μ¬λ³Όλ¦ λ§ν¬μΈ κ²½μ° μμ°Έμ‘°λ₯Ό νμ§ μλλ€. λμ λ§ν¬ μ체μ λν μ 보λ₯Ό λ°ννλ€.
faccessat()
μ νμμ±μ λν μ€λͺ
μ openat(2)μ 보λΌ.
μ±κ³΅ μ (λͺ¨λ μμ² κΆνμ΄ νκ°λ¨, λλ mode
κ° F_OK
μ΄κ³ νμΌμ΄ μ‘΄μ¬ν¨) 0μ λ°ννλ€. μ€λ₯ μ (κΆνμ 묻λ mode
μ λΉνΈ μ€ μ΅μ νλκ° κ±°λΆλ¨, λλ mode
κ° F_OK
μ΄κ³ νμΌμ΄ μ‘΄μ¬νμ§ μμ, λλ μ΄λ€ λ€λ₯Έ μ€λ₯ λ°μ) -1μ λ°ννλ©° errno
λ₯Ό μ μ ν μ€μ νλ€.
λ€μ κ²½μ°μ access()
μ faccessat()
μ΄ μ€ν¨νλ€.
EACCES
- μμ²ν μ κ·Όμ΄ νμΌμ λν΄μ κ±°λΆλ κ²μ΄λ€. λλ
pathname
μ κ²½λ‘ μ λλΆμ ν λλ ν°λ¦¬μ λν΄ νμ κΆνμ΄ κ±°λΆλμλ€. (path_resolution(7) μ°Έκ³ .) ELOOP
-
pathname
μ ν΄μνλ λμ λ무 λ§μ μ¬λ³Όλ¦ λ§ν¬λ₯Ό λ§λ¬λ€. ENAMETOOLONG
-
pathname
μ΄ λ무 κΈΈλ€. ENOENT
-
pathname
μ μ΄λ μμκ° μ‘΄μ¬νμ§ μκ±°λ κΉ¨μ§ μ¬λ³Όλ¦ λ§ν¬μ΄λ€. ENOTDIR
-
pathname
μμ λλ ν°λ¦¬λ‘ μ°μΈ μμκ° μ€μ λ‘λ λλ ν°λ¦¬κ° μλλ€. EROFS
- μ½κΈ° μ μ© νμΌ μμ€ν μμ νμΌμ μ°κΈ° κΆνμ μμ²νλ€.
λ€μ κ²½μ°μ access()
μ faccessat()
μ΄ μ€ν¨ν μλ μλ€.
EFAULT
-
pathname
μ΄ μ κ·Ό κ°λ₯ν μ£Όμ κ³΅κ° λ°μ κ°λ¦¬ν¨λ€. EINVAL
-
mode
λ₯Ό μλͺ» μ§μ νλ€. EIO
- I/O μ€λ₯κ° λ°μνλ€.
ENOMEM
- μ¬μ© κ°λ₯ν 컀λ λ©λͺ¨λ¦¬κ° μΆ©λΆνμ§ μλ€.
ETXTBSY
- μ€ν μ€μΈ μ€ν νμΌμ μ°κΈ° μ κ·Όμ μμ²νλ€.
faccessat()
μμ μΆκ°λ‘ λ€μ μ€λ₯κ° λ°μν μ μλ€.
EBADF
-
dirfd
κ° μ ν¨ν νμΌ λμ€ν¬λ¦½ν°κ° μλλ€. EINVAL
-
flags
μ μ ν¨νμ§ μμ νλκ·Έλ₯Ό μ§μ νλ€. ENOTDIR
-
pathname
μ΄ μλ κ²½λ‘μ΄κ³dirfd
κ° λλ ν°λ¦¬ μλ νμΌμ κ°λ¦¬ν€λ νμΌ λμ€ν¬λ¦½ν°μ΄λ€.
리λ
μ€ μ»€λ 2.6.16μμ faccessat()
μ΄ μΆκ°λμλ€. glibc λ²μ 2.4μμ λΌμ΄λΈλ¬λ¦¬ μ§μμ΄ μΆκ°λμλ€.
access()
: SVr4, 4.3BSD, POSIX.1-2001, POSIX.1-2008.
faccessat()
: POSIX.1-2008.
κ²½κ³ : μλ₯Ό λ€μ΄ open(2)μΌλ‘ μ€μ νμΌμ μ΄κΈ° μ μ μ΄ νΈμΆλ€μ μ¬μ©ν΄μ νμΌμ μ΄ κΆνμ΄ μ¬μ©μμκ² μλμ§ κ²μ¬νλ λ°©μμ 보μμμ ꡬλ©μ λ§λ λ€. κ²μ¬ μμ κ³Ό νμΌμ μ΄μ΄μ μ‘°μνλ μμ μ¬μ΄μ μ§§μ κ°κ²©μ μ¬μ©μκ° μ μ©ν μλ μκΈ° λλ¬Έμ΄λ€. κ·Έλ° μ΄μ λ‘ μ΄ μμ€ν νΈμΆ μ¬μ©μ νΌνλ κ² μ’λ€. (λ°©κΈ μμ ν μμμ μμ ν λμμ νλ‘μΈμ€μ μ€ν¨ μ¬μ©μ IDλ₯Ό μ€μ IDλ‘ μ μ μ ννκ³ μ open(2)μ νΈμΆνλ κ²μ΄λ€.)
access()
λ νμ μ¬λ³Όλ¦ λ§ν¬λ₯Ό μμ°Έμ‘°νλ€. μ¬λ³Όλ¦ λ§ν¬μ λν΄ κΆνμ κ²μ¬ν΄μΌ νλ©΄ faccessat()
λ₯Ό AT_SYMLINK_NOFOLLOW
νλκ·Έλ‘ μ¬μ©νλ©΄ λλ€.
μ΄ νΈμΆλ€μ mode
μ μ κ·Ό λ°©μλ€ μ€ νλλΌλ κ±°λΆλλ©΄ mode
μ λλ¨Έμ§ μ κ·Ό λ°©μ μΌλΆκ° νμ©λλ κ²½μ°λΌλ μ€λ₯λ₯Ό λ°ννλ€.
νΈμΆ νλ‘μΈμ€μκ² μ μ ν νΉκΆμ΄ μλ κ²½μ°μ (μ¦ μνΌμ μ μΈ κ²½μ°) POSIX.1-2001μμλ μ€ν κΆν λΉνΈκ° μ ν μ€μ λΌ μμ§ μλλΌλ ꡬνμμ X_OK
κ²μ¬μ λν΄ μ±κ³΅μ νμνλ κ±Έ νμ©νλ€. 리λ
μ€μμλ κ·Έλ κ² νμ§ μλλ€.
pathname
κ²½λ‘ μ λλΆμ λλ ν°λ¦¬ κ°κ°μ λν΄ κΆνμ΄ νμ(μ¦ μ€ν) μ κ·Όμ νκ°νλ κ²½μ°μλ§ κ·Έ νμΌμ΄ μ κ·Ό κ°λ₯νλ€. ν λλ ν°λ¦¬λΌλ μ κ·Ό λΆκ°λ₯μ΄λ©΄ νμΌ μ체μ λν κΆνμ μκ΄μμ΄ access()
νΈμΆμ΄ μ€ν¨νλ€.
μ κ·Ό λΉνΈλ§ νμΈν λΏ νμΌ μ’ λ₯λ λ΄μ©μ λ³΄μ§ μλλ€. λ°λΌμ λλ ν°λ¦¬κ° μ°κΈ° κ°λ₯νλ€κ³ λμ¨λ€λ©΄ 그건 κ·Έ λλ ν°λ¦¬μ νμΌμ λ§λ€ μ μλ€λ λ»μ΄μ§ νμΌμ²λΌ κ·Έ λλ ν°λ¦¬μ λκ°λ₯Ό κΈ°λ‘ν μ μλ€λ λ»μ μλ κ²μ΄λ€. λ§μ°¬κ°μ§λ‘ DOS νμΌμ΄ "μ€ν κ°λ₯"μ΄λΌκ³ λμ¬ μ μμ§λ§ κ·Έλλ execve(2) νΈμΆμ μ€ν¨νκ² λλ€.
μ΄ νΈμΆλ€μ UID λ§€νμ΄ μΌμ§ NFSv2 νμΌ μμ€ν μμλ μ¬λ°λ‘ λμνμ§ μμ μλ μλ€. UID λ§€νμ΄ μλ²μμ μ΄λ€μ§λ©° κΆνμ κ²μ¬νλ ν΄λΌμ΄μΈνΈμκ²λ κ°μΆ°μ Έ μκΈ° λλ¬Έμ΄λ€. (NFS λ²μ 3 λ° μ΄νμμλ μλ²μμ κ²μ¬λ₯Ό μννλ€.) FUSE λ§μ΄νΈμλ λΉμ·ν λ¬Έμ κ° μκΈΈ μ μλ€.
μ§μ§ faccessat()
μμ€ν
νΈμΆμ μ²μ μΈ μΈμλ§ λ°λλ€. AT_EACCESS
μ AT_SYMLINK_NOFOLLOW
νλκ·Έλ μ¬μ€ faccessat()
μ glibc λνΌ ν¨μ μμ ꡬνλΌ μλ€. κ·Έ νλκ·Έλ€ μ€ νλλΌλ μ§μ ν κ²½μ°μλ λνΌ ν¨μμμ fstatat(2)μ μ΄μ©ν΄ μ κ·Ό κΆνμ μμλΈλ€.
faccessat()
μ΄ μλ ꡬμ 컀λμμλ (κ·Έλ¦¬κ³ AT_EACCESS
μ AT_SYMLINK_NOFOLLOW
νλκ·Έκ° μ§μ λΌ μμ§ μμ λ) glibc λνΌ ν¨μκ° access()
λ₯Ό μ¬μ©νλ κ±Έλ‘ νν΄νλ€. pathname
μ΄ μλ κ²½λ‘λͺ
μΌ λ glibcμμλ /proc/self/fd
μμ dirfd
μΈμμ λμνλ μ¬λ³Όλ¦ λ§ν¬λ₯Ό κ°μ§κ³ κ²½λ‘λͺ
μ λ§λ λ€.
컀λ 2.4(λ° μ΄μ )μλ μνΌμ μ μ λν X_OK
κ²μ¬ μ²λ¦¬μ μ’ μ΄μν μ μ΄ μλ€. λλ ν°λ¦¬ μλ νμΌμμ λͺ¨λ λΆλ¬Έμ μ€ν κΆνμ΄ κΊΌμ Έ μλ κ²½μ°μ access()
κ²μ¬κ° -1μ λ°ννλ 건 mode
μ X_OK
λ§ μ§μ λΌ μμ λμ΄λ€. mode
μ R_OK
λ W_OK
λ μ§μ λΌ μμΌλ©΄ κ·Έλ° νμΌμ λν΄ access()
κ° 0μ λ°ννλ€. 2.6 μ΄κΈ° (2.6.3κΉμ§μ) 컀λλ€λ 컀λ 2.4μ κ°μ μμΌλ‘ λμνλ€.
컀λ 2.6.20 μ μμλ κΈ°λ° νμΌ μμ€ν
μ mount(2) ν λ MS_NOEXEC
νλκ·Έλ₯Ό μ¬μ©ν κ²½μ° μ΄ νΈμΆλ€μμ κ·Έ νλκ·Έμ ν¨κ³Όλ₯Ό 무μνλ€. 컀λ 2.6.20λΆν°λ MS_NOEXEC
νλκ·Έλ₯Ό μ‘΄μ€νλ€.
chmod(2), chown(2), open(2), setgid(2), setuid(2), stat(2), euidaccess(3), credentials(7), path_resolution(7), symlink(7)
2016-03-15