Tutoriel Linux

Mktemp 리눅스: 안전한 임시 파일 만들기

Débutant2 min de lecture

/tmp/rapport.txt에 쓰는 스크립트는 문제를 일으킬 수 있습니다: 다른 실행이 이미 이 이름을 사용할 수 있으며, 로컬 사용자가 대신 심볼릭 링크를 준비할 수 있습니다. mktemp는 예측할 수 없는 이름으로 파일이나 디렉토리를 생성하고 즉시 스크립트에 예약합니다.

중간 출력을 위해 임시 파일을 사용하고, 이후 trap으로 정리하세요. 이렇게 하면 스크립트가 오류나 중단이 있더라도 자신의 디렉토리를 깨끗하게 유지할 수 있습니다.

리눅스 환경에서의 안전한 임시 디렉토리
스크립트를 위해 생성된 후 깨끗하게 정리된 임시 디렉토리.

$$로 이름을 만들지 마세요

이 오래된 습관은 여전히 위험합니다:

tmp="/tmp/rapport-$$.txt"
echo "결과" > "$tmp"

PID는 이름을 비밀로 만들지 않으며 파일은 계산할 때 생성되지 않습니다. 경로를 구축하고 쓰기 사이에 다른 프로세스가 이 이름을 차지할 수 있습니다. mktemp는 경로를 반환하기 전에 객체를 생성합니다.

tmp_file=$(mktemp -p "${TMPDIR:-/tmp}" rapport.XXXXXX) || exit 1
printf '%sn' "결과" > "$tmp_file"

템플릿은 마지막 구성 요소에 최소한 세 개의 X가 연속적으로 포함되어야 합니다. 문자는 생성 될 때 대체됩니다. 변수 주변에 항상 따옴표를 유지하세요: TMPDIR는 공백을 포함할 수 있습니다.

여러 파일을 위한 임시 디렉토리 만들기

임시 디렉토리는 /tmp에 여러 파일을 분산시키는 것을 방지합니다. 이는 준비할 아카이브, 변환 또는 중간 파일을 생성하는 보고서에 유용합니다.

workdir=$(mktemp -d -p "${TMPDIR:-/tmp}" sauvegarde.XXXXXX) || exit 1
printf '%sn' "데이터" > "$workdir/liste.txt"
tar -czf "$workdir/rapport.tar.gz" "$workdir/liste.txt"

대부분의 시스템은 이 디렉토리를 귀하의 계정에 대한 권한으로 생성합니다. 스크립트가 중요한 데이터를 포함한 키, 내보내기 또는 아카이브를 조작할 때 확인하세요:

stat -c '%a %U:%G %n' "$workdir"
ls -la "$workdir"

잘못된 경로를 지우지 않고 trap으로 정리하기

디렉토리 생성 직후에 정리 함수를 정의하세요. 변수가 존재하고 예상된 디렉토리를 가리키는지 테스트한 후 rm -rf를 호출하세요.

workdir=$(mktemp -d -p "${TMPDIR:-/tmp}" mon-script.XXXXXX) || exit 1
cleanup() {
  [ -n "${workdir:-}" ] && [ -d "$workdir" ] && rm -rf -- "$workdir"
}
trap cleanup EXIT HUP INT TERM

# 여기서 스크립트 처리

trap ... EXIT는 쉘이 종료될 때 정리를 시작합니다. HUP, INTTERM 신호는 일반적인 중단을 담당합니다. kill -9로 강제 종료하면 쉘이 이 함수를 실행할 시간을 주지 않으므로, 큰 처리 작업을 위한 제어 정리도 미리 계획해야 합니다.

  • mktemp로 경로를 생성하고, 절대 날짜나 $$로 생성하지 마세요;
  • 스크립트가 여러 파일을 생성할 경우 mktemp -d를 사용하세요;
  • 스크립트에 의해 생성되고 확인된 변수만 삭제하세요;
  • 실패 진단이 필요하다면 임시 파일을 보관한 후 분석 후 삭제하세요.

Bash 이력에 관한 가이드는 명령줄에서 입력된 비밀번호가 ~/.bash_history에 남지 않도록 도와줍니다. 최종 결과를 보관하려면 리눅스에서 tar 아카이브 생성 및 추출하기도 참고하세요.

sudo apt update && sudo apt upgrade