SHA256을 적용한 다음 Base64로 쉘 스크립트의 문자열을 인코딩하려고 합니다. PHP와 함께 작동하게 하기:
php -r 'echo base64_encode(hash("sha256", "asdasd", false));'
.하지만 저는 PHP에 대한 의존성을 없애려고 노력하고 있습니다.
다음 코드 줄은 터미널에서 정상적으로 실행됩니다( shell 사용 fish
).
$ echo -n "asdasd" | shasum -a 256 | cut -d " " -f 1 | xxd -r -p | base64
X9kkYl9qsWoZzJgHx8UGrhgTSQ5LpnX4Q9WhDguqzbg=
그러나 이를 쉘 스크립트에 넣으면 결과가 달라집니다.
$ cat foo.sh
#!/bin/sh
echo -n "asdasd" | shasum -a 256 | cut -d " " -f 1 | xxd -r -p | base64
$ ./foo.sh
IzoDcfWvzNTZi62OfVm7DBfYrU9WiSdNyZIQhb7vZ0w=
예상한 결과를 생성하려면 어떻게 해야 합니까? 내 생각엔 이것이 이진 문자열이 처리되는 방식 때문인 것 같습니다.
답변1
문제는 다른 쉘을 사용하고 있다는 것입니다. 이 echo
명령은 대부분의 쉘에 내장된 쉘이며 구현마다 다르게 작동합니다. 이제 기본 쉘은 다음과 같습니다 fish
. 따라서 이 명령을 실행하면 다음과 같습니다.
~> echo -n "asdasd" | shasum -a 256 | cut -d " " -f 1 | xxd -r -p | base64
X9kkYl9qsWoZzJgHx8UGrhgTSQ5LpnX4Q9WhDguqzbg=
위와 같이 출력이 표시됩니다. 이는 지원 echo
때문 입니다. 분명히 지원하지 않는 시스템 이 있습니다 . 이해하지 못하는 경우 실제로 인쇄되는 내용은 무엇입니까 ? 이를 설명하기 위해 다음을 사용하여 인쇄해 보겠습니다.fish
-n
/bin/sh
echo
-n
echo
-n
-n asdasd\n
printf
$ printf -- "-n asdasd\n"
-n asdasd
이제 이것을 파이프라인에 넣으면 다음과 같습니다.
$ printf -- "-n asdasd\n" | shasum -a 256 | cut -d " " -f 1 | xxd -r -p | base64
IzoDcfWvzNTZi62OfVm7DBfYrU9WiSdNyZIQhb7vZ0w=
이는 스크립트에서 얻은 출력입니다. 그래서 실제로 일어나는 일은 echo -n "asdasd"
그것이 인쇄된다는 것입니다.-n
그리고후행 개행 문자. 간단한 해결책은 printf
대신 사용하는 것입니다 echo
.
$ printf "asdasd" | shasum -a 256 | cut -d " " -f 1 | xxd -r -p | base64
X9kkYl9qsWoZzJgHx8UGrhgTSQ5LpnX4Q9WhDguqzbg=
위의 내용은 명령줄에서 스크립트에서와 동일하게 작동하며 시도하려는 모든 셸에서 작동해야 합니다. 또 다른 이유가 있습니다printf
비교하다echo
.