BITFOX® | LÖSUNGEN | SERVICE | LOGIN | BLOG | KONTAKT

Sonntag, 15. November 2020

BASH und JSON-Strings
Ein Erfahrungsbericht...

 ....so oder ähnlich könnte es nun heissen.
Das Problem war eigentlich, nur "mal eben" einen JSON-String "menschlich lesbar" anzuzeigen.
"Da muss doch schon mal wer was ordentliches gemacht haben?"

Nach ca. 2 Stunden suchen hatte ich jedoch immer noch nichts wirklich funktionierendes gefunden, was einen JSON-String "ordentlich" menschlich visualisiert - 
oder auch ggf. aus einem JSON-String einen Variablen-Bereich einfach wieder heraus gibt.

Na dann... bau ich da mal halt selbst - 

Auf geht's :-)


#!/bin/bash
#
# Funktionen zum Umgang mit JSON-Strings.
#
# 2020-11-13    Oliver Lenz    Initial
#

function parse_jsonvar_raw() {

        # Parse einen JSON-String in menschlich lesbare form.
        #
        # $1 JSON-String
        # $2 Tabulatorenweite (default:4) (optional)
        # $3 Filtere die Ausgabe anhand eines Variablennamens (optional), z.B. "value.name"
        #

        local buchstabe="" letzter_buchstabe="" zeile=""
        local in_gaensefuesschen=0 umbruch=""
        local variablenname="" variablenstack=()
        local ebene=0 anschlag=0
        local tabbreite=4 filter="" zurueck=0

        if [ $# -gt 1 ]; then
                [[ "${2}" =~ (^[0-9]*$) ]] && tabbreite=$2 || filter=".${2}"
        fi
        [ $# -gt 2 ] && filter=".${3}"

        function vartest() {
                local voller_variablenname="" i=0 s
                [ -n "${variablenname}" ] && variablennamenstack[${ebene}]="${variablenname}"
                voller_variablenname=""
                for((i=0;i<=${ebene};i++)){
                        s="${variablennamenstack[$i]#\"}"
                        s="${s%\"}"
                        voller_variablenname="${voller_variablenname}.${s}"
                } # printf "%-60s" "${voller_variablenname}"

                if [[ -z "${filter}" || "${filter}" == "${voller_variablenname}" || "${voller_variablenname:0:$((${#filter}+1))}" == "${filter}." ]]; then
                        [ "${filter}" == "${voller_variablenname}" ] && zurueck=$ebene # korrektur bei Filter
                        (( i=$anschlag-$zurueck*tabbreite ))
                        [ ${i} -gt 0 ] && printf "%${i}s" " "
                        [ -n "${zeile}" ] && echo "${zeile}"
                fi
                variablenname=""
                zeile=""
        }

        while read -n1 buchstabe; do

                if   [ "${in_gaensefuesschen}" == "1" ]; then
                        [ "${letzter_buchstabe}" != "\\" ] && [ "${buchstabe}" == "\"" ] && in_gaensefuesschen="0"
                elif [ "${letzter_buchstabe}" != "\\" ] && [ "${buchstabe}" == "\"" ]; then
                         in_gaensefuesschen="1"
                else
                        case "${buchstabe}" in
                                '{' | '[' | '(' | ',' ) umbruch="nach_buchstaben";;
                                '}' | ']' | ')'       ) umbruch="vor_buchstaben";;
                                ':')                variablenname="${zeile}";;
                                ' ')                buchstabe="";;
                        esac
                fi

                [ "${umbruch}" == "vor_buchstaben" ] && vartest && (( ebene-- ))

                zeile="${zeile}${buchstabe}"

                [ "${umbruch}" == "vor_buchstaben" ] && (( anschlag=ebene*tabbreite ))

                if [ "${umbruch}" == "nach_buchstaben" ]; then
                        vartest
                        [ "${buchstabe}" != "," ] && (( ebene++ ))
                        (( anschlag=ebene*tabbreite ))
                fi

                letzer_buchstabe="${buchstabe}"
                umbruch=""
        done<<<"${1}"
        [ -n "${zeile}" ] && vartest
}

