วิธีการเข้ารหัส base64 ผ่านทางบรรทัดคำสั่ง?


215

มีคำสั่งเทอร์มินัลใน Mac OS X ซึ่งจะ base64 เข้ารหัสไฟล์หรือ stdin หรือไม่?


5
โปรดทราบว่าแม้ว่าไวยากรณ์ base64 เข้ารหัสมีความสอดคล้องจากที่หนึ่งไปยังอีก OS ไวยากรณ์ base64 ถอดรหัสเป็นอย่างใดอย่างหนึ่งbase64 -dหรือbase64 -Dขึ้นอยู่กับระบบปฏิบัติการของคุณ -Dใช้ OSX
คริสจอห์นสัน

@ChrisJohnson หากใช้ในคอนเสิร์ตพร้อมกับopensslธงสำหรับการถอดรหัสอยู่-dใน OS X (10.10 Yosemite)
ᴠɪɴᴄᴇɴᴛ

คำตอบ:


229

opensslสามารถทำสิ่งนี้เพื่อคุณได้และทุกอย่างจะถูกติดตั้งพร้อมกับ OS X โดยค่าเริ่มต้น ไม่จำเป็นต้องติดตั้งดาร์วินสปอร์ต

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

ไม่มี-inตัวเลือกอ่านจาก stdin


79
ใช้openssl base64 < path/to/file.png | tr -d '\n' | pbcopyหรือcat path/to/file.png | openssl base64 | tr -d '\n' | pbcopyเพื่อข้ามการเขียนไปที่ไฟล์และเพียงคัดลอกเอาต์พุตที่เข้ารหัส 64 ฐานไปยังคลิปบอร์ดโดยไม่ต้องขึ้นบรรทัดใหม่
Mathias Bynens

3
และใช้-dธงเพื่อถอดรหัส
kenny

5
ใน mac ในการเข้ารหัส base64 สตริง: openssl base64 -e <<< ramและถอดรหัส:openssl base64 -d <<< cmFtCg==
Ram Patra

8
@mathias ถ้าคุณต้องการที่ไม่มีการขึ้นบรรทัดใหม่openssl base64 [-e] -Aไม่ว่า + @kenny ในการถอดรหัสหากอินพุตไม่ได้ขึ้นบรรทัดใหม่ทุก ๆ 76 ตัวอักษรรวมถึงกรณีที่ไม่ได้ขึ้นบรรทัดใหม่ที่ฉันเพิ่งระบุคุณต้องการ-d -Aหรือคุณจะได้รับข้อมูลที่ขาดหายไปหรือเสียหายโดยไม่มีข้อความแสดงข้อผิดพลาด อาจส่งผลให้แก้ไข)
dave_thompson_085

2
@Ram openssl base64 -e <<< ramเข้ารหัส 4 ไบต์จริงรวมถึงการป้อนบรรทัดต่อท้าย; เห็นhexdump <<< ramไหม
Arjan

93

Openssl สามารถใช้งานได้กระชับยิ่งขึ้น:

echo -n 'input' | openssl base64

ต้องใช้ [echo -n -> มิฉะนั้นการเข้ารหัสจะกระทำรวมถึงอักขระบรรทัดใหม่]

หรือ

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

10
วิธีการแก้ปัญหา "echo" จะเพิ่ม char LF (line feed) ไปยังจุดสิ้นสุดของสตริงป้อนข้อมูล ใช้งานได้ดีกว่า: echo -n 'อินพุต'
SuperTempel

8
และยิ่งกระชับกว่านี้อีกเล็กน้อยopenssl base64 <<< input
Garrett Fogerlie

2
หรือเพียงแค่ใช้โดยไม่ต้องbase64 opensslฉันต้องกด Ctrl + D สองครั้ง และระวัง @Garret: ในทุบตีด้วยหรือไม่openssl, openssl base64 <<< superuserและopenssl base64 <<< "superuser" ไม่สมควรให้ผลผลิตc3VwZXJ1c2VyCg==เป็น "ที่นี่สตริง" แล้วยังรวมถึงฟีดสาย! ( เห็นได้ชัดว่าไม่เพียง แต่ใน Bash แต่ยังอยู่ใน zsh, ksh และ yash ดูhexdump <<< superuserผลลัพธ์ Base64 ควรเป็นc3VwZXJ1c2Vy)
Arjan

