안전하게 명령에 인수 전달

안전하게 명령에 인수 전달

이와 같은 작업을 수행하는 것은 좋지 않은 생각이라는 것은 잘 알려져 있습니다. <command> $FILENAME예를 -<option>들어 <command>해당 파일 -<option>토론, <command>다음과 같이 실행됩니다.옵션 -<option>.

그렇다면 이를 달성할 수 있는 보편적이고 안전한 방법이 있습니까? 한 가지 가정은 filename 앞에 추가하는 것이지만 --이것이 100% 안전한지 확실하지 않으며 이 옵션이 없는 명령이 있을 수 있습니다.

답변1

첫째, 항상 큰따옴표로 변수를 묶으십시오(이 규칙에는 예외가 있지만 때가 되면 쉽게 알아볼 수 있습니다). 공백 문자가 포함된 파일 이름의 위험은 빼기 기호로 시작하는 파일 이름보다 높습니다(아마도 더 높음).

따라서 첫 번째 명령은 다음과 같아야 합니다.

<command> "$FILENAME"

다음은 -<option>경우입니다. 문제를 훌륭하게 요약했습니다. 사용은 --괜찮지만 --모든 명령이 이 구문을 지원하지 않기 때문에 맹목적으로 명령에 추가할 수는 없습니다.

./file빼기 기호(또는 기타 민감한 문자)로 시작하는 파일 이름이 포함된 변수를 방지하는 완전히 안전한 방법은 파일 이름 앞에 상대 경로( ) 또는 절대 경로( ) 가 오도록 변경하는 것입니다 /foo/bar/file. 이렇게 하면 첫 번째 문자는 .또는 이므로 무해합니다 /.

$filename이 코드는 이미 절대 경로가 아닌 이상 상대 경로를 추가합니다 .

[[ "$filename" != /* ]] && filename="./$filename"

개인적으로 저는 쉘 스크립트에서 파일 매개변수를 표준 표현(전체 경로)으로 변경하는 것을 선호합니다.

filename="$(readlink -f -- "$filename")"

또는:

filename="$(realpath -m -- "$filename")"

(어떤 것을 사용해야 하는지 알고 싶다면 다음을 참조하세요 realpath.readlink이 훌륭한 답변)

관련 정보