function parse_jsonvar(){
        ausgabe="$( parse_jsonvar_raw "${1}" "${2}" "${3}" )"
        [ -n "${ausgabe}" ] && echo "${ausgabe%,}"
}

# json_str='value:{"name":"Hello World","myNumArray":{"index0":"Hello","varname":"value","some":"thing"}}'
# parse_jsonvar "${json_str}"
# parse_jsonvar "${json_str}" 8
# parse_jsonvar "${json_str}" 4 "value"
# parse_jsonvar "${json_str}" 4 "value.name"
# parse_jsonvar "${json_str}" 4 "value.myNumArray"


Geht doch... :-)

Donnerstag, 12. November 2020

Arrays bzw. Stacks mit der BASH-Shell

Wer Scripte in der BASH-Shell schreibt, der hat hin und wieder sehr unangenehme Erfahrungen mit Arrays:  Ist man hier nicht sehr genau in der Syntax, gehen Einträge verloren, oder man erhält Null-Einträge.

Anbei eine Idee, wie man das Problem mit üblichen Funktionen wie

  "push" (etwas auf den Stack legen),  
  "pop" (das letzte Element vom Stack zeigen und löschen),
  "delete_from_stack" (ein gezieltes Element vom Stack löschen) und
  "print_stack" (gebe einen Stack aus)

lösen kann.

Viel Spaß damit. :-)

Donnerstag, 8. Oktober 2020

BASH und die Zeitzone

Sehr  (un)gern stellt man oft fest, dass die Shell auf der man grade arbeitet in einer ganz anderen Zeitzone lebt, als von der man aus arbeitet.
Das Remote-System auf dem ich grade eingelogged bin, arbeitet z.B. in UTC.

$ date "+%c"

Wed Oct  7 23:26:47 UTC 2020


Da kann man als Europäer mal gar nichts mit anfangen.
Wie kommt man nun also an die Uhrzeit zu Hause?


Mittwoch, 23. September 2020

Monitoring mit Check_MK:
Wenn die Abfrage mal zu häufig kommt....

Bash...oder auch: Die Magie von "date".

Wer mit einem Bash-Script einen Checkpunkt für ein Monitoring-System wie z.B. Check_MK schreibt, der kennt wahrscheinlich das Problem:
Manchmal übertreibt ein Monitoring-System und ruft seinen Check von Remote so oft auf, dass die Ressourcen des zu überwachenden Clients schlichtweg zu ausgelastet sind.
Das Monitoring hilft also nicht mehr, sondern bringt den zu überwachenden Client zu Fall.

Man kann jedoch die Ausgaben eines Scriptes sehr einfach (selbst) Cachen und sollte das auch selbst übernehmen, denn die Caching-Mechanismen solcher Monitoring-Systeme sind auch gern mal etwas unberechenbar...

Wer z.B. wie gewohnt und brav nach Dokumentation in Check_MK mehrzeilige Ausgaben in /usr/lib/check_mk_agent/local/${CACHE_ZEITINDEX}/mein_check.bash  hinterlegt, der wird feststellen, dass diese nicht (mehr) funktionieren: Das Ergebnis wird einfach verschluckt und nicht angezeigt.
Mehrzeilige Ausgaben funktionieren anscheinend also nur noch in /usr/lib/check_mk_agent/local/ , wo jedoch dann kein Caching stattfindet und man den Client ggf. überlastet.

Ein Teufelskreis. :-) Was nun tun?
Ein kleines "if" mit "date" und die Ausgabe mit "tee" bringt hier einen Ausweg.

Hands on...!

Freitag, 4. September 2020

Wenn Windows 10 hinter einem Proxy nicht mehr updaten will....

"Mal eben" einen Proxy bauen, um die Geräte im Büronetzwerk ein wenig zu schützen und was passiert anschließend? Keiner der Windows10-Clients mag mehr so recht mit dem Update-Server von Microsoft sprechen. Das Problem scheint bekannt - doch eine wirkliche "Lösung" findet man im Internet nicht so recht....

Also - was tun?

Freitag, 7. August 2020

Wenn das Backup mal verstopft ist....

 ....ja was ist denn schon dabei? 

Da war er wieder, der klassische Moment auf der Console:

