programing

bash에 임시 파일을 만드는 중입니다.

newsource 2023. 4. 25. 22:27

bash에 임시 파일을 만드는 중입니다.

bash 스크립트에서 임시 파일을 생성하는 데 객관적으로 더 나은 방법이 있습니까?

스크립트가 끝나면 삭제되기 때문에 보통 tempfile-123과 같이 생각나는 대로 이름을 붙입니다.현재 폴더에 있을 수 있는 tempfile-123을 덮어쓰는 것 말고 다른 단점이 있나요?아니면 임시 파일을 좀 더 신중하게 만들 수 있는 장점이 있나요?

mktemp(1)man page가 잘 설명해 줍니다.

일반적으로 많은 셸 스크립트는 pid가 있는 프로그램 이름을 접미사로 사용하여 임시 파일 이름으로 사용합니다.이러한 명명 방식은 예측 가능하고 공격자가 쉽게 이길 수 있는 경쟁 조건입니다.여전히 열등하지만 더 안전한 방법은 동일한 이름 지정 체계를 사용하여 임시 디렉토리를 만드는 것입니다.이렇게 하면 임시 파일이 전복되지 않도록 보장할 수 있지만 간단한 서비스 거부 공격이 가능합니다.이러한 이유로 대신 mktemp를 사용하는 것이 좋습니다.

스크립트에서, 나는 mktemp를 호출합니다.

mydir=$(mktemp -d "${TMPDIR:-/tmp/}$(basename $0).XXXXXXXXXXXX")

이렇게 하면 제가 작업할 수 있는 임시 디렉토리가 생성되고, 이 디렉토리에서 실제 파일에 읽기 쉽고 유용한 이름을 지정할 수 있습니다.

mktemp는 표준이 아니지만 많은 플랫폼에 존재합니다.일반적으로 "X"는 어느 정도 랜덤으로 변환되며, 더 많은 수가 랜덤으로 변환됩니다. 그러나 일부 시스템(비지박스 재)은 이 랜덤성을 다른 시스템보다 더 크게 제한합니다.


덧붙여서, 셸 스크립팅 그 이상을 위해서는 임시 파일을 안전하게 생성하는 것이 중요합니다.그래서 python에는 tempfile이 있고 perl에는 File:있습니다.Temp, Ruby에 Tempfile 등이 있습니다.

예, mktemp를 사용합니다.

임시 파일을 저장하도록 설계된 폴더 내에 임시 파일을 만들고 고유한 이름을 보장합니다.해당 파일의 이름을 출력합니다.

> mktemp
/tmp/tmp.xx4mM3ePQY
>

를 보는 게 좋을 겁니다.mktemp

mktemp 유틸리티는 지정된 파일 이름 템플릿을 가져와서 그 일부를 덮어쓰고 고유한 파일 이름을 만듭니다.템플릿은 /tmp/tfile과 같이 'Xs' 숫자가 추가된 임의의 파일 이름일 수 있습니다.XXXXXXXXXXXX입니다.후행 'X'는 현재 공정 번호와 임의 문자의 조합으로 대체됩니다.

자세한 내용은 man mktemp입니다.

임시 파일을 좀 더 신중하게 만들 수 있는 장점이 있습니까?

