CLI: mySQL pgsql Spickzettel

Ich kann es mir nicht merken 😉

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!

Tipp: Anpassung Script nach StableNet Update

Nach dem Update von StableNet von Version 10 auf 11 kann es zu Problemen mit sh Agent Scripts kommen.

Die Agent Scripts werden im neuen StableNet vor Aufruf (genauer) geprüft – sh Scripte wohl bemerkt. Der Parameter „Name“ darf nicht fehlen!

sh Script für StableNet Agent

Im StableNet 10 reichte es aus, wenn das sh Script als <parameters> lediglich <version> mitteilte. Jetzt ist auf einen belibigen <name> zu achten.

Grundsätzlich sind Änderungen im XML Schema bzgl. Business Process Scripts ergangen – unter Umständen erscheinen bei JAR Agent Scripts die Fehlermeldung „Attribute default is not allowed“ was dann in jedem AgentScript anzupassen ist.

Die MariaDB nicht auf die höchst mögliche Version updaten. Maximal Version 10.5.13. NICHT 10.5.16

Abgesehen davon läuft das Update einwandfrei.

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?

tar: Archive anlegen

Den Tape Archiver nutze ich ständig – für alles mögliche. Zahlreiche Möglichkeiten der Anwendung gibt es.

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.

fstab: auf richtige UID/GID achten

Kleiner Tipp am Rande:

Es ist gute Sitte, beim mounten von Freigaben eine UID nebst GID zu konfigurieren. Die Distributionen halten dazu eine kleine Falle bereit: Debian und RedHat vergeben im Standard >= 1000 für GID’s und >= 1000 für UID’s.

OpenSuse (Leap) oder SLES beginnen bei der Vergabe der GID bei 100!

Versucht man dann zB. ein WebDAV Laufwerk mit der GID 1000 zu mounten, kommt es zum Fehler: getuid() –> exit_group(1) , da die Gruppe in SLES >= 100 bekommen hat.

Ansible: Update Raspbian

Im CCGL halten wir unsere Raspberry Pi’s mit Ansible synchron. Je nach Aufgabe werden Softwarestände und Code gleich gehalten.

Bestimmte Task sollten aber nicht mit dem allgemeinen Playbook ablaufen: Löschen von Verzeichnissen, unbeabsichtigte Installationen und kein ausserplanmäßiges Update.

Dazu habe ich die kritischen Task’s mit dem Tag „never“ versehen. Das Tag „never“ sorgt dafür, dass dieser Tag „never“ abläuft. Es sei denn, wir geben ihn expliziet an.

Beim Aufruf also, auf den „-t“ Tag und eine eventuelle Beschränkung mit „-l“ auf die im Inventory konfigurierten Maschinen achten!

ansible-playbook -D  -i inventory/hosts tasks/main.yml -l pi -t update

Bis zum nächsten Workshop im CCGL 😉

Tipp: CEntOS 8 No URLs in mirrorlist

Kurzer Hinweis

Die Standrad Repositories für Installation und Updates müssen auf andere Quellen geändert werden. Das ist komfortabel automatisiert:

dnf –disablerepo ‚*‘ –enablerepo=extras swap centos-linux-repos centos-stream-repos

dnf distro-sync

Danach funktioniert dnf update und dnf install

Gibt es andere Lösungen? Oder habt ihr die Distribution gewechselt?

Tipp: Linphone abgehend ohne Audio

Kurzer Tipp wenn Linphone bei einem initiierten SIP Anruf kein Audio überträgt:

Ich nutze Linphone ohne Linphone Account. Es wird aber intern im Standard der STUN Server des zwangsweise konfigurierten Linphone-Account genutzt.

Findige Kollegen haben das durch Beobachtung mit Wireshark heraus gefunden:

Auch bei Anruf über den SIP Account, wird der Download-Stream über STUN.linphone.org erwartet. Nimmt man den Anruf temporär in „Hold“ und setzt wieder zurück, ist Audio in beide Richtungen verfügbar. Das Phänomen tritt nicht bei ankommenden Anrufen über den SIP Account auf!

Wenn kein Account auf Linphone.org genutzt wird, hilft der Eintrag in der /etc/hosts:

127.0.0.1        stun.linphone.org
127.0.0.1        sip.linphone.org

und alles läuft einwandfrei.

Bash: Spalte in CSV hinzufügen

Bei der Aggregation von CSV Files, die in EXCEL weiter verarbeitet werden

sollen, ist auf den Zeilenabschluss zu achten.

 

Automatisiertes hinzufügen einer SPALTE mit korrektem Zeilenabschluss:

 

sed ’s/\r/;\r/‘ datei.csv > datei_neu.csv

 

(wenn Original beibehalten werden soll)

oder mit direkter Verarbeitung:

 

sed -i  ’s/\r/;\r/‘ datei.csv

 

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
16
17
18
19
20
#!/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.