Man möchte "mal eben" ein CentOS-System neu aufsetzen und vorsichtshalber die Konfigurationsdateien etc. sichern - man weiß ja nie so recht, ob man doch noch was braucht....

Doch die Backupsoftware sagt "nein" und "Fehler",
für ein dd-image fehlt ein zweiter Speicherort mit Platz
und man weiß grade lokal ohnehin kaum aus dem Stehgreif, was man einpacken sollte.

Na dann.... bist du nicht willig.... dann nehme halt ein wenig Commandline-KungFu...

Mittwoch, 5. August 2020

Schatzi, ich weiss wo du deine eMails schreibst.

Es fing damit an, dass ich lediglich "Mal eben[tm]" einen Windows-Client neu installierte: Browser, eMail, etc.  -
und ich empfing die Test-eMail auf meinem Laptop.
Nanau? In den ankommenden Maildaten versteckt, meldet sich auf einmal ein eMail-Useragent:

"User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:38.0) Gecko/20100101 Thunderbird/38.2.0"

Zu deutsch: Jeder Empfänger kann sehen: Ich schreibe eMails an einem Windows-Client des Kunden mit dem eMail-Programm Thunderbird in der Version 38.2 in 64 Bit.

Für einen Angreifer sind solche Informationen natürlich Gold wert, denn so kann man gleich den passenden Exploit heraussuchen, um den Empfänger einer eMail "zu beglücken".

Wer solche Informationen langfristiger sammelt weiß obendrein, wo der Absender seine eMails schreibt:
Erscheint der gleiche eMail-Client oft in einer Mail von MO-FR zwischen 10 und 14 Uhr auf , wird das wohl der Mailclient sein, der im Büro genutzt wird. 
(Hint: Klar - ggf. passt obendrein sehr häufig auch noch der Netzbereich der einliefernden IP des Mailclients, aber auf Grund von VPN kommt man mit dieser Data nicht so schön weit wie mit dem Header "User-Agent") 

Wahrscheinlich nutzt auch jemand einen anderen eMail-Client an seinem Handy, als an seinem PC; wahrscheinlich werden von dort gehäuft Mails zwischen 06:00 bis 08:00 Uhr bzw. zwischen 16:00 und 18 Uhr kommen.  Und so weiter, und so fort....

Mit etwas Dokumentations-Mühe erhält man so also mit einer sehr guten Wahrscheinlichkeit demnächst eine Vorhersage, wo der Absender seine eMail grade verfasst:
"Schatzi, ich weiss, dass du grade nicht auf der Arbeit bist." "Und ich auch - ihr Chef."

Doch was tun? [Hier weiter lesen.]

Montag, 13. April 2020

Windows-Installations-Sticks und die Sache mit der Version

Welches Stickchen hätten Sie denn gern?
Wer Windows 10 links und rechts auf PCs installiert, hat irgendwann einen schönen Strauß an erstellen USB-Installations-Sticks mit jeweils verschiedenen Versionen.
Aus der Erfahrung empfiehlt sicht durchaus, eine jeweils schon veraltete Installations-Version an die Seite zu legen und nicht immer nur das "Installationsimage des Tages" auf einen Stick zu brennen, denn so habe ich selbst immer wieder erlebt, dass sich ein Windows 10 auf einem Notebook nicht vom stick neu installieren ließ, weil die Installationsversion "zu neu" war.
Erst ein Stick aus den Anfängen von Windows 10 half hier oft weiter....

Doch wie ermittele ich nun von den ganzen herumliegenden USB-Stick die Windows-Version, um diese z.b. auf der Rückseite des Sticks zu vermerken?

Samstag, 28. September 2019

Yubikey und der Volks-Personalausweis-Reader Reiner SCT Cyberjack

Wer mit verschiedenen Plattformen arbeitet, z.B. Amazon, eBay, Blogger, etc., der kennt die üblichen "2Auth-OTP-Token" -
die Zweifach-Authentifizierung.

