md5sum은 체크섬 앞에 '\'를 붙입니다.


22

이름에 "\"가있는 파일의 체크섬을 찾을 때 md5sum이 체크섬 앞에 "\"를 추가하는 이유는 무엇입니까?

$ md5sum /tmp/test\\test
\d41d8cd98f00b204e9800998ecf8427e  /tmp/test\\test

다른 모든 유틸리티에도 동일하게 적용됩니다.


참고 로 GNU coreutils 의 다른 *sum유틸리티 ( md5sum예 : e, g sha1sum등과 같은 제품군 )는 동일합니다.
Kusalananda

유틸리티의 버전은 무엇입니까?md5sum --version
Kiwy

@Kusalananda 이것은 coreutils 버전에 따라 다를 수 있습니다. CentOS 7 cksum에서는 그렇지 않습니다. 예% cksum test\\test 3915528286 4 test\test
Stephen Harris

@StephenHarris 아마도cksum POSIX 유틸리티와 사양 때문일 것 입니다 . 그것을 허용하지 않습니다.
Kusalananda

답변:


33

이것은 Coreutils에 대해 문서화되어 있습니다md5sum .

파일 에 백 슬래시 나 줄 바꿈이 포함 된 경우 줄은 백 슬래시로 시작하고 파일 이름의 문제가있는 각 문자는 백 슬래시로 이스케이프되므로 임의의 파일 이름이 있더라도 출력이 명확하게 표시됩니다.

( 파일파일 내용 이 아니라 파일 이름입니다).

b2sum, sha1sum및 다양한 SHA-2 도구 는와 같은 방식으로 동작합니다 md5sum. sum그리고 cksum하지 않습니다; sum단지 이전 버전과의 호환성을 위해 제공됩니다 (그 조상 출력을 인용 생성하지 않는)하고 cksum있다 POSIX에 의해 지정된 출력의 유형을 허용하지 않습니다.

이 동작은 2015 년 11 월도입되었으며 버전 8.25 (2016 년 1 월)에서 다음 NEWS항목 과 함께 릴리스되었습니다 .

md5sum이제 줄의 시작 부분에 '\'를 사용하고 줄 바꿈을 '\ n'으로 바꾸어 표준 출력에서 ​​파일 당 한 줄씩 표시합니다. 이것은 또한 영향을 sha1sum, sha224sum, sha256sum, sha384sumsha512sum.

줄 시작 부분의 백 슬래시는 플래그 역할을합니다. 파일 이름의 이스케이프는 줄이 백 슬래시로 시작하는 경우에만 처리됩니다. (이스케이프 처리는 기본 동작이 될 수 없습니다 . 저장된 파일 이름을 포함 \\하거나 \n저장된 파일 이름 으로 이전 버전의 Coreutils에서 생성 된 합계를 깰 수 있습니다.)


