Portál AbcLinuxu, 13. května 2024 03:48
Potřebuji z bash skriptu provést dekódování souboru, abych z něj následně mohl vytáhnout nějaké údaje. Soubor je emailová zpráva, která v těle obsahuje část zakódovanou base64. Z práva jako taková mě nazajímá. Pro jistotu uvádím začátek oné části:
Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: base64 Cgo8IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9u YWwvL0VOIj4KPGh0bWw+Cjxib2R5IGJnY29sb3I9IiNmZmZmZmYiIHRleHQ9IiMwMDAwMDAiPgoK ...
Moje pokusy s recode a hledání nebylo úspěšné (určitě hlavně proto, že je mi tato oblast naprosto neznámá), může někdo poradit nebo nasměrovat, kde a co hledat? Předem dík.
Na podobné věci používám perlovou utilitku mimedecode, která je ke stažení zde.
Dekóduje to všechny přílohy mailu a uloží do daného adresáře - tělo ignoruje. Jediná věc k řešení je, že zachovává jména příloh, tak to bude třeba v tom bashi nějak poladit
Z toho celého balíku je třeba jen ten jeden soubor mimedecode (a knihovny perlu na manipulaci s MIME, které jsou snad v každém distru - Debian je má v libmime-tools-perl)
Podívám se na to, ale ta zakódovaná část není příloha, ale vlastní tělo zprávy, bude to i zde použitelné?
No tak to nezabere... ale co třeba:
# reformime -x/tmp/ < mail.raw
Rozbalí všechny mime party (včetně těla atd.)... pak stačí chytit ten správnej... takhle na slepo je těžké radit přesněji...
nedaří se, použil jsem
base64 -di mail.txt ,
ale končí to vždy chybou (obdobně i při nepoužití -i)
base64: invalid input
a na obrazovku nebo do souboru se zapíše
..z{Sʗ.{...V...Z.ǭ
a `$ openssl enc -d -base64 -in myfile.b64 -out myfile.decrypt` zabere?
Podobné jako předchozí, celý zakódovaný soubor je v pořádku, ale skutečný soubor je z části nekódovaný a to je problém. Tentokrát to nekončí chybou, ale výsledek je nějaký rozsypaný čaj.
Beru zpět tu nefunkčnost, problém je s tím, že base64 je jen část dokumentu a ono to spadne na začátku na nekódované části. Pokud je v souboru jen ta zkódovaná část, tak to jde. Tím ale vznikl jiný, pro mě asi stejně komplikovaný zádrhel, že bych napřed musel nějak soubor vyčistit.
csplit vstupni_soubor %base64%+1
vznikne ti soubor xx00(jmeno mozno zmeni viz man csplit) kde je jenom base64 kodovana cast sed '1,3d' vstupni_soubor | base64 -d
kde cisla 1 a 3 urcuji rozsah radek ktere se maji z puvodniho souboru smazatTen soubor má standardní hlavičku emailu a v těle jsou dvě části zakodované (jednou pro html, jednou pro plain) , každá tato část má hlavičku o kódování (viz výše) a řetězec ukončující každou část. Nerad bych to zveřejňoval, protože se tam objevují kontakty, které právě potřebuji vytáhnout a uložit.
Poradil jsem si podobným způsobem jak radíš, z mejlu ořežu vše co je navíc a pak to jde, ale je to hnusné řešení, kterým se nemůžu pochlubit a musím spoléhat na to, že se struktura zprávy nezmění v důležitých bodech.
base64 -d
.
$ cat foo Cgo8IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIj4KPGh0bWw+Cjxib2R5IGJnY29sb3I9IiNmZmZmZmYiIHRleHQ9IiMwMDAwMDAiPgo $ base64 -d < foo <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <body bgcolor="#ffffff" text="#000000"> base64: invalid inputTen error ktery to vyhodilo je zpusobem tim, ze jsi nam poskytl jenom uryvek.. staci na konec doplnit "=" a uz to projde v pohode..
Ano stačí, ale jak bylo napsáno výš, musí být z toho souboru odstraněno vše, co není právě tím kódem.
Hledám řešení (pokud je), jak to dekódovat celé bez úprav souboru. Třeba i s tím, že nekódovaná část souboru bude nějak znetvořena, nezajímá mě.
Tiskni Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.