스크립트가 있다고 가정 해 보겠습니다.remove.sh
rm -r "$1"
이 스크립트를 사용하여 폴더 내부의 콘텐츠만 삭제하고 다른 곳에서는 삭제하지 않기를 원합니다 ~/Desktop/A
.
따라서 실행하면 ./remove.sh ~/Desktop/A/file1
성공해야 하지만 실행하면 ./remove.sh ~/.bashrc
실패해야 합니다.
이 질문의 목적은 임의의 스크립트가 내 홈 디렉토리에서 무언가를 삭제하는 등 위험한 작업을 수행하는 것을 방지하는 것입니다.
답변1
이는 UNIX 파일 권한이 작동하는 방식이 아닙니다. 권한은 개별 프로그램이 아닌 사용자(또는 사용자 그룹)에게 부여됩니다(그렇지 않으면 제한 사항이 아니라 프로그램을 복제하기만 하면 되기 때문에 이는 의미가 있습니다).
따라서 프로그램을 실행할 수 있도록 새 사용자를 생성하여 수행하려는 작업을 피할 수 있습니다. 해당 사용자에게 폴더에 대한 권한(기존 UNIX 소유자/그룹 권한 또는 ACL 사용)을 부여합니다(다른 사람은 많지 않음). .
하지만 솔직히 말해서 거꾸로 문제를 해결하고 있는 것입니다. 다른 사용자로 스크립트를 시작하더라도 해당 사용자로 스크립트를 시작하지 않음으로써 금지를 다시 피할 수 있습니다.
특정 SELinux 컨텍스트 없이 링크 해제를 비활성화하기 위해 SELinux 모듈을 작성할 수 있지만, 위와 똑같은 이유로 복잡하고 쉽게 우회할 수 있습니다.
따라서 사용자가 프로그램을 시작하면 "...을 불가능하게 만듭니다."는 작동하지 않습니다.가지다물건을 삭제할 수 있는 권한입니다. 해결하려는 문제가 무엇이든 완전히 다른 아키텍처를 고려하고 싶을 수도 있습니다!
답변2
다음과 같이 구성할 수 있습니다.
#!/bin/bash
rm_selectively()
{
local path="$1"
local st=1
if [[ $path == ~/Desktop/A ]]; then
rm -r "$path"
st=$?
else
printf '%s\n' "You are trying to remove something else"
fi
return $st
}
main()
{
if (($# < 1)); then
printf '%s\n' "You need to provide a path"
else
rm_selectively "$1"
fi
}
main "$1"
실행 가능하게 만들고( .sh
스크립트에 아무 것도 추가하지 마세요) 실행하세요.
답변3
확인된 경로 매개변수가 다음에 포함된 경우에만 실행되도록 스크립트에 테스트를 포함할 수 있습니다 ~/desktop/A
.
realpath "$1" | grep -q '^'"$HOME"'/Desktop/A/' || exit 1
rm -r "$1"