Shell-Script
將 SHA256 和 Base64 應用於腳本中的字元串
我正在嘗試應用 SHA256,然後在 shell 腳本中對字元串進行 Base64 編碼。讓它與 PHP 一起工作:
php -r 'echo base64_encode(hash("sha256", "asdasd", false));'
. 但我試圖擺脫 PHP 依賴。得到在終端中執行良好的這條線(使用
fish
外殼):$ echo -n "asdasd" | shasum -a 256 | cut -d " " -f 1 | xxd -r -p | base64 X9kkYl9qsWoZzJgHx8UGrhgTSQ5LpnX4Q9WhDguqzbg=
但是當我把它放在一個 shell 腳本中時,結果會有所不同:
$ cat foo.sh #!/bin/sh echo -n "asdasd" | shasum -a 256 | cut -d " " -f 1 | xxd -r -p | base64 $ ./foo.sh IzoDcfWvzNTZi62OfVm7DBfYrU9WiSdNyZIQhb7vZ0w=
我怎樣才能讓它產生預期的結果?我的猜測是這是因為二進製字元串的處理方式?
問題是您使用的是不同的外殼。該
echo
命令是大多數 shell 的內置 shell,每個實現的行為都不同。現在,您說您的預設 shell 是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=
以上在命令行和腳本中的工作方式相同,並且應該在您想嘗試的任何 shell 上這樣做。還有一個
printf
比echo
.