Sonntag, 26. Januar 2025
Authentifizierende Proxies und Linux:
Internet für Google Chrome und dnf
Wo und wie kann man nun Proxies eintragen, ohne gleich dem ganzen System "freie Fahrt in's Internet" zu geben?
Samstag, 25. Januar 2025
Rocky-Linux und Cherrytree
Die Wahl war aus Arbeitsgründen auf "Rocky-Linux" gefallen -
und schon gleich gingen die ersten kleineren Probleme los.
Wie Installiere ich z.B. "cherrytree"?
Mittwoch, 19. Juni 2024
Linux: Welcher Stick steckt eigentlich in welchem USB-Port - und hat welchen Laufwerkspfad?
In welchem USB-Port steckt grade eigentlich welcher Stick?
Sicherlich - ich kann nun mit "dmesg -w" herumsuchen, oder oder oder.
Aber gibt es da nicht eine bessere Methode?
Montag, 23. August 2021
gpsd und CentOS7
Irgendwie flog nach dem Umzug hier ein kleiner USB-Stick mit der Aufschrift "U-blox7 G-7020" von "U-blox" auf dem Schreibtisch herum. Na was könnte das sein..?
Na komm - dann mache ich "mal eben" wieder Zeit im lokalen Heimnetz. Mal eben die Phux-Ärmel hochkrempeln und den alten Artikel von mir rausgesucht...
https://blog.bitfox.com/2015/06/hands-on-wir-bauen-uns-unter-centos.html
Los gehts.. bestimmt dauert das nur zwei Minuten...?!
Freitag, 9. April 2021
Linux-Quiz:
Böse Fallen mit find

