2017-07-19 60 views
6

Po prostu spędziłem zbyt dużo czasu waląc głową w serwer SMTP, ponieważ nie podoba mi się to, jakich danych używałem. Okazuje się, że gdy zdecydowałem się NIE używać perl, jak wiele instrukcji w Internecie, mówią, że użyłem, popełniłem wielki błąd. Dlaczego to? Myślałem, że base64 to jeden standard.Jaka jest różnica między base64 i MIME base 64?

Rozważmy:

$ perl -MMIME::Base64 -e 'print encode_base64("ASDF1234asdf")' 
QVNERjEyMzRhc2Rm 

$ base64 <<<"ASDF1234asdf" 
QVNERjEyMzRhc2RmCg== 

$ python3.6 -m base64 <<<"ASDF1234asdf" 
QVNERjEyMzRhc2RmCg== 

$ python2.7 -m base64 <<<"ASDF1234asdf" 
QVNERjEyMzRhc2RmCg== 

$ perl -MMIME::Base64 -e "print encode_base64('[email protected]_domain.com')" 
bXlfdXNlcl9uYW1lQG15X2RvbWFpbi5jb20= 

$ base64 <<<"[email protected]_domain.com" 
bXlfdXNlcl9uYW1lQG15X2RvbWFpbi5jb20K 

Więc perl jest jedyna w swoim wyjściu i mój serwer wymaga to w ten sposób.

Dlaczego otrzymuję różne wyniki?

Jak uzyskać wyjście przyjazne dla MIME/SMTP z czymś innym niż Perl?

+0

Equivalent byłoby 'perl -MMIME :: Base64 -0777pe'print encode_base64 ($ _) '' – ikegami

Odpowiedz

10

To nie jest perl w przeciwieństwie do wszystkich innych rzeczy; jest to "używanie konstruktu Basha" zamiast "nie robienia tego". Chociaż nie są wyraźnie udokumentowane (przynajmniej nie w podręczniku na Ubuntu Xenial), Bash appends a newline to herestrings (the <<< thing) when passing them to commands. W rezultacie wszystkie polecenia wywoływane za pomocą <<< kodują w rzeczywistości 'ASDF1234asdf\n', podczas gdy Perl (który nie jest wywoływany z ciągiem znaków) koduje tylko 'ASDF1234asdf'. Różne wejścia, różne wyjścia.

Aby zdać ciąg bez spływu nowej linii do standardowego wejścia polecenia, użyj komendy printf, np:

$ printf %s ASDF1234asdf | base64 
QVNERjEyMzRhc2Rm 
5

Brak różne kodowania Base64, ale kodujący znak nowej linii na końcu, czy nie:

$ perl -MMIME::Base64 -e 'print encode_base64("ASDF1234asdf")' 
QVNERjEyMzRhc2Rm 
$ perl -MMIME::Base64 -e 'print encode_base64("ASDF1234asdf\n")' 
QVNERjEyMzRhc2RmCg== 
$ echo -ne "[email protected]_domain.com" | base64 
bXlfdXNlcl9uYW1lQG15X2RvbWFpbi5jb20= 
$ echo -ne "[email protected]_domain.com\n" | base64 
bXlfdXNlcl9uYW1lQG15X2RvbWFpbi5jb20K 
+0

jest to bardzo zwięzły demo. Dodałem supresję nowej linii i unikam interpretacji znaków do polecenia echa, aby uzyskać wyniki identyczne z OP. (i przegłosowane) –

Powiązane problemy