Beliebt dafür ist z.B. der Yubikey 5 - mit der ensprechenden App "Yubikey Authenticator" auf dem Handy, die einen OTP-Hash speichern bzw. einen dazugehörigen OTP-Key generieren kann, um sich "sicher" einzuloggen:
Den Stick an sein Handy halten um den Token zu generieren bzw. zu lesen - fertig.



Wenn man dann jedoch ohne Handy an seinem PC "mal eben" den Key eingeben will, muss man den USB-Stick dann umständlich in den USB-Port fummeln und das Programm am PC öffnen ...
Geht das denn nicht anders?

Donnerstag, 19. September 2019

Dauerbrenner: Die Sache mit den Kopfschmerzen
Amazon TV 4K-Stick und hoher Kontrast auf Samsung UE55JU6460

Heute mal ein interessanter Support-Fall von zu Hause. :-)

In den letzten Tagen war ich dann doch mal früher zu Hause und hatte periodisch immer wieder Kopfschmerzen.  Mit einem Schmunzeln hat mich jemand darauf hingewiesen, ich hätte dieses Mal viel am Fernseher gesessen bzw. viel Computer gespielt; was sonst nicht wirklich der Fall ist.

Grübel Grübel - tatsächlich. Stimmt.
Das aber ein Amazon TV 4K-Stick zusammen mit einem Samsung-Fernseher ganz real die Ursache sein könnten, damit konnte keiner rechnen...


Montag, 26. August 2019

Tastenkombinationen der Bash

Die einen kennen sie, die anderen nicht: Tastenkombinationen in der Bash-Shell.
Vielleicht einmal die wichtigsten zusammen gefasst:

Cursor bewegen
CTRL+a     Cursor an den Zeilenanfang
CTRL+e     Cursor an das Zeilenende
CTRL+f     Cursor ein Zeichen nach rechts
CTRL+b     Cursor ein Zeichen nach links
CTRL+ESC f Cursor ein Wort nach rechts
ALT l Wort Cursor ein Wort nach rechtsCTRL+ESC b Cursor ein Wort nach linksALT b Wort Cursor ein Wort nach links
Löschen und Vertauschen
CTRL+d      den aktuellen Buchstaben löschen
CTRL+h      den vorherigen Buchstaben löschen ("Backspace")
CTRL+t      Buchstaben vertauschen
CTRL+ESC t  Wort vertauschen

Ausschneiden und einfügen
CTRL+k      Bis Zeilenende ausschneiden
CTRL+u      Bis Zeilenanfang ausschneiden
CTRL+w      vorheriges Wort ausschneiden
CTRL+ESC d  folgendes Wort ausschneiden
CTRL+y      einfügen  (alt:  folgendes Wort löschen)
CTRL+i      automatisch Ergänzen (Tab-Funktion)

Lower und Uppercase
CTRL+ESC u  uppercase für das gesamte nächste Wort
CTRL+ESC l  lowercase für das gesamte nächste Wort
CTRL+ESC c  lowercase für den ersten Buchstaben des nächsten Wortes

Ouptut- und Prozesskontrolle
CTRL+c              Abbruch
CTRL+s              Output anhalten
CTRL+q              Output fortfahren
CTRL+l              Output nach oben schieben
SHIFT+Bildaufwärts  Output nach oben scrollen
SHIFT+Bildabwärts   Output nach unten scrollen
CTRL+z              Prozess in den Hintergrund schicken ("bg", zurück holen: "fg")

History
CTRL+r  (suchbegriff) History-Suche
STRG+ESC .          
das zuletzt benutzte Argument wiederholen
ALT .                das zuletzt benutzte Argument wiederholen

