쉘 스크립트의 파일 처리 견고성을 테스트하는 방법은 무엇입니까?

쉘 스크립트의 파일 처리 견고성을 테스트하는 방법은 무엇입니까?

나는 일부 "일반" 파일 이름을 처리하는 쉘 스크립트를 작성했지만 다음 내용을 읽었습니다.공백이나 기타 특수 문자 때문에 쉘 스크립트가 멈추는 이유는 무엇입니까?그리고ls의 출력을 구문 분석하면 안되는 이유나는 그것이 더 강력하고 유효한 파일 이름(및/또는 디렉토리 이름)을 처리하기를 원합니다. 스크립트를 실행하기 위해 파일 및 디렉터리의 테스트벤치를 어떻게 생성합니까?

답변1

재생할 별도의 디렉토리를 만듭니다(주로 나중에 쉽게 정리할 수 있도록). $TMPDIR설정한 경우 값을 사용하고, 그렇지 않으면 다음을 수행합니다 /tmp.

mkdir "${TMPDIR-/tmp}/testing"
cd "${TMPDIR-/tmp}/testing"

공백(공백, 탭, 줄 바꿈, 캐리지 리턴, 백스페이스)으로 인해 서로 유사하게 나타나는 별도의 파일을 만듭니다.

touch -- a b 'a ' 'b ' 'a b' 'a  b' $'a\bb'
touch -- a$'\xe2\x80\x82'b a$'\xe2\x80\x83'b a$'\t'b a$'\n'b a$'\r'b

위의 내용은 다음과 같습니다.패트릭. 두 개의 16진수 코드는 UTF-8 공백 구분 기호입니다.너트그리고양고기; "양방향 컨텍스트에서는 공백 역할을 하며 미러링되지 않습니다. 어떤 경우에는 이 문자가 20개의 다른 문자와 혼동될 수 있습니다."

일반 파일과 glob으로 처리되는 경우 첫 번째 파일로 확장될 파일을 만듭니다.

touch -- x '[x]' 

위의 내용은 다음과 같습니다.이런 Q. 웸블리.

이와 유사합니다:

touch -- 'a?b' 'a*b'

위의 내용은 다음과 같습니다.데이브 톰슨_085여기 댓글에.

touch -- foo\`echo\ malicious\`bar

위의 내용은 다음과 같습니다.셴케.

쉘 컨텍스트에서 평가되면 파일 이름은 다른 이름으로 확장됩니다(잠재적으로 임의 실행 가능!).

touch '$( echo boom )'

사용:

touch -- single\'quote double\"quote back\\slash

Catch는 따옴표를 이스케이프 처리하지 않고 따옴표 안에 파일 이름을 넣으려고 시도합니다.

touch -- -a -b -c -r -R - a=x

위의 내용은 다음과 같습니다.스티븐 차제라스.

명명된 파이프와 심볼릭 링크를 만듭니다(비"일반" 파일을 만들기 위해):

mkfifo fifo
ln -s a alink

이름에 다양한 공백이 포함된 하위 디렉터리와 그 안에 토큰 파일을 만듭니다.

mkdir subdir "subdir 1" "subdir 2" "subdir 3 " subdir$'\n'4
touch subdir/file0 "subdir 1"/file1 "subdir 2"/file2 "subdir 3 "/file3 subdir$'\n'4/file4

*(일반!) 공백, 데드 심볼릭 링크, 자체적으로 반복되는 심볼릭 링크 및 상위 디렉토리로 돌아가는 링크만 포함하는(제거하는 것이 문제가 될 수 있음) 파일 이름만 포함하는 하위 디렉토리를 만듭니다 .

touch -- '*' '**' '***' ' '

ln -s /does/not/exist dead

ln -s loop loop

mkdir subdir_with_link
(cd subdir_with_link && ln -s .. parent)

더 많은 기타 파일 이름. 마지막 두 개는 "십진수 슬래시"와 "나누기 슬래시"에 대한 유니코드입니다.

touch -- '(' '!' '!!'  $'\xe2\x81\x84' $'\xe2\x88\x95'

아이디어는 다음에서 나온다스콧:

touch -- '-' '--' ';' '&' '|' '<' '>' '$' ')' '{' '}' = \\ '!' '#' '{a,b}'

어떤 영역에서는 무해하지만 다른 영역에서는 위험한 캐릭터:

touch $'X\xa0Y' # non-breaking space in iso8859-1 which is considered
                # "blank" and "space" in some locales

touch $'\xa3\x5c' $'\xa3\x60' # α and ε in BIG5 or BIG5-HKSCS charset, but
                              # �\ and �` in ASCII

일부 로케일에서 동일한 문자를 정렬합니다.

touch ① ② # sorts the same in GNU locales, order non-deterministic.

glob을 이스케이프하는 파일 .[!.]* *(때때로 숨겨진 파일과 숨겨지지 않은 파일을 확장하는 데 사용됨):

touch ..foo ...

관련 정보