Einen "bösen lehrreichen Klassiker" hätte ich aber vielleicht noch.
Was ist richtig und warum? :-)
Nicht googlen - und bitte NICHT EINFACH AUSPROBIEREN -
das könnte ggf. schief gehen und die Daten sind weg.... :-)
find /somewhere/ -type f -name foo -exec rm -f {} \; 2>&1 >/dev/null find /somewhere/ -type f -name foo -exec rm -f {} + &>/dev/null find /somewhere/ -delete -name foo -type f &>/dev/null
Samstag, 27. März 2021
Linux-Quiz:
Datenkanäle auf der Bash-Shell
Auf der Arbeit nervte ein Cronjob und löste immer wieder Fehler-Mails aus. "Kein Ding."
crontab -e ... "Alles klar, da fehlt was."
Am nächsten Tag: Wieder eMails.
crontab -e ... Hmh... "Wieso...?!" ...und eine Nacht überlegen...
Autsch! Gemein! KLAR! DER ist guuuuuut! :-)
crontab -e ...."Jetzt aber!"
Ruhe.
Wer also einem Linux-Admin einmal eine wirklich gemeine Alltagsfrage stellen möchte, für den habe ich da was:
Was davon ist richtig - und vor allem: Warum?find /does/not/exist -name foo -exec bar {}\; -print 2>&1 >/dev/null find /does/not/exist -name foo -exec bar {}\; >/dev/null 2>&1 find /does/not/exist -name foo -exec bar {}\; -print &>/dev/null
Nicht googeln - nicht ausprobieren - versucht's mal aus dem Stehgreif zu beantworten. :-)
Sonntag, 21. Februar 2021
DNS und Root-Adressen updaten
Sonntags um 03:00 Uhr - das eigene Monitoring klingelt:
Internet gibt es nur noch so halb und alles alles an Maschinerie benimmt sich sehr sehr eigenartig.
5 Minuten später ist das Problem erkannt:
Der hauseigene mini-DNSrelay hat versagt und ich schwenke erst einmal voll um auf die Fritzbox bzw. Telekom. Doch was war passiert?
Aus unerklärlichen Gründen hatte sich beim Update der DNS-Rootserer-Einträge die /var/named/named.ca "aufgelöst" und somit konnten keine DNS-Rootserver mehr gefunden werden; was natürlich die entsprechenden Folgen hatte.
Hrm....
Also - ein neues Update-Script für die Ermittlung der DNS-Rootserver....! :-)
Update: 2022-01-16 Typo in der Dateiausleitung nach /dev/null in der wget-zeile.#!/bin/bash # # update-dns-roots # Script zum Aktualisieren der DNS-Root-Adressen # # 2021-02-21 Oliver Lenz # # contab -> # 0 10 1 * * /root/bin/update-dns-roots.bash >/dev/null 2>&1 || echo "Probleme in update-dns-roots.bash" # PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin destination="69.58.179.79" # ftp.rs.internic.net dt=$(date "+%Y%m%d%H%M%S") filter="FILTER:$(cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w 32 | head -n 1)" errorlevel=255 echo "Setup Firewall for ftp-Communication with ${destination}" modprobe ip_conntrack modprobe ip_conntrack_ftp iptables -A OUTPUT -p tcp --sport 1024:65535 -d ${destination} --dport 20 -m state --state ESTABLISHED -j ACCEPT -m comment --comment "${filter}" iptables -A OUTPUT -p tcp -m tcp --sport 1024:65535 -d ${destination} --dport 21 -m state --state NEW,ESTABLISHED -j ACCEPT -m comment --comment "${filter}" iptables -A OUTPUT -p tcp --sport 1024:65535 -d ${destination} --dport 1024:65535 -m state --state ESTABLISHED,RELATED -j ACCEPT -m comment --comment "${filter}" iptables -A INPUT -p tcp -s ${destination} --sport 20 --dport 1024:65535 -m state --state ESTABLISHED,RELATED -j ACCEPT -m comment --comment "${filter}" iptables -A INPUT -p tcp -m tcp -m multiport -s ${destination} --sports 21,1024:65535 --dport 1024:65535 -m state --state ESTABLISHED -j ACCEPT -m comment --comment "${filter}" echo "Getting ca-File from ${destination}" wget -q --timeout=4 --tries=3 --waitretry=2 --user=ftp --password=ftp ftp://69.58.179.79/domain/db.cache -O /var/named/named.ca.tmp &>/dev/null if [ "$?" == "0" ]; then if cmp -s /var/named/named.ca /var/named/named.ca.tmp; then echo "No changes." rm -f /var/named/named.ca.tmp else cp -f /var/named/named.ca /var/named/named.ca.${dt} mv -f /var/named/named.ca.tmp /var/named/named.ca /usr/bin/systemctl restart named-chroot.service echo "Update ca-file successfully." fi errorlevel=0 else echo "Problems getting new ca-file via /root/bin/update-dns-roots.bash" errorlevel=1 fi echo "Remove Firewall-Rules for ftp-Communication with ${destination}." while read rule; do echo "${rule}" | xargs iptables done< <( iptables-save | grep " --comment \"${filter}\"" | sed "s/-A /-D /g" ) exit ${errorlevel}
Dienstag, 2. Februar 2021
Windows 10 und seine Updates:
Wenn hinter einem Proxy der Windows-Client unerklärlich "stirbt"
Der Taskmanager zeigte an, dass "Windows Update" 90% der CPU-Ressourcen verbrauchen würde -
und ein Blick auf den Netzwerkadapter zeigte ebenfalls, dass da was "im Busch" war:
Der Client versuchte ohne Rücksicht auf Verluste Netzwerkverbindungen zur Außenwelt aufzubauen.
Virenbefall? Hier hätte der Client zumindest ein wenig Probleme durch den authentifizierenden Proxy.
Also schaute ich in das Log des Proxies, wohin die Verbindungen gehen sollten und das Problem wurde sichtbar: Windows Update kann nicht mit authentifizierenden Proxies arbeiten!
Der Client versuchte gar tausende Anfragen nach Microsoft aufzubauen, die vom Proxy gedropped wurden; entsprechend wurden die Ressourcen des Gerätes verschwendet und der Client lief so im wahrsten Sinne des Wortes "heiß".
Und nun?
Pest oder Cholera?
Schalte ich den Update-Service des Clients ab,
oder schalte ich die Authentifizierung des Proxies ab?
Oder installiere ich nun extra einen WSUS-Server für das Update von einigen Windows-Clients....?
Das kann alles nicht die Lösung sein.
Mit einem gehörigen Knirschen habe ich folgende Zeilen in die Squid-Konfiguration eingetragen:
acl windowsupdates dstdom_regex -i (.*\.|)microsoft.com
http_access allow windowsupdates
Jetzt kann ein jeder hinaus auf ein Ziel bei Microsoft, ohne eine Authentifizierung.
......aber der Client läuft nun wieder schnell.... *hust*
Donnerstag, 28. Januar 2021
rpm-Pakete und Versionen
Einfache Benutzer können Root-Zugriff erlangen, sogar wenn diese Benutzer nicht einmal in der /etc/sudoers erwähnt sind. Auch Accounts ohne Shell bzw. lediglich hinterlegtem Kontext sind somit gefährlich.
"Also - mal eben schauen", wie "neu" das sudo auf der Maschine ist.
rpm -qi $( rpm -qf "/bin/sudo" )
Aber geht's noch schöner? Klar - etwas CommandLine-Zauber... :-)
f="/bin/sudo" ; rpm -qf "${f}" --qf '%{name} %{version}-%{release}%{arch} from '; env TZ=Europe/Berlin date -d "@$( rpm -qf "${f}" --qf '%{buildtime}' )" "+%Y-%m-%d %H:%M:%S %Z"
Nachtrag: %{buldtime:date} Zeigt bereits einen Datumsstring, welcher jedoch nicht wirklich ansehnlich ist.
Sonntag, 15. November 2020
BASH und JSON-Strings
Ein Erfahrungsbericht...
Das Problem war eigentlich, nur "mal eben" einen JSON-String ohne zusätzliche Tools "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
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
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....
...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, 7. August 2020
Wenn das Backup mal verstopft ist....

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...
Donnerstag, 28. Februar 2019
Sag mal Olli: Du liegst doch krank zu Hause...
Wie kopiere ich denn meine Mails von einem Server auf den anderen?
das ist besser als von der Couch aus den Fernseher anzustarren.
Da gibt es das schöne Tool "imapsync", welches in den meisten Linux-Distributionen vorhanden ist.
Also - mal eben Bloggen und erklären, wie schnell das geht.
Sonntag, 17. Februar 2019
Wochenende - "Mal eben" -
authentication unavailable: no polkit agent available to authenticate action 'org.libvirt.unix.manage'
![]() |
authentication unavailable: no polkit agent available to authenticate action 'org.libvirt.unix.manage' |
und dann schnell raus an die Luft. ...."mal eben"....
Also "mal eben" vom Mac auf die "Virtualisierungsmaschine" eingelogged -
den virt-manager aufrufen - und...
da war es dann auch, das besagte Fenster:
"authentication unavailable: no polkit agent available to authenticate action 'org.libvirt.unix.manage'"
OOoooouhkay...
Sonntag, 11. November 2018
"Mal eben" eine Platte mit "dd" wegschieben...
Klar - man könnte jetzt der Ursache löblich auf den Grund gehen, hier scheinen tatsächlich das Mainboard und der verbaute USB3.0-Controller ein Problem zu haben, oder der Kernel zappelt mit dem Speichermanagement/Schreibcache, aber wie behelfe ich mir so lange - ohne nun lange auch noch diese Baustelle aufräumen zu müssen...?
Mittwoch, 4. April 2018
"Ping oder nicht Ping? Das ist hier die Firewall"

