Banner

Sendxmpp - Jabber Benachrichtigungen via CLI

Neulich bin ich Ubuntuusers Wiki auf ein äußerst interessantes CLI (Command Line Interface) Tool gestoßen: Sendxmpp – Damit lässt sich Jabber in Skripten ähnlich wie Mail verwenden. Die Einsatzzwecke sind also schier unbegrenzt. Für folgende Anleitung wird mindestens ein Jabber-Konto auf einem beliebigen Jabber Server (web.de und gmx funktionieren nicht, GTalk bedarf etwas Anpassungen) vorausgesetzt. Es empfiehlt sich, wenn sendxmpp dauerhaft auf einem Server genutzt wird ein eigenes Jabber Konto für jenes anzulegen.

Die Installation/Einrichtung

Sendxmpp kann aus den Paketquellen (logischerweise) über das Paket sendxmpp installiert werden:

user@server:~$ sudo apt-get install sendxmpp

Anschließend legt man in seinem Home die Datei .senxmpprc mit den Authentifizierungsdaten für das Jabber Konto an:

user@server:~$ nano .sendxmpprc

..., füllt sie mit den Logindaten, die in folgender Form angeben werden:

#user: Benutzer auf dem Jabber Server
#jabber-server: Domain/Adresse des Jabber Servers
#Passwort: Passwort für den Login
user@jabber-server Passwort

....und vergibt die benötigten Rechte:

user@server:~$ chmod 600 .sendxmpprc

Der erste Test

Für einen ersten Test sendet man sich am Besten selbst eine Nachricht. Dazu kann sendxmpp beispielsweise mit folgendem Aufruf ausgeführt werden:

user@server:~$ echo 'Dies ist ein Test' | sendxmpp user@jabber-server

Hier erhält der Jabber User user@jabber-server die Nachricht "Dies ist ein Test". Der Empfänger (in diesem Fall user@jabber-server) sollte das eigene Jabber Konto sein.

Klappt dieser Test ohne Probleme und die Nachricht kommt an, kannst du den nächsten Schritt überspringen. Leider kommt es aber in Kombination mit dem Jabber-Server Openfire zu Fehlermeldungen in folgender Art:

Error 'AuthSend': error: not-authorized[?]
Can't use an undefined value as a HASH reference at /usr/share/perl5/XML/Stream.pm line 1165.

Um dies zu beheben muss in der Datei /usr/share/perl5/Net/XMPP/Protocol.pm eine Zeile auskommentiert werden:

user@server:~$ sudo nano /usr/share/perl5/Net/XMPP/Protocol.pm

Darin nach AuthSend suchen ([Strg]+w und AuthSASL eingeben und [Enter] drücken) und ind folgenden Zeilen (etwa Zeile 1809):

    if($self->{STREAM}->GetStreamFeature($self->GetStreamID(),"xmpp-sasl"))
{
return $self->AuthSASL(%args);
}
return $self->AuthIQAuth(%args);

"return $self->AuthSASL(%args);" auskommentieren:

    if($self->{STREAM}->GetStreamFeature($self->GetStreamID(),"xmpp-sasl"))
{
#return $self->AuthSASL(%args);
}
return $self->AuthIQAuth(%args);

Anschließend sollte sendxmpp funktionieren.

Die Bastelei kann beginnen

Auf Ubuntuusers werden bereits einige Beispiele angeführt:

#Das Syslog per Tail über Jabber "umleiten":
user@server:~$ tail -f /var/log/syslog | sendxmpp -i user@jabberserver

#Die öffentliche IP mitteilen:
user@server:~$ wget --quiet -O - http://showip.spamt.net | sendxmpp user@jabberserver

Auch auf der Projektseite findet sich ein interessantes Anwendungsbeispiel:

#Bei hoher Load informieren:
if test "$cpuload" -gt "$CPULOADMAX"; then
top -b -n 1 | sendxmpp -s "wake up! cpu load $cpuload at `hostname`" user@jabberserver
fi

Login Wächter

Ich habe folgende vor längerem auf linux-magazin.de vorgestellte Skriptzeile für Sendxmpprc " angepasst":

echo 'Login on' `hostname` `date` `who`|  sendxmpp -r `hostname` -s "Login on `hostname` `who |  awk '{print $5}'`" user@jabber-server

