나는 스크립트를 작성하고 FILES=($S_DIR/$OPTIONS)
기본적으로 파일 배열을 생성하는 이와 같은 구조를 사용했습니다. 이와 같이: FILES=(/tmp/*/workspace/*zip)
.
스크립트가 700개의 파일/폴더에 대해 실행될 때까지는 이 방법이 제게는 잘 작동했습니다. 이 특정 라인을 호출하는 방법이 있나요 sudo
? 물론 find
또는 를 사용하여 ls
파일 목록을 가져올 수 있습니다. 하지만 이 접근 방식도 가능한지 알고 싶습니다. 감사해요!
편집하다:
Nagios에 대한 수표를 작성 중이며 폴더 내에서 지정된 유형의 모든 파일을 확인하고 싶습니다. 확인하려는 모든 파일에는 700 권한이 있으므로 사용자는 nagios
해당 파일을 읽을 수 없습니다. 그리고 배열은 FILES
바인딩되지 않습니다. 그리고 필수 파일 속성을 확인할 수 없습니다. 그래서 이나 FILES=($S_DIR/$OPTIONS)
같은 외부 유틸리티 없이 find
채울 수 있는 방법을 찾고 있어요 ls
. 내 스크립트는 사용자에게 권한이 있는 파일/폴더에서 작동합니다. 간단히 말해서, 스크립트에서 이 줄에 대한 권한을 높이면 됩니다.FILES=(/tmp/*/workspace/*zip)
답변1
FILES=blah
첫째, 아니요, 변수는 셸 내부에 있고 내보낸 변수는 하위 프로세스로 전파되는 동안 전파할 방법이 없기 때문에 이와 같은 할당을 다른 프로세스로 푸시할 수 없습니다.위로부모와 조상에게 드리는 과정입니다.
그러나 외부 명령을 실행하고 해당 출력을 배열로 선택할 수 있습니다. 파일 이름의 특수 문자에 대한 쉘 글롭만큼 안전하지는 않지만 bash는 특수 문자를 '\0'
구분 기호로 좋아하지 않는 것 같습니다. 개행 문자가 포함된 파일이 없으면 다음과 같이 작동합니다.
IFS=$'\n' # only split on newlines
FILES=( $(find ...) ) # or
FILES=( $(sudo find ...) )
그러나 높은 권한으로 파일 목록을 생성하면 나중에 목록에 있는 파일에 액세스하지 못할 수도 있습니다. 예를 들어 사용자가 액세스할 수 없는 디렉터리에 있는 경우 stat
액세스해도 아무런 효과가 없습니다.
어쨌든, 모든 일을 안전하게 수행하려면,매우sudo
제한된 명령 세트가 허용됩니다(스크립트를 실행하는 사용자의 경우). 그렇지 않으면 누군가가 변 sudo find
하거나 더 악화되는 것을 막을 수 있는 것이 없습니다 sudo find -delete
.