Base64 ile komut satırı üzerinden nasıl kodlanır?


215

Mac OS X'te base64'ün bir dosya veya stdin kodlayacağı bir terminal komutu var mı?


5
Base64 kodlayan sözdiziminin bir işletim sisteminden diğerine tutarlı olmasına rağmen, base64 kod çözme sözdiziminin ya base64 -dda base64 -Dişletim sisteminize bağlı olduğunu unutmayın. OSX kullanır -D.
Chris Johnson

@ChrisJohnson Kod opensslçözme bayrağıyla birlikte kullanılması durumunda -dOS X'de (10.10 Yosemite).
12'de

Yanıtlar:


229

opensslbunu sizin için yapabilir ve hepsi varsayılan olarak OS X ile birlikte kurulur; darwinport yüklemeye gerek yok.

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

-inSeçenek olmadan stdin'den okur


79
Bir dosyaya yazmayı atlamak ve sadece satır 64 olmadan base64 kodlu çıktıları panoya kopyalamak için openssl base64 < path/to/file.png | tr -d '\n' | pbcopyveya kullanın cat path/to/file.png | openssl base64 | tr -d '\n' | pbcopy.
Mathias Bynens

3
Ve -dkodunu çözmek için bir bayrak kullanın.
kenny

5
Mac'te, base64'e bir dize kodlanır: openssl base64 -e <<< ramve kod çözülür:openssl base64 -d <<< cmFtCg==
Ram Patra

8
@ mathias eğer yeni bir satır istemiyorsanız openssl base64 [-e] -Abunu yapın. + @kenny, girişin, az önce belirttiğim Newlines olayı dahil olmak üzere en fazla her 76 karakterde bir newline içermemesi durumunda, ihtiyacınız olur -d -Aveya hata mesajı vermeden eksik veya bozuk veriler alırsınız (bekleyen bir hata raporu olmasına rağmen). bunun düzeltilmesine neden olabilir).
dave_thompson_085

2
@Ram, openssl base64 -e <<< ramgerçekte izleyen satır beslemesi de dahil olmak üzere 4 baytı kodlar; bkz hexdump <<< ram.
Arjan

93

Openssl daha kısaca kullanılabilir:

echo -n 'input' | openssl base64

[echo -n -> kullanılmalıdır, yoksa yeni satır karakterini içeren kodlama yapılır]

veya

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

10
"Yankı" çözümü, girdi dizesinin sonuna bir LF (satır besleme) karakteri ekler. Daha iyi kullanım: echo -n 'input'
SuperTempel

8
Ve hatta biraz daha özlüopenssl base64 <<< input
Garrett Fogerlie

2
Ya da sadece kullanmak base64olmadan openssl. Her iki durumda da, Ctrl + D tuşlarına iki kez basmam gerekiyor. Dikkat edin, @Garret: Bash'te, olsun ya da olmasın openssl, openssl base64 <<< superuserve "burada dize" olarak openssl base64 <<< "superuser" yanlış verim c3VwZXJ1c2VyCg==, sonra hala bir satır beslemesi içerir! ( Görünüşe göre sadece Bash'de değil, aynı zamanda zsh, ksh ve yash da. Bakın hexdump <<< superuser. Base64 sonucu şöyle olmalı c3VwZXJ1c2Vy.)
Arjan

@Arjan "Hatalı" kelimesini kullanmakta tereddüt ediyorum - belirttiğiniz gibi, burada-string satır beslemesi içeriyor, fakat iyi bir sebepten dolayı - unix.stackexchange.com/questions/20157/… . echo -nYeni hatta ihtiyacınız yoksa tercih edilir. Bu kesinlikle dikkat edilmesi gereken bir şey.
Steve Folly

2
printfYerine kullanabilirsinizecho -n
Jason S

50

Kullanmayı deneyin:

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

OS X'te varsayılan olarak bulunmalıdır.


1
--decodeİşlemi base64'ten normale döndürmek için ekleyin .
luckydonald

1
Bu, SVG'yi kodlamak için daha iyidir, çünkü bir satır oluşturur. Bu, çıktısından daha temiz openssl base64. Teşekkürler!
Shanimal

32

base64 OS X 10.9.4'te varsayılan olarak komut mevcuttur.

Sen kullanabilirsiniz base64 <<< stringve base64 -D <<< stringkodlamak ve terminalde bir dize şifresini çözmek, ya da base64 -in fileve base64 -D -in filekodlamak ve bir dosya şifresini çözmek.


Bir örnek var mı Ben olsun Invalid characer in input streamkullanırken <<<... beraber çalıştık ", 've dize etrafında hiçbir şey.
Jonas

@Jonas Hangi kabuğun içindesin? Bunu bash ve zsh olarak kullanabilirsiniz.
WKPlus 21:16

Ah, boşver, işe yarıyor!
Jonas

8

Python varsayılan olarak OS X ile donatıldığından, aşağıdaki gibi kullanabilirsiniz:

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

Veya yüklemek coreutilsyoluyla Brew ( brew install coreutilssağlayacak olan) base64komutu:

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

5