....oder auch nicht.
Es begab sich mal wieder, dass ich "mal eben" was tun wollte: Wir stellen zu Hause den Telefonanschluss auf 1&1 um und haben uns im Vorhinein schon einmal die Geräte wie das Modem und die Media-Box via eBay besorgt, weil wir keine 3 Euro im Monat "Miete" bezahlen wollten -
und die "alte" Fritz!Box 7490 war für den Hausgebrauch einfach "oversized".
Also mal eben die alten Daten aus der "alten" großen Fritzbox speichern, in die "neue" kleine Fritzbox laden.... das wird bestimmt lus... mo.. hups - wow - läuft!
Kabel an den Router: Läuft auch. Wahnsinn.
Komm - ich klemme nur noch mal eben die "Mediabox" an - die wird zwar dann sagen "1&1 ist noch nicht da, lieber Kunde du musst noch Gelduld haben" - aber ist mir dann egal. Dann sind wenigstens die Geräte angeschlossen.
Und so nahm der Abend seinen lauf....
Sonntag, 2. April 2017
SSH-Hostkeys auf Linux neu generieren
insbesondere, wenn diese fehlen oder defekt sind?
Ganz einfach via ssh-keygen.
Samstag, 1. April 2017
cron und der Absender

Grade bei "cron" kann das schon einmal wichtig werden.
Doch wie setzt man den Absender?
Ein Blick in die Dokumentation von Cron am Ende der Welt hilft:
Man kann hier so einig Variablen senden....