Natürlich kann man auch selbst Tastenkombinationen definieren;
ein kurzer Aufruf mit "bind -P" oder "bind -p" gibt erst einmal eine Übersicht.
Um den Tastencode zu finden, drückt man STRG-V und dann die gewünschte zu belegende Taste.
Ein Beispiel: "Cursor up" nach einem CTRL-V "^ [[A", wobei das einleitende"^[" wie bei Terminals üblich als "Escape" zu verstehen ist ---> Also ESC [A
Ein bind '"\e[A":history-search-backward' belegt die "Cursor up"-Taste mit History rückwärts.

Samstag, 24. August 2019

Samba und .DS_Store-Dateien

Wer eine Samba-Freigabe im Netzwerk betreibt, der kennt das Problem mit Apple-Benutzern:
Es sammeln sich nach einiger Zeit Dateireste mit dem Namen ".DS_Store" an, in denen so eine "Apfelkiste" ihre Historie seines Dateiexplorers speichert.

Man kann diese Dateien einfach im Share verbieten, in dem man in der Datei /etc/samba/smb.conf ein paar Zeilen hinzu fügt:

veto files = /._*/.DS_Store/
delete veto files = yes

Dadurch werden ._ und .DS_Store-Dateien "unsichtbar" und von Samba nach der Erstellung gelöscht. Und anschließend räumt man einmal auf....


find -name ".DS_Store" -delete


oder auch

find \( -name ".DS_Store" -or -name "._*" -or -name ".TemporaryItems" -name ".Trashes" -or \) -delete

ist denkbar, um z.B: auch Mülleimer und temporäre Dinge zu löschen.
Allerdings ist das nicht unbedingt die beste Lösung, denn es gibt auch hin und wieder gern mal Dateien mit dem Prefix "._" in unixoiden Systemen -
und diese Dateien möchte man ja behalten: Da ist also große Vorsicht geboten.

Was nützt einem jedoch das Verwehren von "bösen Dateien" auf dem Samba-Share, wenn der Apple diese noch immer auf Network-Shares schreibt?
Schalten wir diese Unsitte einfach mal grundsätzlich ab!

defaults write com.apple.desktopservices DSDontWriteNetworkStores true

Wordpress: Teile dieser Seite sind nicht sicher.

Es fing mal wieder ganz einfach an...
"Kannst du mal eben....?"

Ein Freund von mir hat einen Wordpress-Webauftritt bei meinem Lieblings-Host aus Europa und wollte gern ein kostenloses SSL-Zertifikat von Lets Encrypt einbinden:
Was was bei anderen Volkshostern wie z.B. 1&1 kostenlos per Mausklick im Kundenmenü und ohne große technische Kenntnisse machbar ist, artet dort oft für den normalen Menschen in ein handfestes Problem aus, wenn er nicht ein teures Bezahl-Zertifkat erwerben will...

"Klar, mach ich dir nebenbei mal. Gib mir die Logindaten."....

15 Minuten später war das Zertifikat über das besonders kundenfreudliche Bedienpanel "KIS" hereingebaut - und die Probleme gingen los....
"Teile dieser Seite sind nicht sicher. Dies können z.B. Grafiken sein."
....ojeh....

Donnerstag, 13. Juni 2019

Ändern der Groß- und Kleinschrift im vi - Editor

Ein Problem was es immer wieder gern mal gibt:
MAC-Adressen mit Groß und Kleinschrift in Config-Files, z.B. beim dhcpd.

Ein Beispiel:

host geraet1-wlan {
  option host-name "geraet1";
  ddns-hostname "geraet1";
  hardware ethernet aa:bb:cc:dd:ee:11;
  fixed-address 192.168.104.50;
}

host geraet2-wlan {
  option host-name "geraet2";
  ddns-hostname "geraet2";
  hardware ethernet AA:bb:CC:dd:EE:22;
  fixed-address 192.168.104.51;
}

Will man nun z.B. eine bestimmte MAC-Adresse finden, bzw. Scripte generalisieren, hat man VIEL Spaß....
Wie tausche ich also einfach bestimmte Zeilen komplett gegen Klein-  bzw. Großschrift aus?

Sonntag, 2. Juni 2019

Jun 2 01:00:44 router named[4611]: isc_file_isplainfile '/var/log/named/named.log' failed: permission denied


Da war er wieder... bind.

Mal wieder eine Fehlermeldung aus dem Nichts:

Jun  2 01:00:44 router named[4611]: isc_file_isplainfile '/var/log/named/named.log' failed: permission denied



Ja was soll denn das? Lief doch alles....
Ein Blick nach /var/log/named --- da liegen Logfiles.
Mal an die Seite schieben und den Service neu starten:
Die werden anscheinend von Bind weder neu angelegt, noch überhaupt beachtet.
Nanu?

Aktuelles