BITFOX® | LÖSUNGEN | SERVICE | LOGIN | BLOG | KONTAKT
Posts mit dem Label Bash werden angezeigt. Alle Posts anzeigen
Posts mit dem Label Bash werden angezeigt. Alle Posts anzeigen

Mittwoch, 19. Juni 2024

Linux: Welcher Stick steckt eigentlich in welchem USB-Port - und hat welchen Laufwerkspfad?

 


Wer kennt das nicht? Man hantiert unter Linux mit mehreren USB-Sticks die gleichzeitig eingesteckt sind und verliert die Übersicht:
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?

Freitag, 9. April 2021

Linux-Quiz:
Böse Fallen mit find

Auf den letzten Beitrag mit dem "Find" und den "Ein-/Ausgabekanälen" auf der Bash kamen einige Rückmeldungen; das würde Spaß machen und da solle ich mir doch noch mal was einfallen lassen.

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:
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
Was davon ist richtig - und vor allem: Warum?
Nicht googeln - nicht ausprobieren - versucht's mal aus dem Stehgreif zu beantworten. :-)

Montag, 22. Februar 2021

DDNS: DHCPd und die Journal-Files (.jnl)

Wer einen DHCPd errichtet und gegen den DNS betreibt stellt nach einer Zeit fest, dass die dynamischen Einträge im DNS durch Journal-Files (.jnl) in /var/named zu den Zonefiles vorgehalten werden. 

Nach einiger Zeit sieht das nicht nur ziemlich unschön aus, man kann auch aus den Zonefiles nicht mehr die "aktuelle Realität" ablesen -
und die Journal-Files sind für das menschliche Auge nicht ohne weiteres sprechend. 


Bereits im März 2019 hatte ich mich mal wieder damit befasst und hatte ein paar Zeilen geschrieben

Der wohl allgemeine Tipp um diese Deltas zwangsweise zusammen zu führen ist, die Zonen mit
rndc freeze rndc thaw
einzufrieren bzw. freizugeben. Das klappt jedoch auch nicht immer so ganz und persönlich fand ich das immer unschön, weil es nicht das "Problem" an der Wurzel packt - dem Synchronisieren der Files.

Eher zufällig bin ich heute durch das Manual gestolpert und habe da eine definitiv schönere Lösung gefunden:
rndc sync -clean
Das ganze als Cronjob auf 30 Minuten - und schon ist das Arbeiten wieder etwas einfacher.
*/30 * * * * rndc sync -clean
Man lernt nicht aus...! Schön! :-)

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....! :-)

#!/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}
Update: 2022-01-16 Typo in der Dateiausleitung nach /dev/null in der wget-zeile.

Donnerstag, 28. Januar 2021

rpm-Pakete und Versionen

Das BSI warnt grade vor alten sudo-Versionen auf unixoiden Betriebssystemen:
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...

 ....so oder ähnlich könnte es nun heissen.
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

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, 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...

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.

Freitag, 22. Februar 2019

Olli sag mal:
Unknown OS Charakter set 'ISO-8859-15'

mysql: unknown os charakter set 'ISO-8859-15'.
mysql: switching to default charakter set 'utf8'
Grade wuselten am Linux-Terminal Fehlermeldungen der mySQL-Datenbank über den Bildschirm: "mysql: Unknown OS charakter set 'ISO-8859-15'. mysql: Switching to default charakter set 'utf8'. " -
Ein Standard-Problem und schnell zu beheben.


Samstag, 28. Mai 2016

Wenn das NFS am Client hängt.
Heute: NFS und Blockgrößen...

Eigenartig - nach der Umstellung einer Client-Maschine auf CentOS7.2 wollte diese gemountete NFS-Shares einfach nicht mehr ordentlich verarbeiten: Jedes Schreiben auf der Freigabe endete in einem lang gezogenen Schluckauf.... und einer Geduldsprobe.
Irgendwann war ich ziemlich entnervt - und suchte die Parameter ab.
Schließlich kam mir die Idee, einmal die Blockgrößen für den Transfer zu überprüfen.


Dienstag, 28. Juli 2015

Kennwörter auf verschiedenen Unix-Servern ändern.


....es war einmal wieder: Ein Benutzer, der sein Kennwort in einer eMail an alle seine Kollegen veröffentlichte...

Wie ändert man nun schnell die Kennwörter auf "ein paar" Linux-Servern...?


Hrm... die betroffenen Server in eine Datei mit dem Namen "server.txt" ... und.. dann... .mhrm.....

Es wird mal wieder Zeit für ein kleines Script. :-)

[ hier gehts weiter ]

Sonntag, 19. Juli 2015

Samba-Freigaben eines Linux-Servers auf den NAS325 von Zyxel sichern.

Es waren einmal....

Windows-Clients und ein Linux-Server mit einem vermeintlich sicheren RAID-Verbund... und die Erkenntnis über geographische Sicherheit.


Jeder der einen Server mit gespiegelten Festplatten betreibt, würde sicherlich erst einmal auf die Frage "Wie sicher sind eigentlich die Daten auf deinem RAID?" sagen: "Total sicher".

Ein Blitzschlag im ziemlich nahe gelegenen Nachbarhaus brachte mir allerdings näher, dass ein Blitz meist die phänomenale Eigenschaft besitzt, gleich alle Festplatten in einem Server auf einmal zu "grillen" zu können... und einem die Versicherung und selbst ein Datenwiederherstellungsdienst wie Firma Kroll-Ontrack auch gegen den "Einwurf kleiner Münzen" hier nicht mehr all zu viel Material hätte, welches sie überhaupt retten könnte.

Und nun... was tun?

Ein zweites Backup an einem geographisch entfernten Ort muss her -
und zwar schnell! Und natürlich günstig!

Ein alter NAS325 von Zyxel fand sich in meiner "Hardware-Restekiste" wieder.
Das könnte doch die Lösung sein -
so lange ich diesen weit genug entfernt aufstelle.

Und wie bekomme ich dort nun die Daten hin?
rsync wäre sicherlich eine Möglichkeit -
mag das System aber anscheinend nicht.
Und der liebe Strom? Wie schalte ich das Gerät ein? Und wieder aus?
.....

Eine Stunde herum scripten - und das Problem war nun gelöst.
Vielleicht kann jemand den Ansatz gebrauchen. :-)

Viele Grüße,



Oliver   [Zum vollen Artikel samt Script.]

Aktuelles