copy-paste mit base64

Ich arbeite oft auf Systemen, die ich nur über einen virtuellen Screen erreiche (Remote Desktop etwa) und zu dem ich zwar eine gemeinsame Zwischenablage habe (copy-paste), aber keine einfache Möglichkeit, Dateien zu kopieren.

Wenn ich etwa eine Logdatei kopieren will, die in den Scrollback-Buffer des Terminalfensters auf der remote Maschine nicht komplett reinpasst, dann muss ich stückeln und bereichsweise kopieren. Das nervt tierisch.

Oder ich nutze gzip und base64:

% cp grosselogdatei.log /tmp
% cd /tmp
% gzip grosselogdatei.log
% base64 grosselogdatei.log.gz
H4sICLiyGlkAA29wZW5maWxlcy5jc3YAbZ3dlsSoCkbvz7PUmVWg+DPv/2BTnZgIuG/3oo35AoiS
VMv3n6/9o1/p/5f+77d+mv5PApPvp1li+v30llj52fXE6o99E7Mfk8DGv98fG4md1x1/1z3+toDd
33VLYn/XjXOef9eVKgkKGO [...]
B5SBkg6GOjwNjG+maEv+4PabgVJ+aBgX7iekIn32poGSDg3zQ8O4aKhDR39wL8wFSutmRx06+oP7
CalAKT/0/YJUoKRDx7jo+8XBSEGzgevFQH8YmCfH/mnWQMkfBsbFQH8YGBf3frOle7v3m9drf4FS
XAz0h4k6TMwPE/3BNTACVbg39xNSgb7nUZGiLfnDxLi495tZHbff3FS+tF7I/sni/wA6SY/SD4IA
AA==

Diesen ASCII Output kann ich locker per copy-paste in einem Rutsch kopieren und in eine Datei lokal kopieren, etwa grosselogdatei.log.gz.b64, und wieder auspacken:

% base64 -d grosselogdatei.log.gz.b64 > grosselogdatei.log.gz
% gunzip grosselogdatei.log.gz
copy-paste mit base64

HTML emails mit mail.mailutils

Das Programm mail.mailutils (meist einfach mail) ist auf vielen Linux-Distributionen installiert. Man kann damit über die Shell Emails verschicken, was sehr praktisch ist für scripte und cron-jobs, die den Admin per Mail informieren sollen.

Manchmal will man auch mal ein wenig mit HTML spielen und sei es auch nur, um um den Text ein <pre> zu setzen, damit er mit einer Monospace-Schrift angezeigt wird und ASCII-Art und Tabellen ordentlich dargestellt werden.

So schickt man HTML:

# generiere random boundary
BOUNDARY=$(date | md5sum | head -c8)
echo "
--_$BOUNDARY_
Content-Type: text/html; charset=\"us-ascii\"
Content-Transfer-Encoding: quoted-printable

<html><pre>
Meine Tabelle

+-------+----------+
| id    | analysis |
+-------+----------+
| 36190 |      219 |
| 36192 |      219 |
| 36273 |      219 |
| 36275 |       -1 |
| 36276 |       -1 |
| 36289 |      219 |
| 36293 |      122 |
| 36371 |      219 |
| 36388 |      219 |
| 36393 |      219 |
| 36394 |       -1 |
| 36395 |       -1 |
| 36708 |      122 |
+-------+----------+
</pre></html>
--_$BOUNDARY_--

" | mail.mailutils -s "Mein Subject" \
-a Content-Type:"multipart/alternative; boundary="\"_$BOUNDARY_\"" \
-a From:mein@absender.tld mein@empfaenger.tld

Diese Tabelle sieht jetzt sauber aus, wenn sie den Empfänger erreicht. Die Leerzeilen vor und nach dem Boundary und/oder Headern sind wichtig!

Wenn ich ein Bild in das HTML einbetten will, wird es komplizierter. Das mail-Tool kann zwar mit -A Anhänge verschicken, aber die kann ich dann nicht im HTML nutzen, da ich die dazugehörige ID nicht kenne.
Also muss ich das händisch machen, damit ich alle Parameter kontrollieren kann. Da Email ein 7-Bit Medium ist, muss ich aus dem Binär-Bild ASCII machen und dann noch dem Mailprogramm erklären, wie es das ASCII wieder in eine Binär-Bilddatei zurückverwandelt. Ich benutze hier base64 dafür, da das standardmässig installiert ist und so ziemlich jedes Mailprogramm das versteht. Ausserdem muss ich dem Bild einen Namen geben, denn der Dateiname geht verloren beim encoden in base64, und dazu eine ID, mit der ich darauf verweisen kann im HTML-Code der Mail. So gehts:

# generiere random boundary und Image ID
BOUNDARY=$(date | md5sum | head -c8)
IMAGEID=$(date | md5sum | head -c10 | rev)
# meine Bilddatei
IMAGEFILE=graph.png
( echo "
--_$BOUNDARY_
Content-Type: text/html; charset=\"us-ascii\"
Content-Transfer-Encoding: quoted-printable

<html>
Mein Graph als Bild:<br>
<img contenttype=3D\"image/png\" src=3D\"cid:$IMAGEID\"><br>
Sieht gut aus!

</pre></html>

--_$BOUNDARY_
Content-Type: image/png;name=\"$IMAGEFILE\"
Content-Disposition: attachment;filename=\"$IMAGEFILE\"
Content-ID: <$IMAGEID>
Content-Transfer-Encoding: base64 
"
base64 $IMAGEFILE 
echo "
--_$BOUNDARY_--" ) |  mail.mailutils -s "Mein Subject" \
-a Content-Type:"multipart/related; boundary="\"_$BOUNDARY_\""; type="\"multipart/alternative\""" \
-a MIME-Version:"1.0" \
-a From:mein@absender.tld mein@empfaenger.tld

Es gibt ausser mail.mailutils noch viele andere Commandline-Mailer wie etwa mutt oder mailx. Mit Hilfe der Beispiele oben kann man auch diese Mailer dazu bringen, HTML zu verschicken. Einfach mal gucken, welche Tools auf dem System installiert sind. Auch OS X kann das.

HTML emails mit mail.mailutils