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 명령을 나타냅니다 . 탈출할 필요가 없습니다.\;
find
find
find
-exec
+