-execdir 옵션을 사용하여 {} 및 +를 내부에서 어떻게 확장하나요?

-execdir 옵션을 사용하여 {} 및 +를 내부에서 어떻게 확장하나요?

find옵션이 있는 프로그램을 사용할 때 사람들이 가 디렉토리로, 가 파일 이름으로 대체될 것이라고 -execdir말하는 것을 본 적이 있지만 매뉴얼에는 이러한 기능이 무엇인지 나와 있지 않습니다. 이를 설명하는 공식 문서가 있습니까? 또한 상대 경로 또는 절대 경로로 확장되는지 알고 싶습니다. 및 을 매개변수로 사용하고 해당 내용을 별도의 파일에 저장하는 스크립트를 만들어 보았습니다 . 저는 두 개의 별도 매개변수로 전달될 것이라고 가정했고 이를 통해 각 매개변수가 어떻게 확장되는지 확인할 수 있었지만, 결과를 보면 단 하나의 매개변수만 스크립트에 전달되는 것처럼 보이므로 여전히 완전히 알 수는 없습니다. 이것이 무엇인지, 어떻게 확장되는지 스스로 증명해 보세요.{}+{}+

내가 실행하는 명령은 다음과 같습니다.find '/home/jesse/hacking/sh_sandbox' -type f -execdir /home/jesse/hacking/sh_sandbox/save_params.sh {} +

save_params.sh 스크립트는 다음 코드가 포함된 실행 가능한 셸 스크립트입니다.

echo $0 >> /home/jesse/hacking/sh_sandbox/zero_param.txt
echo $1 >> /home/jesse/hacking/sh_sandbox/first_param.txt
echo $2 >> /home/jesse/hacking/sh_sandbox/second_param.txt
echo $3 >> /home/jesse/hacking/sh_sandbox/third_param.txt

zero_param 텍스트 파일은 예상되는 실행 중인 스크립트의 이름으로 채워집니다. first_param.txt 파일이 ./filename다른 파일 이름으로 채워지고 있습니다. second_param 및 third_param 텍스트 파일은 모두 다른 파일과 동일한 줄 수의 빈 줄로 채워집니다. 이것이 바로 에 전달되는 두 번째 매개변수가 없다고 믿게 만드는 이유입니다 save_params.sh.

답변1

+은 끝 표시이며 {}현재 디렉토리가 경로인 파일 이름으로 대체됩니다.

그래서

  • $PWD=/home/jesse/hacking/sh_sandbox/
  • $0=/home/jesse/hacking/sh_sandbox/save_params.sh
  • $1=./zero_param.txt
  • $2=./first_param.txt
  • $3=./second_param.txt
  • $4=./third_param.txt

또는 그런 것 ... 질문을 다시 읽으면 find로 검색되는 디렉토리를 수정하기 위해 스크립트가 작성된 것 같으므로 실제로 일어나는 일은 더 복잡할 수 있습니다.

처음 실행하면 파일이 하나만 발견됩니다.

  • $PWD=/home/jesse/hacking/sh_sandbox/
  • $0=/home/jesse/hacking/sh_sandbox/save_params.sh
  • $1=./save_params.sh

그래서 파일은 이를 반영하는 콘텐츠로 생성됩니다.

답변2

find ... -execdir command {} +그런 일은 하지 않습니다.

명령을 실행하기 전에 먼저 디렉터리를 일치하는 파일이 있는 디렉터리로 변경한다는 find ... -exec점을 제외 하면 완전히 동일하게 작동합니다 .find

실행하고 man find(또는 GNU 찾기를 사용하는 경우 info find또는 pinfo find더 자세한 문서를 보려면) -execdir.

GNU find매뉴얼 페이지에서:

-execdir command ;

-execdir command {} +

와 유사 -exec하지만 지정된 명령은 일치하는 파일이 포함된 하위 디렉터리에서 실행됩니다. 이 하위 디렉터리는 일반적으로 찾기를 시작한 디렉터리가 아닙니다. 이는 일치하는 파일에 대한 경로를 확인하는 동안 경쟁 조건을 방지하므로 명령을 호출하는 훨씬 더 안전한 방법입니다.

-exec작업 과 마찬가지로 +형식은 -execdir일치하는 두 개 이상의 파일을 처리하는 명령줄을 작성하지만 특정 명령 호출은 동일한 하위 디렉터리에 존재하는 파일만 나열합니다.

이 옵션을 사용하는 경우 $PATH환경 변수가 .; 그렇지 않으면 공격자는 -execdir.

$PATH비어 있거나 절대 디렉토리 이름이 아닌 항목이 있는 경우에도 마찬가지입니다 . find에 오류가 발생하면 즉시 종료될 수 있으므로 보류 중인 일부 명령이 전혀 실행되지 않을 수 있습니다.

작업 결과는 + 또는 ; 변형이 사용되는지 여부에 따라 달라집니다. -execdir command {} +항상 true를 반환하고, -execdir command {} ;명령이 0을 반환하는 경우에만 true를 반환합니다.

매뉴얼 페이지 추출에서 언급되지 않더라도 쉘 명령줄이나 스크립트에서 실행되는 것처럼 ;이스케이프해야 합니다 . 그러면 쉘은 이를 명령 \;의 끝으로 해석하지 않습니다. 의 명령이 끝났음을 나타내기 위해 find에 인수로 전달됩니다 . 이스케이프할 필요는 없습니다 .findfind-exec+

관련 정보