Kategorien
Randnotiz Schulung

CLI: mySQL pgsql Spickzettel

Zur Zeit arbeiten wir im Team an der Programmierung mit zwei unterschiedlichen Datenbank Backend’s: mySQL und Postgres. „Mal eben“ die Struktur einer Tabelle aufrufen, läuft über die Bash CLI unterschiedlich.

schnelle CLI Befehle

BeschreibungmySQLpgsql
einfaches Loginmysql -u user -h IP -p -D db
psql -U user -h IP -d db
Befehlsausführung
ohne Login
mysql -u user -h IP -p -D db -e "select * from tabelle;"psql -U user -h IP -d db -c "select * from schema.tabelle;"
Auflistung Datenbankenshow databases;\l+
Auflistung Tabellenshow tables;\dt+
Kontext Datenbankuse database;\c db
Beschreibung Tabelledescribe table;\d+ table
Auflistung Schemasshow schemas;\dn+
Postgresql: Tabellen werden mit \dt in Bezug auf Schema und Suchpfad aufgelistet. Als Standard ist nur der Suchpfad "public" eingestellt. Der Suchpfad kann temp. mit "SET search_path TO schema1,schema2,public" oder dauerhaft durch "alter database db set search_path = schema1,schema2, public;" eingestellt werden.

Obacht mit Großschreibung im Schema! Ein Schema mit Großschreibung im Suchpfad, wird in Kleinbuchstaben gespeichert. Das Schema ist als String zu maskieren!

Kategorien
Randnotiz

Datei Säuberungsaktion

Eine Unart ist es, Sonderzeichen in Datei- oder Ordnernamen zu vereinbaren.

Der Grund ist mir nicht klar. User, eben.

Sonderzeichen sind häufig ein Grund für seltsame Fehler, wenn es um die
Verarbeitung von Dateien geht. Dateinamen mit Sonderzeichen oder Umlauten
lassen sich auf Anwenderebene problemlos vereinbaren – mit Einschränkungen.
Linux mag keine Komma oder Semikolon, Windows verträgt keine | im Namen.

Kurz: Vor der Verarbeitung, insbesondere Datenarchivierung, sollte das
entfernt werden.

Mittels find /dir -type f *[üÜöÖäÄß]* -exec sed.. usw. kann man alle Fehler
nach eigenem Gusto beheben.

Tipp: Einfacher, schneller und fehlerfrei ist detox. Leider nicht in jeder
Distribution enthalten. Debian ist kein Problem – RedHat verwaist auf RPM aus
Fremdquellen.

Hat jemand schönere Lösungen?

Kategorien
Allgemein Randnotiz Schulung

tar: Archive anlegen

Vor geraumer Zeit war das auch Thema im CCGL (Link) – wie nutze ich TAR um Archive verschlüsselt auf einem öffentlichen Laufwerk zu sichern.

Zahlreiche Varianten neben TAR/aespipe/split nutze ich. Eine weitere und sicherere Art ist es, TAR in Kombination mit OpenSSL zu nutzen. Zunächst aber das Handling.

Im CCGL haben wir TAR als Stream durch „split“ in kleinere Pakete zerteilt. Das kann TAR auch alleine:

tar -cvML 1945600 -V Testlauf  –files-from=tarliste.txt -F ‚echo sicherung/${TAR_ARCHIVE}-${TAR_VOLUME} >&${TAR_FD}‘ -f test.tar

Wir sehen, analog zum Beispiel im Link, ein Multi-Volume (M), begrenzt auf eine Bandlänge (L) von 1.9GB. Ohne das Script (F) würde der Befehl zum Wechseln des Mediums auffordern, wenn eine Menge von 1.9GB geschrieben wurde. Die Datei, die wir anstatt Band mit (f) konfiguriert haben, wird zur Laufzeit im Parameter TAR_FD (File Descriptor) gehalten und mit dem Script bei jedem „Bandwechsel“ neu gesetzt. Coole Sache! Aus test.tar wird nach den ersten 1.9GB dann 2-test.tar. Mit „V“ setzte ich gerne Label – vergleichbar mit dem Aufkleber den wir früher auf die Band Rollen oder Disketten geklebt haben.

Versuchen wir den Inhalt darzustellen, ohne zu Wissen das es sich um ein Multi Volume Archiv handelt:

Man erkennt die Problematik? Sicherlich wenn man das ganze mit dem Multi Volume Script sieht:

Das Archiv wird nahtlos und vollständig aufgelistet. Es wird nur das Label des ersten Archivs aufgeführt.

Wenn ich Zeit finde, zeige ich wie ich das in meinem jetzigen Projekt gelöst habe und wie man das Archiv verschlüßelt ablegt.

