Jak zakodować base64 za pomocą wiersza poleceń?

215

Czy w Mac OS X jest polecenie terminalu, które base64 koduje plik lub standardowe wejście?

Josh
źródło
5
Należy pamiętać, że chociaż składnia kodująca base64 jest spójna w różnych systemach operacyjnych, składnia dekodująca base64 jest zależna od systemu operacyjnego base64 -dlub base64 -Dzależy od tego systemu operacyjnego. Używa OSX -D.
Chris Johnson
@ChrisJohnson Jeśli jest używany razem opensslz flagą do dekodowania, znajduje się -dw OS X (10.10 Yosemite).
ᴠɪɴᴄᴇɴᴛ

Odpowiedzi:

229

opensslmoże zrobić to za Ciebie, i to wszystko jest domyślnie instalowane z OS X; nie trzeba instalować darwinports.

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

Bez -inopcji czyta ze standardowego wejścia

Steve Folly
źródło
79
Użyj openssl base64 < path/to/file.png | tr -d '\n' | pbcopylub, cat path/to/file.png | openssl base64 | tr -d '\n' | pbcopyaby pominąć zapisywanie do pliku i po prostu skopiuj dane wyjściowe zakodowane w standardzie base64 do schowka bez podziału linii.
Mathias Bynens,
3
I użyj -dflagi do dekodowania.
kenny,
5
W systemie Mac, do base64 koduje ciąg: openssl base64 -e <<< rami do dekodowania:openssl base64 -d <<< cmFtCg==
Ram Patra,
8
@mathias, jeśli nie chcesz nowych linii, openssl base64 [-e] -Arobi to. + @kenny przy dekodowaniu, jeśli dane wejściowe nie mają znaku nowej linii co najwyżej 76 znaków, w tym przypadek braku nowych linii, który właśnie powiedziałem, że potrzebujesz -d -Alub utracisz lub uszkodzisz dane bez komunikatu o błędzie (chociaż jest zgłoszenie błędu, które może spowodować naprawienie tego).
dave_thompson_085
2
@Ram, openssl base64 -e <<< ramfaktycznie koduje 4 bajty, w tym znak końca linii; zob hexdump <<< ram.
Arjan
93

Otwartego można używać bardziej zwięźle:

echo -n 'input' | openssl base64

[echo -n -> musi być użyte, inaczej kodowanie zostanie wykonane łącznie ze znakiem nowej linii]

lub

openssl base64 <ENTER> [type input] <CTRL+D>
Dolina górska
źródło
10
Jednak rozwiązanie „echo” dodaje znak LF (przesunięcie wiersza) na końcu ciągu wejściowego. Lepsze użycie: echo -n 'input'
SuperTempel
8
I jeszcze bardziej zwięzłyopenssl base64 <<< input
Garrett Fogerlie
2
Lub po prostu użyj base64bez openssl. Tak czy inaczej, muszę nacisnąć Ctrl + D dwa razy. I uważaj, @Garret: bash, z lub bez openssl, openssl base64 <<< superuseri openssl base64 <<< "superuser" błędnie wydajność c3VwZXJ1c2VyCg==, jak „tu napisu” wtedy nadal obejmuje wysunięcie wiersza! ( Podobno nie tylko w Bash, ale także w zsh, ksh i yash. Zobacz hexdump <<< superuser. Wynik Base64 powinien być c3VwZXJ1c2Vy.)
Arjan
@Arjan że waham się użyć słowa „błędnie” - jak podkreślił tu sznurek zawiera nowego wiersza, ale nie bez powodu - unix.stackexchange.com/questions/20157/... . echo -njest preferowany, jeśli nie potrzebujesz nowej linii. Z pewnością należy o tym pamiętać.
Steve Folly,
2
Możesz użyć printfzamiastecho -n
Jason S
50

Spróbuj użyć:

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

Powinien być domyślnie dostępny w systemie OS X.

Derreck Dean
źródło
1
Dodaj, --decodeaby odwrócić proces z base64 na normalny.
luckydonald
1
Jest to lepsze do kodowania SVG, ponieważ tworzy jedną linię. Jest to czystsze niż wyjście z openssl base64. Dzięki!
Shanimal
32

base64 polecenie jest domyślnie dostępne w moim systemie OS X 10.9.4.

