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
에 인수로 전달됩니다 . 이스케이프할 필요는 없습니다 .find
find
-exec
+