So erhält in diesem Fall, wenn diese Zeile in der globalen Bashrc untergebracht wird, der Jabber User user@jabber-server bei jedem Login auf dem Server eine Jabber Nachricht mit Informationen zum Login. Das kann die Sicherheit des Systems natürlich um ein vielfaches erhöht werden, da jeder Login sofort erkannt wird. Die Geschichte hat nur ein fettes Probleme:

  • Eigentlich würde sich das Anlegen einer "globalen" .sendxmpprc empfehlen, die von allen Usern genutzt werden kann. Ansonsten muss für jeden User auf dem System eine .sendxmpprc im jew. Home angelegt werden. Leider dürfen die Rechte an der .sendxmpprc immer nur einem Systembenutzer und keiner Gruppe (Rechte 600) gehören. Somit braucht jeder Systembenutzer, wenn dies Loginbenachrichtigung mit allen Benutzern funktionieren soll, eine eigene .sendxmpprc!
  • Eine Alternative wäre die Übergabe der Zugangsdaten direkt in der Skriptzeile, was sicherheitstechnisch kritisch ein könnte.
  • Auf Ubuntuusers wird aus sicherheitstechnischen Gründen geraten einen extra Benutzer für Sendxmpp anzulegen. Dies ist für den Einsatz in Skripten, die von root ausgeführt werden auch ohne Probleme möglich. Da die Befehle in der Bashrc allerdings immer von dem jeweiligen Benutzer ausgeführt werden (..und nicht nur von root), ist eine Verwendung von sudo ohne Passworteingabe nicht möglich. Somit entfällt diese Möglichkeit.

Im folgenden werde ich auf die beiden möglichen Möglichkeiten eingehen. Zuerst muss sichergestellt werden, dass die globale Bashrc unter /etc/bash.bashrc in der /etc/profile gesourced wird:

user@server:~$ cat /etc/profile

Das Ergebnis sollte etwa so aussehen:

# /etc/profile: system-wide .profile file for the Bourne shell (sh(1))
# and Bourne compatible shells (bash(1), ksh(1), ash(1), ...).
if [ -d /etc/profile.d ]; then
for i in /etc/profile.d/*.sh; do
if [ -r $i ]; then
. $i
fi
done
unset i
fi
if [ "$PS1" ]; then
if [ "$BASH" ]; then
PS1='\u@\h:\w\$ '
if [ -f /etc/bash.bashrc ]; then
. /etc/bash.bashrc
fi
else
if [ "`id -u`" -eq 0 ]; then
PS1='# '
else
PS1='$ '
fi
fi
fi
umask 022

Wichtig sind folgende Zeile:

    if [ -f /etc/bash.bashrc ]; then
. /etc/bash.bashrc
fi

Sollten diese nicht zu finden sein, muss die /etc/profile angepasst werden:

user@server:~$ sudo nano /etc/profile

Anschließend fügt man in der globalen Bashrc

user@server:~$ sudo nano  /etc/bash.bashrc

...falls jeder Benutzer eine .sendxmpprc besitzt folgende Zeile ein:

echo 'Login on' `hostname` `date` `who`|  sendxmpp -r `hostname` -s  "Login on `hostname` `who |  awk '{print $5}'`" user@jabber-server

Hierbei muss user@jabber-server an den tatsächlichen Empfänger angepasst werden. Soll der Weg über die direkte Passwortübergabe gewählt werden, muss folgende Zeile verwendet werden:

echo 'Login on' `hostname` `date` `who`|  sendxmpp -u jabberuser -j jabber-server -p Passwort -r `hostname` -s  "Login on `hostname` `who |  awk '{print $5}'`" user@jabber-server

Dabei muss auch wieder der Empfänger (im Beispiel: user@jabber-server) und außerdem der Loginname auf dem Jabberserver (im Beispiel nach dem -u: jabberuser), der Jabberserver (im Beispiel nach dem -j: jabber-server) und das Passwort für den Jabberlogin (im Beispiel nach dem -p: Passwort) angepasst werden.

Nun kann man sich testweise auf dem Server einloggen und checken, ob man per Jabber eine Benachrichtigung erhält.

Fazit

Sendxmpp bietet die Möglichkeiten XMPP wie Mail zu verwenden. Ich setze dieses Tool unter anderem zum Senden der aktuellen Wetterdaten einer 1-Wire Wetterstation ein. Viele weitere Einsatzzwecke sind möglich und durchaus sinnvoll. Allerdings sollte der Sicherheitsaspekt nicht vernachlässigt werden. Werden Skripte unter root ausgeführt, sollte auf den Einsatz eines separaten User nicht verzichtet werden (siehe Ubuntuusers)!

Weitere Optionen und eine ausführliche Erklärung jener, können in den Manpages von Sendxmpp nachgesehen werden:

user@server:~$ man sendxmpp

Zu erwähnen ist noch, dass einige Jabberserver eine TLS-Verschlüsselung fordern. Diese kann mit der Option -t erreicht werden (Danke an Jan):

user@server:~$ echo 'Dies ist ein TLS-Test' | sendxmpp -t user@jabber-server


RSSfeed

Hat dir dieser Artikel weiter geholfen? Abonniere neue Beiträge dieses Blogs per RSS-Feed.

Bist du an der Entwicklung dieses Projektes interessiert? Dann folge uns doch auf Twitter!

Der Autor dieses Beitrags würde sich sehr freuen, wenn du ihm einen Kommentar hinterlassen würdest.

Kommentar schreiben


Sicherheitscode
Aktualisieren

Anmelden

Suche

Neuste Kommentare

RSS
Copyright © 2009-2016 mein.homelinux.com

Creative Commons License