유닉스에서이 명령을 실행하면
echo -n "foo" | openssl dgst -sha1
이 출력을 얻을 수 있습니다 :
(stdin)= 0beec7b5ea3f0fdbc95d0dd47f3c5bc275da8a33
(개행 문자가 뒤 따름).
openssl이 (stdin)=
접두사를 표시 하지 않도록하고 후행 줄 바꿈을 피하려면 어떻게해야합니까?
답변
원시 이진 형식은 외부 출력을 추가하지 않습니다.
바이너리로 출력 한 다음 16 진수로 변환하십시오.
echo -n "foo" | openssl dgst -sha1 -binary | xxd -p
당신에게 이것을 줄 것입니다 :
0beec7b5ea3f0fdbc95d0dd47f3c5bc275da8a33
누군가가 텍스트 출력 형식을 다시 변경하기로 결정한 경우이 방법은 미래에 대비해야합니다. 파일 입력의 접두사와 일치하도록 접두어를 “SHA1 (stdin) =”로 수정합니다.
나는 그들이 이것을 바꾸 었다는 것을 믿을 수 없다! 몇 개의 스크립트가 깨 졌는지 궁금합니다.
답변
Ubuntu 11.10의 OpenSSL 1.0.0e 에서이 동작을 관찰하는 반면 OpenSSL 0.9.8k 및 0.9.8t는 해시 만 출력합니다. OpenSSL의 명령 줄은 유연하게 설계되지 않았으며 명령 줄에서 암호화 계산을 수행하는 더 빠르고 더러운 방법입니다.
OpenSSL을 사용하려면 출력을 필터링하십시오.
echo -n "foo" | openssl dgst -sha1 | sed 's/^.* //'
Linux (GNU 도구 또는 BusyBox와 함께) sha1sum
에서는 OpenSSL을 설치할 필요가없고 안정적인 출력 형식을 갖는를 사용할 수 있습니다 . 항상 파일 이름을 인쇄하므로 제거하십시오.
echo -n "foo" | sha1sum | sed 's/ .*//'
OSX를 포함한 BSD 시스템에서 sha1
.
echo -n "foo" | sha1 -q
이 모든 것은 체크섬을 16 진수로 출력 한 다음 줄 바꿈을 출력합니다. 유닉스 시스템의 텍스트는 항상 일련의 줄로 구성되며 각 줄은 줄 바꿈 문자로 끝납니다. 명령의 출력을 쉘 변수에 저장하면 최종 줄 바꿈이 제거됩니다.
digest=$(echo -n "foo" | openssl dgst -sha1 | sed 's/^.* //')
마지막 줄 바꿈이없는 체크섬이 필요한 프로그램에 입력을 파이프해야하는 경우 (실제로는 드물지만) 줄 바꿈을 제거하십시오.
echo -n "foo" | openssl dgst -sha1 | sed 's/^.* //' | tr -d '\n' | unusual_program
답변
다른 대안이 있습니다.
echo -n "foo" | openssl sha1 | awk '{print $2}'
답변
파이프, awk, sed, tr, cut 등 대신 bash 내장 기능을 사용하는 방법은 다음과 같습니다.
output="$(openssl sha1 <(printf foo))"; echo ${output/* }