Możesz użyć base64 <<< stringi base64 -D <<< stringdo zakodowania i zdekodowania łańcucha w terminalu, lub base64 -in fileoraz base64 -D -in filedo zakodowania i zdekodowania pliku.

WKPlus
źródło
Czy masz przykład? Mam Invalid characer in input streamprzy użyciu <<<... Próbowałem z ", 'i nic wokół napisu.
Jonas
@Jonas W jakiej jesteś skorupce? Możesz użyć tego w bash i zsh.
WKPlus,
Ach, nieważne, to działa!
Jonas
8

Ponieważ Python jest domyślnie dostarczany z systemem OS X, możesz go używać w następujący sposób:

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

Lub zainstaluj coreutilsza pomocą Brew ( brew install coreutils), który zapewni base64polecenie:

$ echo FOO | base64
Rk9PCg==
$ echo Rk9PCg== | base64 -d
FOO
kenorb
źródło
5

Pod względem prędkości użyłbym openssl, następnie perl, a następnie uuencode. Jeśli chodzi o przenośność, użyłbym uuencode, a następnie Perla, a następnie openssl (jeśli zależy ci na ponownym użyciu kodu na jak największej liczbie innych platform giełdowych typu UNIX). Bądź jednak ostrożny, ponieważ nie wszystkie warianty UNIX obsługują przełącznik -m (iirc AIX obsługuje, HP / UX obsługuje, Solaris nie).

$ 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

Użyj przełącznika -m do uuencode file_in.txt na base64, jak określono w RFC1521, i zapisz go do filename.b64 (z filename_when_uudecoded.txt jako domyślną nazwą pliku po zdekodowaniu):

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

Przykład STDIN:

cat file_in.txt | uuencode -m -o filename.b64 filename_when_uudecoded.txt
pysk
źródło
5

Możesz także przenieść go bezpośrednio do schowka (przynajmniej na Macu):

openssl base64 -in [filename] | pbcopy

Steve
źródło
gra w golfa:base64 < [filename] | pbcopy
totels
5

W systemie macOS zawsze używam:

echo -n "STRING" | base64

-n oznacza uniknięcie nowego znaku linii na końcu linii.

patrickS
źródło
3

Pyton

Python jest obecnie zainstalowany fabrycznie na wszystkich komputerach Mac.

W trybie terminalowym python(lub ipython ).

Zakoduj plik:

 base64data = open('myfile.jpg','rb').read().encode('base64')
 open('myfile.txt','w').write(base64data)

Dekoduj plik:

data = open('myfile.txt').read().decode('base64')
open('myfile.jpg','wb').write(data)

Oczywiście obie operacje można przekształcić w oneliner, ale w ten sposób jest bardziej czytelny.

OpenSSL

## encode to base64 (on OSX use `-output`)
openssl base64 -in myfile.jpg -output myfile.jpg.b64

## encode to base64 (on Linux use `-out`)
openssl base64 -in myfile.jpg -out myfile.jpg.b64


## decode from base64 (on OSX `-output` should be used)
openssl base64 -d -in myfile.jpg.b64 -output myfile.jpg

## decode from base64 (on Linux `-out` should be used)
openssl base64 -d -in myfile.jpg.b64 -out myfile.jpg

Pominięcie -out/ -output... filenamespowoduje wydrukowanie na standardowe wyjście.

base64

Kolejne narzędzie ootb obecne zarówno w OSX, jak i Ubuntu:

## encode to base64
base64 < myfile.jpg > myfile.jpg.b64

## decode from base64 (OSX) (note the uppercase 'D')
base64 -D < myfile.jpg.b64 > myfile.jpg

## decode from base64 (Linux) (note the lowercase 'd')
base64 -d < myfile.jpg.b64 > myfile.jpg
ccpizza
źródło
2
uuencode -m [-o output_file] [file] name

Gdzie nazwa to nazwa wyświetlana w zakodowanym nagłówku.

Przykład:

cat docbook-xsl.css | uuencode -m docbook-xsl.css

lub

uuencode -m -o docbook-xsl.css.b64 docbook-xsl.css docbook-xsl.css
użytkownik214207
źródło
uuencodenie jest kodowaniem jakbase64
ccpizza
2