Hız açısından, openssl ve ardından perl, ardından uuencode kullanacaktım. Taşınabilirlik açısından, uuencode ve ardından Perl, ardından openssl kullanacağım (Kodu mümkün olduğunca UNIX benzeri hisse senedi platformlarında kullanabilmek için). Ancak, tüm UNIX değişkenlerinin -m anahtarını desteklemediğinden dikkatli olun (iirc AIX yapar, HP / UX yapar, Solaris yok).

$ 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

Tarafından belirtildiği şekilde base64 başına file_in.txt uuencode -m kullanın RFC1521 ve (deşifre varsayılan dosya adı olarak filename_when_uudecoded.txt birlikte) o filename.b64 yazabilirsiniz:

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

STDIN örneği:

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

5

Ayrıca panoya doğru da yönlendirebilirsiniz (en azından mac’te):

openssl base64 -in [filename] | pbcopy


golf:base64 < [filename] | pbcopy
totels

5

MacOS'ta her zaman kullanıyorum:

echo -n "STRING" | base64

-n satırın sonunda yeni bir satır karakterinden kaçınmak içindir.


3

piton

Python bugünlerde tüm mac'lara önceden yüklenmiş olarak geliyor.

Terminalde python(veya ipython ) çalıştırın .

Bir dosyayı kodla:

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

Bir dosyanın kodunu çözün:

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

Tabii ki, her iki işlem bir oneliner'a dönüştürülebilir, ancak bu şekilde daha okunur.

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

-out/ Atlandığında -output... filenamestdout'a yazdırılır.

base64

Hem OSX hem de Ubuntu'da bulunan başka bir ootb yardımcı programı:

## 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

2
uuencode -m [-o output_file] [file] name

Kod adı verilen başlıkta görüntülenecek ad.

Örnek:

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

veya

uuencode -m -o docbook-xsl.css.b64 docbook-xsl.css docbook-xsl.css

uuencodekodlama olarak değilbase64
ccpizza

2

Nedense, echo -n <data> | openssl base64base64 verilerimin ortasına yeni bir satır ekledim. Base64 verilerimin gerçekten uzun olduğu için olduğunu sanıyorum.

Kullanılması echo -n <data> | base64kodlamak ve echo -n <base64-ed data> | base64 -Dişlenmiş cezası çözmek için.


nb: nix'imde -d echo -n c29tZXVzZXI6c29tZXBhc3N3b3Jk | base64 -d bazı kullanıcı: somepassword
mlo55

2

Steve Folly'nin yukarıdaki cevabına ek olarak, stdin modunda şifreleme yaparken, fazladan yeni satırları geçmekten kaçınmak için, girişi yeni satırlar olmadan sonlandırmak için CTRL + D tuşlarına iki kez basın. Çıktı, aynı satırdan hemen sonra gösterilecektir.

Örneğin:

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

Alternatif olarak, kullanabilirsiniz printf:

$ printf 'input' | openssl base64
aW5wdXQ=
$

1

Perl artı MIME var :: Base64:

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

Bu önceden yüklenmiş olarak geliyor. Komut satırında ayrı dosyalar belirleyebilirsiniz (veya standart girişte verileri sağlayın); Her dosya ayrı ayrı kodlanır. Ayrıca şunları da yapabilirsiniz:

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

Bu, file1 dosyasını file1.txt dosyasına yedekler ve Base-64 ile kodlanmış çıktıyı orijinal dosyanın üzerine yazar.


1

Basit bir NodeJS sürümü:

node -e "process.stdout.write(new Buffer(process.argv[1]).toString('base64'))" "Hello world!"

Bunun OS ile birlikte geldiğinden openssl(ve şimdi base64) daha iyi bir cevap olduğunu sanmıyorum .
Josh

Tüyleri bölme riski altında - ve, bu eleştirinin diğer cevapların birkaçına da uygulanabileceğinin farkındayım - soru bir dosyayı nasıl kodlayacağınızı ya da stdin'i sordu . Yanılmıyorsam, cevabınız yalnızca bir dizenin nasıl kodlanacağını gösterir.
G-Man

1

recode sizin için hile yapmalı

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

MacPorts aracılığıyla OS X için recode kullanılabilir .


Yerleşik hiçbir şey yok mu?
Josh,

@Josh - var - openssl
Steve Folly

MacPorts herhangi bir OS X dağıtımı ile gelmiyor. Bunu yapacak birçok seçenek var. Mesela sadece base64komut.
Jason S

1

Bir font dosyasını kodlayan base64 iseniz, bunu yapabilirsiniz:

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

Bunu her zaman Mac'te (10.10) kullanırım.

Not : Çizgi yok.


1

Çapraz platform çözümleri

Bir dosyayı base64 olarak kodlamak için platformlar arası kabuk komutlarının bir listesini derledik. Aşağıdaki komutlar bir giriş dosyasını alır ( deploy.keyörneklerde adlandırılır ) ve herhangi bir yeni satır kaydırma yapmadan base64'e dönüştürür. Base64 çıkışı stdout üzerinden terminale yazdırılır.

# 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

Çıktıyı bir dosyaya yönlendirmek için ekleyin > base64-encoded.txt(seçtiğiniz bir dosya adını kullanarak).

Bu komutlar bu çekme isteğinin bir parçası olarak prototip edildi, burada platformlar arası kabuk komutlarının base64 olarak tanımlanmasını istedik.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.