리눅스 시스템을 관리하다 보면 특정 명령어가 어떤 설정 파일을 읽는지, 혹은 어떤 로그 파일을 참조하는지 궁금할 때가 있다.
소스 코드를 뒤져보지 않고도 이를 알아낼 수 있는 방법이 바로 strace를 활용하는 것이다.
1. 왜 strace를 사용하는가?
리눅스의 모든 프로세스는 파일을 열거나 네트워크를 사용하는 등 커널의 도움이 필요할 때 시스템 콜(System Call)을 호출한다.
strace는 이 신호를 가로채서 화면에 뿌려주는 도구다.
특히 "프로그램이 실행될 때 어떤 파일을 읽으려다 실패했는가?"를 찾는 트러블슈팅에 유용하다.
2. 2> /dev/stdout
strace를 단순히 실행하면 분석 내용이 너무 길어서 원하는 정보를 찾기 힘들다.
이때 다음과 같은 조합을 사용한다.
strace [명령어] 2> /dev/stdout | grep [키워드]
- 2> /dev/stdout: strace의 분석 결과는 표준 출력(stdout)이 아닌 표준 에러(stderr)로 나온다. 따라서 grep으로 필터링하기 위해서는 표준 에러(2)를 표준 출력(1)으로 리다이렉션해줘야 한다.
- grep [키워드]: 특정 파일 경로나 디렉터리명(예: var, etc, conf)을 필터링하여 보고 싶은 정보만 골라낸다.
| 구분 | 표준 출력 (stdout / 1) | 표준 에러 (stderr / 2) |
| 용도 | 프로그램의 실제 계산/작업 결과 | 에러 메시지, 진단 정보, 로그 |
| strace 내용 | (해당 없음) | 시스템 콜 호출 내역 및 인자 정보 |
| 장점 | 다음 프로그램의 입력으로 활용 가능 | 원본 데이터의 오염 없이 분석 가능 |
3. 명령어별 참조 파일 확인 예시
1️⃣ who 명령어 (현재 로그인 사용자 확인)
who 명령어는 시스템의 현재 로그인 정보를 담고 있는 utmp 파일을 참조한다.
$ strace who 2> /dev/stdout | grep var

- 결과 확인: openat(AT_FDCWD, "/var/run/utmp", ...)와 같은 라인이 출력된다. 이를 통해 who가 /var/run/utmp 파일을 열어 정보를 가져온다는 것을 알 수 있다.
- 파일 존재 여부 확인: 출력 결과 끝에 = -1 ENOENT가 붙어 있다면, "해당 경로에 파일이 없다"는 뜻이다. who 명령어가 여러 경로를 뒤지며 파일을 찾는 과정이다.
2️⃣ last 명령어 (접속 기록 확인)
과거 로그인 기록을 보여주는 last 명령어는 어떤 파일을 볼까?
$ strace last 2> /dev/stdout | grep var

- 결과 확인: /var/log/wtmp 파일을 참조하는 시스템 콜을 발견할 수 있다.
'Journey to Security > 리눅스' 카테고리의 다른 글
| 리눅스 파티션 분할로 서버 보안과 안정성 챙기기 (+Rocky Linux 9 파티션 분할 설치 방법) (0) | 2026.04.19 |
|---|---|
| passwd --stdin 옵션을 활용한 비밀번호 변경 자동화 (0) | 2026.03.26 |
| 압축/아카이브 관련 명령어 (0) | 2026.03.24 |
| 사용자/그룹/로그인 관련 명령어 (0) | 2026.03.19 |
| C 소스 패치파일 만들기 (0) | 2026.03.19 |