30
man페이지에 문서화되어 있지 않은 것처럼 완전히 직관적이지 않은 것은 부끄러운 일입니다. (그렇습니다. GNU는 모든 사람들이 복잡한 info페이지를 대신
읽길

3
@msouth 줄 시작 부분의 백 슬래시는 파일 이름의 백 슬래시가 이스케이프임을 나타내는 플래그 역할을합니다. 그렇지 않으면 \n등을 리터럴 또는 이스케이프로 처리할지 여부를 알 수 없습니다 .
Stephen Kitt

3
@msouth 파일 이름의 시작 부분에 있으면 플래그인지 또는 실제로 백 슬래시로 시작하는 파일 이름인지 알 방법이 없습니다.
Stephen Kitt

1
@StephenKitt 나는 \가 명확성을 위해 있다고 생각하지 않습니다. 출력이 항상 백 슬래시와 개행을 이탈하는 것으로 문서화 된 경우 모호하지 않습니다 . 필요하지 않은 경우에는 탈출을 피할 필요가 없습니다. 물론 이것이 가치가 있는지 토론 할 수 있습니다 (개인적으로는 그렇지 않지만 나는 coreutils기고자 가 아닙니다 ).
TypeIA

1
문서의 문구 "파일 이름의 각 문제가있는 문자는 백 슬래시로 이스케이프됩니다"가 잘못되었습니다. 줄 바꿈을 바꾸는 것은 \n백 슬래시로 줄 바꿈을 이스케이프하는 것과 다릅니다!
ruakh

17

Stephen Kitt의 답변은 무엇을 다루고 있으며이 변경이 구현 된 이유 를 다루려고합니다 . 먼저 누군가 줄 바꿈 1을 포함하는 파일 이름으로 인해 결과가 모호 해질 수 있음을 관찰했습니다 . 예를 들어, 다음 출력을 고려하십시오.

d41d8cd98f00b204e9800998ecf8427e  foo
25af89c92254a806b2e93fffd8ac1814  bar

이 두 개의 파일 평균이되었다 하는가 foobar, 또는 그 파일 이름 만 하나 개의 파일은 "foo\n25af89c92254a806b2e93fffd8ac1814 bar"? 물론, 후자의 가능성은 거의 없지만 가능합니다. 모호성을 해결하기 위해 개발자는 백 슬래시 ( \)를 사용하여 줄 바꿈을 피하기로 결정했습니다 . 그러면 출력이 구별됩니다. 그러나 다음과 같은 추가 모호성이 있습니다.

764efa883dda1e11db47671c4a3bbd9e  foo\nbar

이 파일 이름에 줄 바꿈 또는 백 슬래시 뒤에 n? 가 포함되어 있습니까? 이 문제를 해결하려면 백 슬래시도 이스케이프 처리해야합니다.

764efa883dda1e11db47671c4a3bbd9e  foo\\nbar

마지막으로 파서 가 이스케이프가 수행되었는지 \\쉽게 감지 할 수 있도록 이러한 이스케이프가 포함 된 각 출력 행 앞에 추가하기 로 결정했습니다 . 아마도 이것은 구문 분석기가 이스케이프 버전 과 비 이스케이프 버전 (GNU 이외)의 출력을 처리 할 수 ​​있도록하기 위해 수행 된 것 입니다. 또한이 플래그는 필요하지 않은 경우 "비용이 많이 드는"탈출을 수행 할 필요가 없음을 의미합니다. 이 구문 분석 자체 의 예를 볼 수 있습니다 (링크 된 버전의 382 행).md5summd5sum.c


1 바이 개행 I 캐릭터 의미 \n때때로 구체적이라 바꿈 또는 LF를 ; 참조하십시오 md5sum.c.


1
물론 정상적인 동작은 개행을 포함하는 모든 파일 을 완전히 금지 하는 것입니다. 처리를 거부하십시오.
파이프

1
@pipe 그것은 미친 행동입니다. POSIX는 그러한 파일 이름을 허용하며 합법적 인 파일에 대한 작업을 의도적으로 거부하는 유틸리티는 나쁘고 화재로 죽여야합니다.
Ruslan

2
@Ruslan 요점은 그러한 반사회적 이름 을 허용 한 것에 대해 POSIX에 항의하는 것 입니다. 이러한 문자를 허용하면 이러한 특수한 경우를 처리하기 위해 많은 양의 보안 문제와 코드 팽창이 발생할 수 있습니다.
파이프

@pipe 파일 이름의 LF는 실제로 반사회적이지만 링크에 언급 된 다른 것들은 공백, 비 라틴 문자 등과 같이 훨씬 더 논쟁의 여지가 있습니다.
Ruslan

엔지니어에 의한 고전적인 오버 엔지니어링. 교훈 (아직 다시) : 엔지니어가 요구 사항을 추진하지 못하게하십시오. 그들은 가장 모호하고 복잡한 사건을 찾아 지배 사건으로 높이고 모든 사람을 혼란스럽게 할 것이다.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.