간단한 문자열, 즉 "abc"의 sha256을 계산하려고 합니다. 나는 사용하여 발견했다샤256섬다음과 같은 유틸리티:
sha256sum file_with_string
다음과 같은 결과를 제공합니다.
sha256sum # enter, to read input from stdin
abc
^D
지금 바로:
edeaaff3f1774ad2888673770c6d64097e391bc362d7d6fb34982ddf0efd18cb
종료 신호가 입력되기 전에 또 다른 개행 문자가 표준 입력에 제공된다는 점에 유의하십시오.
처음에 나를 괴롭혔던 것은 온라인 체크섬 계산기를 사용하여 이를 확인하기로 결정했을 때 결과가 달랐다는 것입니다.
ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad
내 생각엔 이것이 내가 stdin에 입력한 두 번째 개행 문자와 관련이 있을 것 같습니다.그래서 이번에는 ^D를 두 번 삽입해 보았습니다(개행 문자 대신).결과는 다음과 같습니다.
abcba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad
물론 이는 형식이 잘못되었지만(개행 누락으로 인해), 그 외에는 위와 일치합니다.
나중에 나는 쉘의 입력 구문 분석에 대해 분명히 이해하지 못했다는 것을 깨달았습니다. 꼼꼼히 확인해보니 추가사항은 없습니다새로운 팀원래 지정한 파일에 있는데 왜 이런 문제가 발생합니까?
답변1
차이점은 개행 문자입니다. 먼저 abc
sha256sums의 합계를 수집합니다 abc\n
.
$ printf 'abc\n' | sha256sum
edeaaff3f1774ad2888673770c6d64097e391bc362d7d6fb34982ddf0efd18cb -
$ printf 'abc' | sha256sum
ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad -
따라서 ba...ad
합계는 문자열에 대한 abc
것이고 ed..cb
1은 에 대한 것입니다 abc\n
. 이제 파일에 출력이 표시되면 ed..cb
파일에 개행 문자가 있다는 의미입니다. 그리고 "텍스트 파일"을 고려하면필요하다후행 개행, 새 파일을 생성하면 대부분의 편집자가 파일을 추가합니다.
개행 없이 파일을 얻으려면 printf
위의 방법을 사용하십시오. file
파일에 개행 문자가 없으면 어떻게 경고가 표시되는지 확인하세요 .
$ printf 'abc' > file
$ file file
file: ASCII text, with no line terminators
그리고
$ printf 'abc\n' > file2
$ file file2
file2: ASCII text
지금:
$ sha256sum file file2
ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad file
edeaaff3f1774ad2888673770c6d64097e391bc362d7d6fb34982ddf0efd18cb file2
답변2
sha256sum # enter, to read input from stdin abc ^D
그래서
^D
이번에는 (새줄을 사용하는 대신) 두 번 삽입을 시도했습니다.
tty에서 ^D
( )를 누르면VEOF
정식 모드(모든 명령줄 창, xterm 등의 기본값), 터미널 드라이버("줄 규칙")는 개행 문자를 기다리지 않고 즉시 버퍼링된 데이터를 tty에서 읽는 프로세스에 사용할 수 있도록 만듭니다.
를 입력 하면 abc
, 뒤의 문자열이 읽혀지고 ( 즉, 다음으로 끝남) , 뒤의 빈 문자열(즉, 크기가 0인 콘텐츠가 읽혀짐)이 파일의 끝으로 해석됩니다.<newline>
^D
sha256sum
"abc\x0a"
LF
<newline>
""
^D
sha256sum
을 입력 abc
하면^D
두 배, 첫 번째 문자열 이후의 문자열을 읽고 sha256sum
두 번째 문자열 이후의 빈 문자열을 다시 읽습니다 ."abc"
^D
""
^D
따라서 전자의 경우 출력에 추가 개행 문자가 포함되고 체크섬이 sha256sum
달라집니다.
일반 파일의 경우, sha256sum
도달할 때까지 읽기가 계속됩니다.파일 끝, 여기서 위의 두 경우에만 읽기가 빈 문자열을 반환합니다. sha256
입력이 터미널인지, 파이프인지, 일반 파일인지 전혀 알 수 없는 상황도 비슷합니다 .