Kategorien
Allgemein

bash: SQL und JSON Datenquelle

Nextcloud Talk nutze ich nicht nur Privat, ich nutze es auch gerne produktiv um Werte zu beobachten und zu berichten.

Es ist Admin Alltag: Mal nimmt man sich die Zeit, Funktionen sauber zu schreiben – wie unten im Bild unter Punkt 1: Schön schnell, in C mit Postgres SQL Cursor programmiert – aber auch im selben Bash Script, Q&D in PHP und jq. In Bezug auf Sicherheit und Schnelligkeit werde ich den PHP/jq Part wohl rausnehmen.

Aber: Wichtig für den User ist, das es läuft. Und das tut es 😉 .

Was sind so Eure „Admin Sünden“?

Kategorien
Randnotiz

bash: wieistmeineip

Der Dienst, mit dem schnell die eigene IP abgelesen werden kann ist mir zu umständlich. Mittlerweile auch hoffnungslos mit Werbung überladen.

Einfacher, wenn man sich ein kleines schlankes Script schreibt. Hier (m)ein Beispiel (auch Live) :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#!/bin/bash
wetter=$(curl -H "Accept-Language: de" http://wttr.in/?0)
ip=$(curl ifconfig.co/ip)
ort=$(curl ifconfig.co/city)
cal=$(cal -w --color=always)
datum=$(date "+%0H Uhr und %0M Minuten")
clear
cat <<EOT
Hallo $USER
Ext IP:     $ip
Lokation:   $ort
Systemzeit: $datum
$cal
$wetter
EOT

Einfach ausprobieren, anpassen und mir eventuell eigene Ideen zukommen lassen.

Einige Feinheiten noch: Wenn die Darstellung von IPv6 nicht gewünscht ist, die Zeile so abändern –> ip=$(curl -4 ifconfig.co/ip). So ist auch mit den anderen Befehlen zu spielen, bis die Darstellung den Wünschen entspricht. Der Calendar verhält sich übrigens von Distribution zu Distribution unterschiedlich.

Die farbliche Darstellung des Wetters ist nicht immer gewünscht. Das lässt sich durch: http://wttr.in/?0?T vermeiden.

Viele Optionen sind zu entdecken. Viel Spass!

Kategorien
Randnotiz

Terminal Setting

Historische Farben der Monochrom Terminals

Abhängig vom verwendeten Phosphor in der Röhre (Link)

Bernstein 590-610 nm (mein Favorit rgb(221,133,0))

rgb(255, 183, 0) bis rgb(255, 155, 0)
Hex: #ffb700 bis Hex: #ff9b00

Grün 505-555 nm

rgb(0, 255, 84) bis rgb(179, 255, 0)
Hex: #00ff54 bis Hex: #b3ff00

Blau 430 nm

rgb(61, 0, 255)
Hex: #3d00ff

Rot 717 nm Nixdorf Terminal

rgb(220, 0, 0)
Hex: #dc0000

Weiss (Blau) Der DEC VT100 arbeitete mit der Kombination der Wellenlängen 540 und 410 nm (P4 Phosphor)

Beispiel Live

rgb(206,236,255) bis rgb(194,197,198)

Kategorien
Randnotiz

BASH: Wer hat was gemacht

Viele User die am System arbeiten: Nachher will es keiner gewesen sein, wenn das System Fehler produziert.

Eine Log-Datei, die den User und alle abgesetzten Befehle mit PID und Return-Value aufzeichnet, schafft Transparenz. Editieren wir zuerst die /etc/bash.bashrc und fügen

1
export PROMPT_COMMAND='RETRN_VAL=$?;logger -p local6.debug "$(whoami) [$$]: $(history 1 | sed "s/^[ ]*[0-9]\+[ ]*//" ) [$RETRN_VAL]"'

hinzu. Damit weisen wir an, alle eingeben Befehle dem „logger“ zu übergeben, an den rsyslog Channel „local6“ mit Username und Rückgabewert zu übergeben. sed beschneidet lediglich die lfd. Nummer aus der Historie. Jetzt leiten wir local6 in eine Datei um. Dazu editieren wir /etc/rsyslog.conf und fügen hinzu:

1
local6.*    /var/log/historie

Auch wenn der User innerhalb der Session wechselt, ist das jetzt nachvollziehbar. Wenn jemand andere Lösungen kennt, bitte mailen oder anrufen.

Kategorien
Randnotiz

BASH: Auswertung Rückgabewert

Riesige TAR-Files und langsame Internetverbindungen sind der Garant für Frust und fehlerhafte Backups. Ein kleines Script sorgt für penetrante Neustarts bis die Aufgabe erledigt ist.

1
2
3
4
5
6
7
8
#!/bin/bash
ergebnis=1
 
until [ $ergebnis -eq 0 ]
do
	rsync -avP /Sicherung.tar  user@host:.
	ergebnis=$?
done

Der Prozess rsync gibt „return 0“ zurück, wenn er erfolgreich beendet wir. Bricht der Prozess aus irgendeinem Grund ab – zB. Verbindungsabbruch- wird der Prozess neu gestartet.

Ganz besonders fein, wenn man je nach return Wert, zum Beispiel eine EMail generieren lässt.

Kategorien
Allgemein

Individuelle Anwendungen

Viele Geräte in ihrem Netzwerk können technisch angesprochen und befragt werden. Sie antworten mehr oder weniger freudig.

Es können Drucker, PC’s oder Fernsehgeräte sein. In meinem kleinen Beispiel sind es IP Kameras. Mit einem kleinen BASH Script, das alle 5 Minuten gestartet wird, sammle ich Daten über Zustand und Arbeit der IP Kameras, die Bestandteil einer Meldeanlage sind.

Kategorien
Randnotiz

Bash: Webhooks in MS Teams

Microsoft Teams lässt sich hervorragend für den EDV Support nutzen. Wie wäre es wenn der Kunde von der Website aus, direkt in den Techniker Kanal im Teams posten kann? Oder der Kundenserver im Fall einer Warnung, diese direkt publiziert?

Ein Webhook läßt sich jedem Kanal in jedem Team hinzufügen – Wir haben im Workshop ausgiebig geübt. Bisher haben wir Webhooks genutzt, um via Microsoft Visual Code, ganze Listings oder einzelne Zeilen im Micosoft Teams zu publizieren und zu diskutieren. Kopieren wir uns die URL des Webhooks.

Einstellung / Verwaltung der Connectoren in einem Kanal

Wie überträgt man nun eine Nachricht über den Webhook an den Microsoft Teams Kanal? Kurz: curl -H „Content-Type: application/json“ -d JSON URL. Diese Zeile in einem Bashscript würde ausreichen um eine Nachricht, als JSON Datensatz formatiert, der Webhook URL zu übergeben. Als Beispiel ein Bash Script:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#!/bin/sh
 
# Thomas Schilling Oktober 2019
# Testscript Webhook in Microsft Teams
 
WEBHOOK_URL="https://outlook.office.com/webhook/...."
TITLE=$1
shift
COLOR="#FF0000"
TEXT=$1
 
MESSAGE=$( echo ${TEXT} | sed 's/"/\"/g' | sed "s/'/\'/g" )
JSON="{\"title\": \"${TITLE}\", \"themeColor\": \"${COLOR}\", \"text\": \"${MESSAGE}\" }"
 
curl -H "Content-Type: application/json" -d "${JSON}" "${WEBHOOK_URL}"

Mit Aufruf des Bash Scripts übergeben wir eine Überschrift und einen Text. Das ist beliebig. Zum Beispiel möchte ich aktuelle Warnmeldungen der bund.de im Kanal veröffentlichen. In einem vorherigen Workshop haben wir mit den Wetterdaten bereits gespielt. Das PHP Script nutzen wir.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?php
$url = file_get_contents('https://warnung.bund.de/bbk.mowas/gefahrendurchsagen.json');
 
$json = json_decode($url);
$z = 0;
foreach ($json as $idx => $inhalt){
$m1 = $inhalt->info[0]->headline;
$m2 = $inhalt->info[0]->description;
        foreach ($inhalt->info[0]->area as $id2 => $in2){
                if ($in2->geocode[0]->value=='053780000000'){
                    $z++;
                    print('{"data": { "head": "'.$m1.'"}}');                
                    shell_exec('/teams.sh "'.$m1.'" "'.$m2.'"');
                } 
       }
}
if ($z==0){
print('{"data": { "head": "keine Gefahrenmeldung"}}');
}
?>

In den Zeilen 7 und 8 werden Überschrift und Gefahrenmeldung aus dem SOAP Array gelesen. In Zeile 13 rufen wir das obige Bash Script auf – In Zeile 8 des Bash Scripts teilen wir die übergebenen Texte. Die Farbe, der Meldung in Teams, ist im Bash Script in Zeile 13 im JSON Datensatz.

Meldung im Kanal
Gefahrenmeldung mit auffälliger Farbe im Kanal

Mit dem Bash Script lässt sich jeder Text publizieren. Zum Beispiel Fehlermeldungen oder Warnungen eines Kundenservers.