-execdir 옵션을 사용하여 find에서 {} 및 +를 확장하는 방법

-execdir 옵션을 사용하여 find에서 {} 및 +를 확장하는 방법

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 find 를 사용하는 경우 더 자세한 문서를 가져오고 info find) .pinfo find-execdir

GNU find매뉴얼 페이지에서:

-execdir command ;

-execdir command {} +

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

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

이 옵션을 사용하는 경우 $PATH환경 변수가 참조되지 않도록 해야 합니다 .. 그렇지 않으면 공격자가 실행할 디렉터리에 적절한 이름의 파일을 남겨두어 원하는 명령을 실행할 수 있습니다 -execdir.

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

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

맨페이지 발췌에는 언급되지 않더라도 쉘 명령줄이나 스크립트에서 실행하는 것처럼 이스케이프해야 셸이 명령의 끝으로 해석하지 않고 인수로 전달되도록 해야 합니다 ;. Finish 명령을 나타냅니다 . 탈출할 필요가 없습니다.\;findfindfind-exec+

관련 정보