Shell-Script

將 SHA256 和 Base64 應用於腳本中的字元串

  • January 8, 2017

我正在嘗試應用 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=

您將獲得如上所示的輸出。這是因為echofish支持-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 上這樣做。還有一個printfecho.

引用自:https://unix.stackexchange.com/questions/248291