@Arjan ฉันลังเลที่จะใช้คำว่า "ไม่สมควร" - ตามที่คุณชี้ให้เห็นที่นี่สตริงรวมถึงอาหารเส้น แต่สำหรับเหตุผลที่ดี - unix.stackexchange.com/questions/20157/... echo -nเป็นที่ต้องการหากคุณไม่ต้องการขึ้นบรรทัดใหม่ เป็นสิ่งที่ต้องระวังอย่างแน่นอน
Steve Folly

2
คุณสามารถใช้printfแทนecho -n
Jason S

50

ลองใช้:

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

ควรมีให้เป็นค่าเริ่มต้นใน OS X


1
เพิ่ม--decodeเพื่อย้อนกลับกระบวนการจาก base64 เป็นปกติ
luckydonald

1
สิ่งนี้จะดีกว่าสำหรับการเข้ารหัสสำหรับ SVG เพราะสร้างหนึ่งบรรทัด openssl base64นี่คือสะอาดกว่าการส่งออกจาก ขอบคุณ!
Shanimal

32

base64 คำสั่งพร้อมใช้งานโดยค่าเริ่มต้นใน OS X 10.9.4 ของฉัน

คุณสามารถใช้base64 <<< stringและbase64 -D <<< stringเพื่อเข้ารหัสและถอดรหัสสตริงในเทอร์มินัลหรือbase64 -in fileและbase64 -D -in fileเพื่อเข้ารหัสและถอดรหัสไฟล์


คุณมีตัวอย่างหรือไม่ ฉันได้รับInvalid characer in input streamเมื่อใช้<<<... ฉันได้ลอง"แล้ว'และไม่มีอะไรรอบ ๆ สตริง
Jonas

@ Jonas คุณมีเปลือกอะไรอยู่? คุณสามารถใช้สิ่งนี้ใน bash และ zsh
WKPlus

อาไม่เป็นไรมันใช้งานได้!
Jonas

8

เนื่องจาก Python มีให้ใน OS X โดยค่าเริ่มต้นคุณสามารถใช้งานได้ดังต่อไปนี้:

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

หรือติดตั้งcoreutilsผ่านBrew ( brew install coreutils) ซึ่งจะให้base64คำสั่ง:

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

5

ในแง่ของความเร็วฉันจะใช้ 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 เพื่อ uuencode file_in.txt ต่อ base64 ตามที่ระบุโดย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

คุณสามารถไพพ์ไปยังคลิปบอร์ดได้ (อย่างน้อยใน mac):

openssl base64 -in [filename] | pbcopy


ตีกอล์ฟ:base64 < [filename] | pbcopy
totel

5

ใน macOS ฉันมักจะใช้:

echo -n "STRING" | base64

-n คือการหลีกเลี่ยงอักขระบรรทัดใหม่ที่ท้ายบรรทัด


3

หลาม

Python มาพร้อมกับการติดตั้งบน macs ทุกเครื่องในปัจจุบัน

ใน Terminal รันpython(หรือipython )

เข้ารหัสไฟล์:

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

ถอดรหัสไฟล์:

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

แน่นอนการดำเนินการทั้งสองสามารถแปลงเป็น oneliner ได้ แต่วิธีนี้สามารถอ่านได้มากขึ้น

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/ -output... filenameจะพิมพ์ไปที่ stdout

base64

ยูทิลิตี้ ootb อื่นนำเสนอทั้งใน OSX และ 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

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

โดยที่nameคือชื่อที่จะแสดงในส่วนหัวที่เข้ารหัส

ตัวอย่าง:

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

หรือ

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

uuencodeไม่ใช่การเข้ารหัสเป็นbase64
ccpizza

2

ด้วยเหตุผลบางอย่างecho -n <data> | openssl base64เพิ่มบรรทัดใหม่ตรงกลางข้อมูล base64 ของฉัน ฉันคิดว่ามันเป็นเพราะข้อมูล base64 ของฉันมันยาวมาก

