2008-09-16 4 views
109

임시 파일 용 쉘에서 고유 한 파일 이름을 얻는 한 가지 방법은 이중 달러 기호 ($$)를 사용하는 것입니다. 이것은 수시로 변화하는 숫자를 생성하지만, 반복적으로 호출하면 동일한 숫자를 반환합니다. (해결책은 단지 시간을 사용하는 것입니다.) 이 실제로 무엇인지, 그리고 그것이 고유 한 파일 이름을 생성하는 방법으로 제안되는 이유가 궁금합니다.

답변

69

Bash에서 $$은 프로세스 ID이므로 주석에 명시된 바와 같이 다양한 이유로 임시 파일 이름으로 사용하는 것이 안전하지 않습니다.

임시 파일 이름의 경우 mktemp 명령을 사용하십시오.

+33

는 $$ 공개적으로 쓰기 가능한 디렉토리에 쓰기 (예를 들어,/tmp를) 경우에도 하나의 파일에 대해 잘되지 않습니다. 심볼릭 링크로 쓰레기를 버리면 스크립트가 어딘가에 쓸 수 있습니다. mktemp가 훨씬 좋습니다. –

+4

예, $$을 (를) 사용하면 심한 보안 허점이 생깁니다. 하지 마. – emk

+2

충분한 인원이있는 사람이 답을 수정해야합니다 ... – dwestbrook

14

$$는 현재 프로세스의 ID입니다.

2

$$는 현재 쉘 프로세스의 PID입니다. 고유 한 파일 이름을 생성하는 것은 좋은 방법이 아닙니다.

1

bash 프로세스의 프로세스 ID입니다. 동시 프로세스에는 동일한 PID가 적용되지 않습니다.

6

UNIX와 유사한 운영 체제의 모든 프로세스는 (일시적으로) 고유 한 식별자 인 PID를가집니다. 동시에 실행되는 두 프로세스는 동일한 PID를 가질 수 없으며 $$는 스크립트를 실행하는 bash 인스턴스의 PID를 참조합니다.

이것은 대단히 이 아니며 결코 재사용되지 않는다는 점에서 고유 한 식별자입니다 (사실, PID는 계속 재사용됩니다). 다른 사람이 스크립트를 실행하면 자신의 스크립트가 실행되는 동안 다른 식별자를 얻게됩니다. 당신이 죽으면, PID는 재활용 될 수 있고, 다른 누군가는 당신의 스크립트를 실행하고, 동일한 PID를 얻고, 따라서 동일한 파일명을 얻을 수있다.

이와 같이 "$$은 다른 사람이 내 인스턴스가 여전히 실행중인 동일한 스크립트를 실행하면 다른 이름을 갖게되는 파일 이름을 제공합니다"라고 말하는 것이 정말로 제정신입니다.

1

$$는 스크립트가 실행중인 쉘의 프로세스 ID입니다. 자세한 내용은 sh 또는 bash의 man 페이지를 참조하십시오. 맨 페이지는 명령 줄 "man sh"을 사용하거나 웹에서 "shell man page"를 검색하여 찾을 수 있습니다

4

$$는 (는) 사용자의 PID입니다. 당신이 조심하고 아무도 정확히 같은 방식으로하지 않는 한 그것은 정말로 고유 한 파일 이름을 생성하지 않습니다.

일반적으로 당신은/tmp를/myprogramname $$ 같은 것을 만들 것

가이 휴식하는 많은 방법이있어, 당신은 위치에 작성하는 경우 다른 사람이 많은 너무 어렵지 않다에 쓸 수 있습니다 OS가 어떤 PID를 가지고 있을지 예측할 수 있습니다. 루트로 실행 중이고/tmp/yourprogname13395를/etc/passwd를 가리키는 심볼릭 링크로 생성한다고 가정하십시오.

이것은 셸 스크립트에서 수행하는 것은 나쁜 일입니다. 임시 파일을 무언가에 사용하려면 파일을 여는 (생성하는) "독점"플래그를 적어도 추가 할 수있는 더 나은 언어를 사용해야합니다. 그렇다면 당신은 뭔가 다른 것을 clobbering하지 않을 수 있습니다.

1

$$는 스크립트를 실행하는 쉘 인터프리터의 PID (프로세스 ID)입니다. 현재 시스템에서 실행중인 각 프로세스마다 다르지만, 시간이 지남에 따라 pid가 랩 어라운드하고 종료 한 후에 결국 동일한 pid를 가진 다른 프로세스가있게됩니다.너가 달리고있는 한, pid는 너에게 유일한 것이다.

위의 정의에서 스크립트에서 $$를 몇 번이나 사용하더라도 동일한 수를 반환한다는 것은 분명합니다.

예 : 매우 안정적이거나 안전 할 필요가없는 것들을 임시 파일로 /tmp/myscript.scratch.$$. 그것은 예를 들어, 사용, 스크립트의 끝에서 같은 임시 파일을 삭제하는 것이 좋습니다의, 트랩 명령

trap "echo 'Cleanup in progress'; rm -r $TMP_DIR" EXIT 
91

$$가 bash는 프로세스 ID (PID)입니다. $$을 사용하면 대개 경쟁 조건이 생기고 쉘 스크립트가 공격자에 의해 전복 될 수 있으므로 나쁜 생각입니다. 예를 들어 안전하지 않은 임시 파일을 생성하고 보안 권고를 발행해야하는 모든 these people을 참조하십시오.

대신 mktemp을 사용하십시오. Linux man page for mktemp은 우수합니다. 여기에 몇 가지 예제 코드가 있습니다 :

+3

감사합니다. 'mktemp' 옵션'-t'는 이제 더 이상 사용되지 않습니다 (char' -'의 문제 때문에 생각합니다). ** 요즘에는'mktemp $ {tempfoo} .XXXXXX'를 사용하십시오 **. 나는 당신의 게시물을 업데이 트하는 자유를 가져 가라. – Sebastian

+0

[backtick은 더 이상 사용되지 않습니다.] (http://pubs.opengroup.org/onlinepubs/9699919799/xrat/V4_xcu_chap02.html#tag_23_02_06_03), 대신'TMPFILE = $ (mktemp)'를 사용하십시오. –

1

두 번째 emk의 답을 나에게 보냅시다. "$"를 "고유"한 것으로 사용하지 마십시오. 파일의 경우, mktemp를 사용하십시오. 동일한 bash 스크립트 내의 다른 ID의 경우 은 합리적으로 고유성의 좋은 기회 일 경우 "$$$ (날짜 + % s % N)"을 사용하십시오.

-k 
0

또한,이 명령을 통해 로그인 사용자 이름을 잡을 수 있습니다. 예 : 바로 위에 답변을 보면 사람들의

echo $(</proc/$$/login id). After that, you need to use getent command. 
관련 문제