Z jakiegoś powodu echo -n <data> | openssl base64dodałem nowy wiersz w środku moich danych base64. Zakładam, że było tak, ponieważ moje dane base64 były naprawdę długie.

Używanie echo -n <data> | base64do kodowania i echo -n <base64-ed data> | base64 -Ddekodowania działało dobrze.

Granice zdrowia
źródło
nb: na moim nixie musiałem użyć -d echo -n c29tZXVzZXI6c29tZXBhc3N3b3Jk | base64 -d someuser: somepassword
mlo55 14.04.16
2

Oprócz powyższej odpowiedzi Steve'a Folly, podczas szyfrowania w trybie standardowym, aby uniknąć przejścia dodatkowych nowych linii, naciśnij CTRL + D dwa razy, aby zakończyć wprowadzanie bez żadnych nowych linii. Dane wyjściowe zostaną wyświetlone zaraz po tej samej linii.

Na przykład:

$ openssl base64 [Enter]
input<CTRL+D><CTRL+D>aW5wdXQ=
$

Alternatywnie możesz użyć printf:

$ printf 'input' | openssl base64
aW5wdXQ=
$
bigT
źródło
1

Istnieje Perl plus MIME :: Base64:

perl -MMIME::Base64 -e 'undef $/;while(<>){print encode_base64($_);}'

To jest fabrycznie zainstalowane. Możesz podać osobne pliki w wierszu poleceń (lub podać dane na standardowym wejściu); każdy plik jest osobno zakodowany. Możesz także:

perl -i.txt -MMIME::Base64 -e 'undef $/;while(<>){print encode_base64($_);}' file1

Spowoduje to utworzenie kopii zapasowej pliku1 do pliku1.txt i zapisanie danych wyjściowych zakodowanych w formacie Base-64 na oryginalnym pliku.

Jonathan Leffler
źródło
1

Prosta wersja NodeJS:

node -e "process.stdout.write(new Buffer(process.argv[1]).toString('base64'))" "Hello world!"
mauvm
źródło
Nie sądzę, że jest to lepsza odpowiedź, ponieważ openssl(i teraz base64) pochodzi z systemem operacyjnym.
Josh
Ryzykując rozszczepienie włosów - i jestem świadomy, że ta krytyka dotyczy również kilku innych odpowiedzi - pytanie dotyczyło sposobu zakodowania pliku lub standardowego wejścia . Jeśli się nie mylę, twoja odpowiedź pokazuje tylko, jak zakodować ciąg.
G-Man
1

recode powinno załatwić sprawę

recode ../b64 < file.txt > file.b64

recode jest dostępny dla OS X za pośrednictwem MacPorts .

ciężki
źródło
Nie ma nic wbudowanego?
Josh
@Josh - nie ma - openssl
Steve Folly
MacPorts nie jest dostarczany z żadną dystrybucją OS X. Istnieje wiele innych opcji. Na przykład po prostu base64polecenie.
Jason S
1

Jeśli kodujesz plik czcionki base64, możesz to zrobić:

base64 my-webfont.ttf > my-webfont.b64.ttf.txt

Używam tego cały czas na komputerze Mac (10.10).

Uwaga : nie będzie łamania linii.

Chuck Ugwuh
źródło
1

Rozwiązania wieloplatformowe

Zebraliśmy listę poleceń powłoki między platformami, aby zakodować plik jako base64. Następujące polecenia pobierają plik wejściowy (nazwany deploy.keyw przykładach) i konwertują go na base64 bez zawijania nowego wiersza. Wyjście base64 jest drukowane na terminalu przez standardowe wyjście.

# For systems with openssl
openssl base64 -A -in=deploy.key

# For systems with Python (2 or 3) installed
python -c "import base64; print(base64.standard_b64encode(open('deploy.key', 'rb').read()).decode())"

# For Windows or Linux systems that have the GNU coreutils base64 command
base64 --wrap=1000000 deploy.key

# For macOS systems
base64 --break=1000000 deploy.key

Aby przekierować wyjście do pliku, dołącz > base64-encoded.txt(używając wybranej nazwy pliku).

Te polecenia zostały prototypowane jako część tego żądania ściągnięcia, w którym chcieliśmy, aby międzyplatformowe polecenia powłoki do base64 kodowały klucz prywatny SSH w celu usunięcia znaków nowej linii.

Daniel Himmelstein
źródło