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.

Nanu? 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?
Aktuelles