題 如何通過命令行對base64進行編碼?


在Mac OS X中是否有一個終端命令將base64編碼文件或stdin?


167
2018-03-16 23:15


起源


請注意,儘管base64編碼語法在一個OS與另一個OS之間是一致的,但base64解碼語法也是如此 base64 -d 要么 base64 -D 取決於您的操作系統。 OSX使用 -D。 - Chris Johnson
@ChrisJohnson如果與之合作使用 openssl 解碼的標誌是 -d 在OS X(10.10優勝美地)。 - ᴠɪɴᴄᴇɴᴛ


答案:


openssl 可以為你做這個,默認情況下都安裝了OS X.無需安裝darwinports。

$ openssl base64 -in <infile> -out <outfile>

沒有 -in 選項從標準輸入讀取


185
2018-03-17 00:25



使用 openssl base64 < path/to/file.png | tr -d '\n' | pbcopy 要么 cat path/to/file.png | openssl base64 | tr -d '\n' | pbcopy 跳過寫入文件只是將base64編碼的輸出複製到剪貼板而沒有換行符。 - Mathias Bynens
並使用一個 -d 要解碼的標誌。 - kenny
在mac中,要對base64編碼一個字符串: openssl base64 -e <<< ram 並解碼: openssl base64 -d <<< cmFtCg== - Ram Patra
@mathias如果你不想換行 openssl base64 [-e] -A 那樣做。 + @kenny解碼如果輸入最多每76個字符都沒有換行,包括我剛剛說過的no-newlines情況,你需要 -d -A 否則您將丟失或損壞數據 沒有錯誤消息 (雖然有一個待定的錯誤報告可能會導致修復)。 - dave_thompson_085
@內存, openssl base64 -e <<< ram 實際上編碼4個字節,包括尾隨換行;看到 hexdump <<< ram。 - Arjan


Openssl可以更簡潔地使用:

echo -n 'input' | openssl base64

[必須使用echo -n - >,否則將完成編碼,包括新行字符]

要么

openssl base64 <ENTER> [type input] <CTRL+D>

66
2018-04-21 06:12



但是,“echo”解決方案在輸入字符串的末尾添加了一個LF(換行符)字符。更好用:echo -n'input' - SuperTempel
甚至更簡潔一些 openssl base64 <<< input - Garrett Fogerlie
或者只是使用 base64 無 openssl。不管怎樣,我需要按Ctrl + D兩次。小心,@ Gaarret:在Bash,無論有沒有 openssl, openssl base64 <<< superuser 和 openssl base64 <<< "superuser"  誤 讓 c3VwZXJ1c2VyCg==,因為“here string”然後仍然包含換行! (顯然地 不僅在Bash中,而且在zsh,ksh和yash中。看到 hexdump <<< superuser。 Base64的結果應該是 c3VwZXJ1c2Vy。) - Arjan
@Arjan我會毫不猶豫地使用“錯誤地”這個詞 - 正如你所指出的,here-string包含換行符,但有充分理由 - unix.stackexchange.com/questions/20157/... 。 echo -n 如果您不需要換行符,則首選。這當然是需要注意的事情。 - Steve Folly
你可以用 printf 代替 echo -n - Jason S


嘗試使用:

base64 -i <in-file> -o <outfile>

它應該在OS X上默認可用。


33
2018-02-27 20:13



大。簡單而優雅。謝謝! - Leon li
加 --decode 將進程從base64轉換為正常。 - luckydonald


base64 命令在我的OS X 10.9.4上默認可用。

您可以使用 base64 <<< string 和 base64 -D <<< string 編碼和解碼終端中的字符串,或 base64 -in file 和 base64 -D -in file 編碼和解碼文件。


24
2018-03-17 02:48



你有一個例子嗎?我明白了 Invalid characer in input stream 使用時 <<<......我試過了 ", ' 並沒有圍繞字符串。 - Jonas
@Jonas你有什麼外殼?你可以在bash和zsh中使用它。 - WKPlus
啊,沒關係,它有效! - Jonas


由於Python默認提供OS X,因此您可以按如下方式使用它:

$ echo FOO | python -m base64
Rk9PCg==
$ echo Rk9PCg== | python -m base64 -d
FOO

或安裝 coreutils 通過 釀造 (brew install coreutils)將提供 base64 命令:

$ echo FOO | base64
Rk9PCg==
$ echo Rk9PCg== | base64 -d
FOO

6
2018-05-25 17:19





在速度方面,我會使用openssl,然後使用perl,然後使用uuencode。在可移植性方面,我會使用uuencode,然後使用Perl,然後使用openssl(如果你關心在盡可能多的其他類似UNIX平台上重用代碼)。但要小心,因為並非所有UNIX變體都支持-m開關(iirc AIX確實如此,HP / UX確實如此,Solaris不支持)。

$ time perl -MMIME::Base64 -e 'undef $/;while(<>){print encode_base64($_);}' \
> out.jpg 1>filename.b64
real    0m0.025s

$ time uuencode -m -o filename.b64 out.jpg filename_when_uudecoded.txt
real    0m0.051s

$  time openssl base64 -in out.jpg -out filename.b64 
real    0m0.017s

按照指定使用-m開關按照base64對uuencode file_in.txt進行編碼 RFC1521 並將其寫入filename.b64(解碼後將filename_when_uudecoded.txt作為默認文件名):

uuencode -m -o filename.b64 file_in.txt filename_when_uudecoded.txt

STDIN示例:

cat file_in.txt | uuencode -m -o filename.b64 filename_when_uudecoded.txt

5
2017-09-05 07:43





您也可以將其直接傳送到剪貼板(至少在mac上):

openssl base64 -in [filename] | pbcopy


4
2017-07-12 15:39



高爾夫: base64 < [filename] | pbcopy - totels