ใช้echo -n <data> | base64เพื่อเข้ารหัสและecho -n <base64-ed data> | base64 -Dถอดรหัสทำงานได้ดี


หมายเหตุ: บนระวังของฉันฉันต้องใช้ -d echo -n c29tZXVzZXI6c29tZXBhc3N3b3Jk | base64 -d someuser: somepassword
mlo55

2

นอกเหนือจากคำตอบของ Steve Folly ด้านบนเมื่อเข้ารหัสในโหมด stdin เพื่อหลีกเลี่ยงการขึ้นบรรทัดใหม่ให้กด CTRL + D สองครั้งเพื่อสิ้นสุดอินพุตโดยไม่ขึ้นบรรทัดใหม่ใด ๆ ผลลัพธ์จะแสดงทันทีหลังจากบรรทัดเดียวกัน

ตัวอย่างเช่น:

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

หรือคุณสามารถใช้printf:

$ printf 'input' | openssl base64
aW5wdXQ=
$

1

มี Perl บวก MIME :: Base64:

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

สิ่งนี้ติดตั้งมาล่วงหน้า คุณสามารถระบุไฟล์แยกต่างหากในบรรทัดคำสั่ง (หรือจัดหาข้อมูลในอินพุตมาตรฐาน); แต่ละไฟล์มีการเข้ารหัสแยกต่างหาก คุณยังสามารถทำสิ่งต่อไปนี้

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

สิ่งนี้สำรอง file1 เป็น file1.txt และเขียนเอาต์พุตที่เข้ารหัส Base-64 บนไฟล์ต้นฉบับ


1

NodeJS เวอร์ชั่นง่าย ๆ :

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

ผมไม่คิดว่านี่เป็นคำตอบที่ดีกว่าopenssl(และตอนนี้base64) มาพร้อมกับระบบปฏิบัติการ
Josh

ที่เสี่ยงต่อการขนแยก - และฉันรู้ว่าการวิจารณ์นี้นำไปใช้กับคู่ของคำตอบอื่น ๆ เช่นเดียว - คำถามที่ถามวิธีการเข้ารหัสไฟล์หรือstdin ถ้าฉันไม่เข้าใจผิดคำตอบของคุณจะแสดงเฉพาะวิธีเข้ารหัสสตริง
G-Man

1

recode ควรทำเคล็ดลับสำหรับคุณ

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

Recode สามารถใช้ได้สำหรับ OS X ผ่านMacPorts


ไม่มีอะไรในตัว
Josh

@Josh - มี - openssl
Steve Folly

MacPorts ไม่ได้มาพร้อมกับการกระจาย OS X ใด ๆ มีตัวเลือกอื่น ๆ ให้เลือกมากมาย เช่นbase64คำสั่งเพียงแค่
Jason S

1

หากคุณเข้ารหัส base64 ไฟล์ฟอนต์คุณสามารถทำได้:

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

ฉันใช้มันกับ Mac (10.10) ตลอดเวลา

หมายเหตุ : จะไม่มีการแพร่กระจาย


1

โซลูชันข้ามแพลตฟอร์ม

เรารวบรวมรายการคำสั่งเชลล์ข้ามแพลตฟอร์มเพื่อเข้ารหัสไฟล์เป็น base64 คำสั่งต่อไปนี้ใช้ไฟล์อินพุต (มีชื่อdeploy.keyในตัวอย่าง) และแปลงเป็น base64 โดยไม่มีการตัดบรรทัดใหม่ เอาต์พุต base64 ถูกพิมพ์ไปยังเทอร์มินัลผ่าน stdout

# 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

หากต้องการเปลี่ยนเส้นทางผลลัพธ์ไปยังไฟล์ให้ต่อท้าย> base64-encoded.txt(โดยใช้ชื่อไฟล์ที่คุณเลือก)

คำสั่งเหล่านี้ถูกสร้างต้นแบบเป็นส่วนหนึ่งของคำขอดึงนี้ซึ่งเราต้องการให้คำสั่งเชลล์ข้ามแพลตฟอร์มเป็น base64 เข้ารหัสคีย์ส่วนตัว SSH เพื่อลบบรรทัดใหม่

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.