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-run
flag.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 입니다.
'programing' 카테고리의 다른 글
원격 분기를 '연결'합니다. (0) | 2023.04.25 |
---|---|
Windows 10의 IIS 관리자입니다. (0) | 2023.04.25 |
태그에서 새 분기를 만들려면 어떻게 해야 합니까? (0) | 2023.04.25 |
여러 줄의 명령을 작성하는 방법은 무엇입니까? (0) | 2023.04.25 |
Eclipse CDT에서 C++11/C++0x 지원을 활성화하려면 어떻게 해야 합니까? (0) | 2023.04.25 |