Lokale Shell-Befehle einbinden

„ls -la“ kennt Ihr vermutlich aus jedem Konsolen-Tutorial für Linux. Aber habt Ihr auch schon mal einen lokalen Befehl nur für Euch gebaut ?

Globale oder Lokale Befehle ?

Globale Befehle kennt vermutlich jeder Linuxuser, denn alles was in /bin/ als Programm abgelegt und für alle Benutzer ausführbar ist, kann aufgerufen werden. Meistens laufen diese Programme im Context des aufrufenden Benutzers. Ausnahmen gibt es nur, wenn das SETUID-Flag gesetzt ist, dann darf jemand einen Befehl als ein bestimmter User ausführen. Üblicherweise ist das Root, aber andere user sind auch denkbar. „ls“, „find“, „uname“ usw. sind solche Befehle. So weit, so normal.

Wer den Videobeitrag Wie starten sich eigentlich Programme? gesehen hat, der ist da jetzt schon weiter, denn dort wird das genau erklärt. Kann ich Euch nur empfehlen, weil damit ist das hier möglich :

[marius@eve ~]$ firefox
Ich bin aber nicht der FireFox!
insgesamt 20
drwxrwxr-x. 2 marius marius 4096 14. Jul 09:45 .
drwxr-xr-x. 5 marius marius 4096 5. Jul 23:48 ..
-rwx——. 1 marius marius 100 14. Jul 09:45 firefox
-rwx——. 1 marius marius 112 5. Jul 23:48 fixrom
#!/bin/bash

echo „Ich bin aber nicht der FireFox!“

ls -la ~/.local/bin/
cat ~/.local/bin/firefox

[marius@eve ~]$

„Nicht die Mama“

Ok, Firefox ist jetzt nicht mehr Firefox .. super.. Browser kaputt gemacht 🙁 Was wäre, wenn im System ein Firefox Quantum installiert ist, der User aber Quantum ******** findet und lieber noch FF 52 ESR nutzen will? Egal welches Programm Firefox für seine Webseitendarstellung aufruft, es wird immer der systemweit installierte Firefox genommen. Der kleine Trick hier könnte das auf den Firefox ESR umleiten. Das wäre nur lokal für diesen Benutzer der Fall.

Wesentlich praktischer ist das andere kleine Programm in dem .local/bin Verzeichnis: fixrom . Wer den Beitrag über das fehlerhafte Fehlerfenster bei Runes of Magic gelesen hat, der weiß was es tut: Es verschiebt ein Fenster, daß nutzlos im Weg ist und dazu noch so defekt, daß man das nicht per Maus machen kann.

Da ich das kleine Script in das Lokale Bin-Verzeichnis verschoben habe, kann ich es von überall aus aufrufen und muß nicht mal den Pfad kennen, wo es wirklich liegt. ALT+F2 und die Eingabe von „fixrom“ startet es genauso, also wenn ich es in der Konsole eingebe. Ich kann es auch pauschal in die Desktopicons einbauen:

[marius@eve ~]$ cat Schreibtisch/Runes\ of\ Magic.desktop | grep Exec
Exec=env WINEPREFIX=“/home/marius/.wine“ wine C:\\\\windows\\\\command\\\\start.exe /Unix „/home/marius/Programme/GameforgeLive/Games/DEU_deu/Runes Of Magic/Runes of Magic.exe“

Dann würde es direkt nach dem Start von Runes of Magic gestartet werden und mir das Fenster sofort vom Hals halten. Aber, dann würde es auch bei jedem Start laufen und es muß nur eine Instanz davon aktiv sein, daher starte ich das von Hand. Gut, ich könnte das Script auch mit einem PID File versehen und prüfen ob es schon läuft und dann den Start umgehen, zeige ich vielleicht sogar mal 🙂

A Truth about Red Hat

Der vollständigkeithalber muß ich erwähnen, daß das mit dem Firefoxersatz unter Fedora nur klappt, wenn man seinen Pfad korrigiert. Wer nicht weiß was ein Pfad ist, schaut sich bitte das Video an. So sieht der Pfad unter Fedora aus:

$ echo $PATH
/usr/lib64/qt-3.3/bin:/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/usr/sbin:/usr/sbin:/home/marius/.local/bin:/home/marius/bin:/usr/sbin/:/usr/sbin

So müßte er aussehen:

[marius@eve ~]$ echo $PATH
/home/marius/.local/bin:/home/marius/bin:/usr/lib64/qt-3.3/bin:/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/usr/sbin:/usr/sbin:/usr/sbin/:/usr/sbin

macht man übrigens so :

[marius@eve ~]$ export PATH=/home/marius/.local/bin:/home/marius/bin:$PATH

Natürlich müßt Ihr meinen Usernamen in Euren Änderungen durch Euren Namen ersetzen 😉

Wieso Fedora/Red Hat den Pfad so unbrauchbar gemacht haben, ist mir ein Rätsel, denn genau für solche Spielereien sind die lokalen Bin-Verzeichnisse da. Jetzt könnte man argumentieren, daß ein Angreifer damit den (im Beispiel) Firefox lokal ersetzen könnte und so ggf. noch mehr Schaden beim User durch Spionage anrichten kann. Das wäre zwar richtig, aber jeder, der von Remote da was hinlegen kann, kann noch ganz andere Dinge und hätte das Angriffsszenario nicht nötig 😉

Solange man aber nicht vor hat, ein Systemprogramm zu ersetzen, ist der Pfad eigentlich egal, nur .local/bin/ müßte halt drin vorkommen.

Jabbermeldungen von der Konsole schicken

Normalerweise geht man davon aus, daß Jabber/XMPP-Clienten von Menschen bedient werden. IM macht ja nur sinn, wenn jemand anderen was schicken will. Dieser Andere muß aber nicht notwendigerweise ein Mensch sein, ein Server tut es natürlich auch.

„SendXMPP“ heißt der Befehl. Das in Perl geschriebene Script ist nicht ganz fehlerfrei, aber dafür kommt es mit TLS Unterstützung, was es sympathisch macht, da so die Verbindung zum eigentlichen Jabberserver brav verschlüsselt wird.

echo "Das sieht aus, wie eine normale Nachricht auch aussieht." | sendxmpp -n -t  -u "Shell.Bot" -j xmpp.server.de -p 02332dfs09329324jfd  Ziel@xmpp.server.de

Da die Eingaben von STDIN angenommen werden oder von einer Datei stammen dürfen, kann man das Script praktisch an so alles ranstöpseln, was Statusinformationen loswerden will. Das geht soweit, daß man es über Webseiten z.b. zum Senden von Kundennachrichten an den Support benutzen kann.

Jetzt fehlt eigentlich nur noch eine Shelllösung zum Abchecken, ob das Ziel überhaupt online ist. Damit könnte man dann den Livechat auf der Webseite ausgrauen, wenn niemand erreichbar ist. Da Jabberclienten i.d.R. beliebig viele JabberAccounts verwalten können, hat man natürlich richtig viele gute Möglichkeiten hierarchisch strukturiert Kundensupport zu leisten und auch verschiedene Quellen bei Personen zusammen zu führen.

Anmerkung: Die Config von sendxmpp liest die „derzeit“ aktuelle Version leider nicht sauber ein, deswegen die Parameter. Im Prinzip kann man die aber an einen Linux-Useraccount binden und muß die dann nicht mehr eingeben.

Fehlermeldungen:

„Use of uninitialized value in string eq at /usr/bin/sendxmpp line 515
Error ‚AuthSend‘: [?]“

Wer die findet, sollte die Parameter für Usernamen/Server/Passwort in die Kommandozeile verlagern.