임시 파일은 일반적으로 임시 디렉터리에 생성됩니다(예:/tmp다른 모든 사용자와 프로세스가 읽기 및 쓰기 액세스 권한을 갖습니다(다른 스크립트는 새 파일을 생성할 수 있습니다). 스크립트는 올바른 사용 권한으로 파일을 하는 등의 작업에 주의해야 합니다(예: 소유자에 대한 읽기 전용, 참조).help umask및 파일 이름을 쉽게 추측할 수 없습니다(임의로 추측).그렇지 않으면 파일 이름이 고유하지 않으면 동일한 스크립트가 여러 번 실행되어 충돌이 발생하거나(예: 경쟁 조건), 일부 공격자가 일부 중요한 정보를 가로챌 수 있습니다(예:권한이 너무 열려 있고 파일 이름을 쉽게 추측할 수 있는 경우) 또는 파일을 자체 버전의 코드로 생성/교체합니다(저장되는 항목에 따라 명령 또는 SQL 쿼리 교체 등).


다음 방법을 사용하여 임시 디렉터리를 생성할 수 있습니다.

TMPDIR=".${0##*/}-$$" && mkdir -v "$TMPDIR"

또는 임시 파일:

TMPFILE=".${0##*/}-$$" && touch "$TMPFILE"

하지만 여전히 예측 가능하고 안전하다고 간주되지 않습니다.

★★★★★★★★★★★★★★★★★★man mktemp이렇게 말합니다.

일반적으로 많은 셸 스크립트는 pid가 있는 프로그램 이름을 접미사로 사용하여 임시 파일 이름으로 사용합니다.이러한 명명 방식은 예측 가능하고 공격자가 쉽게 이길 수 있는 경쟁 조건입니다.

그래서 안전을 위해, 그것을 사용하는 것이 좋습니다.mktemp고유한 임시 파일 또는 디렉터리를 만드는 입니다(예: 임시 파일 또는 디렉터리 생성).-d을 클릭합니다.

mktemp특히 한동안 파일을 사용할 계획이라면 이 기능이 가장 다양할 것입니다.

공정 대체 연산자를 사용할 수도 있습니다. <()다른 명령에 대한 입력으로만 파일이 일시적으로 필요한 경우, 예를 들어 다음과 같습니다.

$ diff <(echo hello world) <(echo foo bar)

기출문제를 조금 더 자세히 설명하자면, '기출문제'를 실행해 보겠습니다.mktemp 끝나고 청소하는 것도 잊지 마세요.보통 그렇게 하는 방법은 다음과 같습니다.trap스크립트가 중단될 때 실행할 수 있는 후크를 설정할 수 있습니다.

는 또한 Bash를 제공합니다.EXIT이렇게 해서 '가짜로 하다'를 설정할 수 있습니다.trap스크립트가 성공적으로 종료될 때 실행됩니다.ERR스크립트에서 오류가 발생할 경우 트리거됩니다(Bash 스크립트에서 set -e는 무엇을 의미합니까? 참조).몇 가지 눈에 띄지 않는 결과를 초래합니다.)

t=$(mktemp -d -p temporary.XXXXXXXXXXXX) || exit
trap 'rm -rf "$t"; exit' ERR EXIT  # HUP INT TERM

: # use "$t" to your heart's content ...

이 외에도 다른 신호를 설정하는 것이 좋을 수 있습니다.ERR그리고요.EXIT; 명백하게요,kill -9가둬둘 수 없습니다(이 때문에 비상 경우를 제외하고는 사용하지 않아야 합니다). HUP(으)와 (으)ㄴ(으)ㄴ(으)ㄹ 수 있다라고 합니다INT(신호 2)는 스크립트의 세션이 끊어지거나 사용자가 각각 Ctrl+C를 누를 때 생성됩니다. TERM(15번)은 (15번)에서 보내는 기본 신호입니다kill이겁니다.

mktemp -p교체합니다.mktemp -t구식이라고 여겨집니다.»는 다음과 같습니다.-d옵션을 선택하면 디렉토리를 만들 수 있습니다. 임시 파일이 하나만 필요한 경우에는 필요하지 않습니다.

의사들은 몇 가지 좋은 예시를 가지고 있어요.

임시 파일에 특정 접미사(파일 확장자)가 필요한 경우입니다.다음을 수행할 수 있습니다.

$ myfile=$(mktemp --suffix ".txt")
$ echo "$myfile"
/tmp/tmp.9T9soL2QNp.txt

파일 생성을 않고 이름만 원하는 추가로 파일을 사용할 수 있습니다.-u/--dry-runflag.manag.manager로 설정합니다.

$ myfile=$(mktemp -u --suffix ".txt")
$ echo "$myfile"
/tmp/tmp.Y8cMDJ1DDr.txt

참고하십시오.-u/--dry-run

이 명령어의 출력을 사용하여 새 파일을 만드는 것은 기본적으로 안전하지 않습니다. 이름을 생성하고 다른 프로세스에서 동일한 이름으로 개체를 생성할 수 있는 시간 간격이 있기 때문입니다.

언급URL : https://stackoverflow.com/questions/10982911/creating-temporary-files-in-bash 입니다.