access(2) - wariua/manpages-ko GitHub Wiki

NAME

access, faccessat - νŒŒμΌμ— λŒ€ν•œ μ‚¬μš©μžμ˜ κΆŒν•œ ν™•μΈν•˜κΈ°

SYNOPSIS

#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

DESCRIPTION

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

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)을 보라.

RETURN VALUE

성곡 μ‹œ (λͺ¨λ“  μš”μ²­ κΆŒν•œμ΄ ν—ˆκ°€λ¨, λ˜λŠ” modeκ°€ F_OK이고 파일이 μ‘΄μž¬ν•¨) 0을 λ°˜ν™˜ν•œλ‹€. 였λ₯˜ μ‹œ (κΆŒν•œμ„ λ¬»λŠ” mode의 λΉ„νŠΈ 쀑 μ΅œμ†Œ ν•˜λ‚˜κ°€ 거뢀됨, λ˜λŠ” modeκ°€ F_OK이고 파일이 μ‘΄μž¬ν•˜μ§€ μ•ŠμŒ, λ˜λŠ” μ–΄λ–€ λ‹€λ₯Έ 였λ₯˜ λ°œμƒ) -1을 λ°˜ν™˜ν•˜λ©° errnoλ₯Ό 적절히 μ„€μ •ν•œλ‹€.

ERRORS

λ‹€μŒ κ²½μš°μ— 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κ°€ 디렉터리 μ•„λ‹Œ νŒŒμΌμ„ κ°€λ¦¬ν‚€λŠ” 파일 λ””μŠ€ν¬λ¦½ν„°μ΄λ‹€.

VERSIONS

λ¦¬λˆ…μŠ€ 컀널 2.6.16μ—μ„œ faccessat()이 μΆ”κ°€λ˜μ—ˆλ‹€. glibc 버전 2.4μ—μ„œ 라이브러리 지원이 μΆ”κ°€λ˜μ—ˆλ‹€.

CONFORMING TO

access(): SVr4, 4.3BSD, POSIX.1-2001, POSIX.1-2008.

faccessat(): POSIX.1-2008.

NOTES

κ²½κ³ : 예λ₯Ό λ“€μ–΄ 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 λ§ˆμš΄νŠΈμ—λ„ λΉ„μŠ·ν•œ λ¬Έμ œκ°€ 생길 수 μžˆλ‹€.

C 라이브러리/컀널 차이

μ§„μ§œ faccessat() μ‹œμŠ€ν…œ ν˜ΈμΆœμ€ 처음 μ„Έ 인자만 λ°›λŠ”λ‹€. AT_EACCESS와 AT_SYMLINK_NOFOLLOW ν”Œλž˜κ·ΈλŠ” 사싀 faccessat()의 glibc 래퍼 ν•¨μˆ˜ μ•ˆμ— κ΅¬ν˜„λΌ μžˆλ‹€. κ·Έ ν”Œλž˜κ·Έλ“€ 쀑 ν•˜λ‚˜λΌλ„ μ§€μ •ν•œ κ²½μš°μ—λŠ” 래퍼 ν•¨μˆ˜μ—μ„œ fstatat(2)을 μ΄μš©ν•΄ μ ‘κ·Ό κΆŒν•œμ„ μ•Œμ•„λ‚Έλ‹€.

glibc μ°Έκ³  사항

faccessat()이 μ—†λŠ” ꡬ식 μ»€λ„μ—μ„œλŠ” (그리고 AT_EACCESS와 AT_SYMLINK_NOFOLLOW ν”Œλž˜κ·Έκ°€ 지정돼 μžˆμ§€ μ•Šμ„ λ•Œ) glibc 래퍼 ν•¨μˆ˜κ°€ access()λ₯Ό μ‚¬μš©ν•˜λŠ” 걸둜 ν›„ν‡΄ν•œλ‹€. pathname이 μƒλŒ€ 경둜λͺ…일 λ•Œ glibcμ—μ„œλŠ” /proc/self/fd μ•ˆμ˜ dirfd μΈμžμ— λŒ€μ‘ν•˜λŠ” 심볼릭 링크λ₯Ό κ°€μ§€κ³  경둜λͺ…을 λ§Œλ“ λ‹€.

BUGS

컀널 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 ν”Œλž˜κ·Έλ₯Ό μ‘΄μ€‘ν•œλ‹€.

SEE ALSO

chmod(2), chown(2), open(2), setgid(2), setuid(2), stat(2), euidaccess(3), credentials(7), path_resolution(7), symlink(7)


2016-03-15

⚠️ **GitHub.com Fallback** ⚠️