====== Scriptschnipsel ====== Hier sind div. Schnipsel aus irgendwelchen Scripten zusammengestellt, die vielleicht einen Denkanstoß beim scripten bringen. ===== Grundlagen ===== * Zahlen-Arrays \\ {1..5} * Variablen werden nicht in Abschnitten, welche mit singel-Quotes (') definiert sind, übergeben/umgesetzt. Lösung ist eine aufteilen der Abschnitte \\ **Funktioniert nicht** \\ 'BEFEHLSCODE "PARAMETER" ${VARIABLE} "PARAMETER" BEFEHLSCODE "PARAMETER" ' **Funktoniert** \\ 'BEFEHLSCODE "PARAMETER"' ${VARIABLE} '"PARAMETER" BEFEHLSCODE "PARAMETER" ' ===== IF-Bedinungen ===== ^ Bedingung ^ Beschreibung ^ | -r Dateiname | Die Datei Dateiname existiert und ist lesbar | | -w Dateiname | Die Datei Dateiname existiert und ist beschreibbar | | -x Dateiname | Die Datei Dateiname existiert und ist ausführbar | | -d Dateiname | Die Datei Dateiname existiert und ist ein Verzeichnis | | -s Dateiname | Die Datei Dateiname existiert und ist nicht leer | | -b Dateiname | Die Datei Dateiname existiert und ist ein blockorientiertes Gerät | | -c Dateiname | Die Datei Dateiname existiert und ist ein zeichenorientiertes Gerät | | -g Dateiname | Die Datei Dateiname existiert und das SGID-Bit ist gesetzt | | -k Dateiname | Die Datei Dateiname existiert und das Sticky-Bit ist gesetzt | | -u Dateiname | Die Datei Dateiname existiert und das SUID-Bit ist gesetzt | | -p Dateiname | Die Datei Dateiname existiert und ist ein Named Pipe | | -e Dateiname | Die Datei Dateiname existiert | | -f Dateiname | Die Datei Dateiname existiert und ist eine reguläre Datei | | -L Dateiname | Die Datei Dateiname existiert und ist ein symbolischer Link | | -S Dateiname | Die Datei Dateiname existiert und ist ein Socket | | -O Dateiname | Die Datei Dateiname existiert und ist Eigentum des Anwenders, unter dessen UID das test-Programm gerade läuft | | -G Dateiname | Die Datei Dateiname existiert und gehört zu der Gruppe, zu der der User gehört, unter dessen UID das test-Programm gerade läuft | | Datei1 -nt Datei2 | Datei1 ist neuer als Datei2 (newer than) | | Datei1 -ot Datei2 | Datei1 ist älter als Datei2 (older than) | | Datei1 -ef Datei2 | Datei1 und Datei2 benutzen die gleiche I-Node (equal file) | | -z Zeichenkette | Wahr wenn Zeichenkette eine Länge von Null hat. | | -n Zeichenkette | Wahr wenn Zeichenkette eine Länge von größer als Null hat. | | Zeichenkette1 = Zeichenkette2 | Wahr wenn Zeichenkette1 gleich Zeichenkette2 | | Zeichenkette1 != Zeichenkette2 | Wahr wenn Zeichenkette1 ungleich Zeichenkette2 | | Wert1 -eq Wert2 | Wahr, wenn Wert1 gleich Wert2 (equal) | | Wert1 -ne Wert2 | Wahr, wenn Wert1 ungleich Wert2 (not equal) | | Wert1 -gt Wert2 | Wahr, wenn Wert1 größer Wert2 (greater than) | | Wert1 -ge Wert2 | Wahr, wenn Wert1 größer oder gleich Wert2 (greater or equal) | | Wert1 -lt Wert2 | Wahr, wenn Wert1 kleiner Wert2 (less than) | | Wert1 -le Wert2 | Wahr, wenn Wert1 kleiner oder gleich Wert2 (less or equal) | | !Ausdruck | Logische Verneinung von Ausdruck | | Ausdruck -a Ausdruck | Logisches UND. Wahr, wenn beide Ausdrücke wahr sind | | Ausdruck -o Ausdruck | Logisches ODER. Wahr wenn mindestens einer der beiden Ausdrücke wahr ist | Quelle: [[http://www.linux-praxis.de/linux1/shell2_5.html]] ==== IF und Groß-/Kleinschreibung ==== if [ == "y" -o == "Y" ]; then fi ==== IF mit default Wert ==== Hier bei fragt das Programm "Wollen Sie etwas tun?". Man kann nun entweder "y" oder "Y" oder garnichts eingeben damit der Befehl un der If Anweisung ausgeführt wird. Wenn man etwas anderen angibt, dann wird abgebrochen. read -p "Wollen Sie etwas tun? [y|Y] ANTWORT ANTWORT=${ANTWORT:=Y} if [ $ANTWORT == "y" -o $ANTWORT == "Y" ]; then else exit fi ==== Ordner prüfen ==== Erstellen eines Ordners wenn er nicht existiert. if [ ! -d "" ]; then else exit fi ==== Befehl existiert ==== Prüfen ob ein Befehl existiert. if [ -x $(command -v ) ]; then echo "existiert nicht" fi ===== Parameter ===== Das '':'' Zeichen hinter den Parametern (H,C,T) sagt aus, dass zu dem Parameter noch Argumente angegeben werden müssen. while getopts "H:C:T: -l text" opt; do case "$opt" in H ) HOST="$OPTARG" ;; C ) COMMUNITY="$OPTARG" ;; T ) TEST="$OPTARG" ;; text ) TEXT="$OPTARG" # langer Parameter (--text) echo $TEXT ;; * ) usage ;; esac done ===== Ordnerstruktur kopieren ===== #!/bin/bash PATH_OLD="" PATH_NEW="" for i in `ls ${PATH_OLD}`; do mkdir ${PATH_NEW}/$i mv ${PATH_OLD}/$i ${PATH_NEW}/$i done ===== Nur bestimmte Dateien inkl. Ordnerstruktur kopieren ===== find /Pfad/zu/Dateien -name "*.jpg" -exec cp --parents {} /Pfad/zu/Ziel \; WICHTIG: Wenn beim zu suchenden Begriff Asterisks oder andere Joker verwendet werden, immer die Suchbegriffe mit Anführungszeichen ("), wie dargestellt, oder mit direkt vorangehendem Backslash (\) versehen. Wenn man bei dieser Methode nicht die Dateien kopieren sondern dafür nur SymLinks erstellen möchte, dann muss man zum Copy-Befehl noch folgendes hinzufügen ''-s'' ===== Datensicherung ===== siehe [[linux:backupscript]] ===== Verzeichnisse vergleichen ===== diff -rqy ^ Parameter ^ Beschreibung ^ | ''r'' | recursiv | | ''q'' | kurze ausgabe; nur unterschiedliche Dateien anzeigen | | ''y'' | tabelarische Ausgabe | ===== Mit "ls" nur Ordner anzeigen ===== ls -d | sed 's!/$!!' ===== Mit "ls" nur Dateien anzeigen ===== ls -l | awk '{print $9}' oder eine einzelne Datei ls -l | awk '{print $9}'|grep ===== Prüfsumme großer Verzeichnisse ===== #!/bin/bash CMDHOSTNAME=`which hostname` HOSTNAME=`${CMDHOSTNAME} -s` CMDLS=`which ls` CMDCFV=`which cfv` CMDSORT=`which sort` CMDSED=`which sed` CMDCAT=`which cat` CMDMD5SUM=`which md5sum` CHECKDIR= WORKDIR= DIRLIST=${WORKDIR}/dirlist-${HOSTNAME} MD5DIR=${WORKDIR}/md5-${HOSTNAME} LOG=${WORKDIR}/md5-${HOSTNAME}.log CHECKFILE=${WORKDIR}/gesamt-${HOSTNAME}.md5 if [ ! -d ${MD5DIR} ]; then mkdir ${MD5DIR} fi ${CMDLS} -d ${CHECKDIR}/*/ | ${CMDSORT} | ${CMDSED} 's!/$!!' | ${CMDSED} 's!/.*/!!' > ${DIRLIST} for elem in `${CMDCAT} ${DIRLIST}`; do if [ ! -f ${MD5DIR}/${elem}.md5 ]; then ${CMDCFV} -rr -C -t md5 -f ${MD5DIR}/${elem}.md5 ${CHECKDIR}/${elem} #> /dev/null fi done ${CMDMD5SUM} ${MD5DIR}/*.md5 > ${CHECKFILE} ===== CD-Copy mit MD5-Vergleich ===== #!/bin/bash # Variablen DEST= MOUNTTIMEOUT=30 #eject # Laufwerk oeffnen falls nicht bereits geoeffnet # Programmschleife startet while true; do # Medien einlegen echo Medium einlegen und DVD Nr. eingeben while true; do read -p "DVD Nummer:" MEDIENNR # Abfrage: Mediennummer if [[ $MEDIENNR =~ ^exit|quit$ ]] ; then exit 0 fi if ! [[ $MEDIENNR =~ ^[0-9]+$ ]] ; then tput setaf 1 # http://en.wikipedia.org/wiki/Tput echo Nur Zahlen erlaubt tput sgr0 continue else break fi done date "+%d.%m.%y %H:%M:%S" WORKDIR=$DEST/$MEDIENNR if [ -d "$WORKDIR" ]; then tput setaf 1 echo Directory $WORKDIR exisitert bereits tput sgr0 read -p "Enter to continue" continue fi eject -t echo mounte Medium ... Einen Augenblick bitte # Medium mounten mit Fehlerkontrolle COUNTER=1 for i in `seq 1 $MOUNTTIMEOUT`; do if mount|grep -q sr0; then break else let COUNTER=COUNTER+1 echo -n . sleep 1 fi done echo # Zeilenumbruch nach Progressbar if [[ COUNTER -gt $MOUNTTIMEOUT ]]; then tput setaf 1 echo Medium ist nicht mountbar! tput sgr0 tput bel read -p "Enter to continue" eject continue fi # Medium gefunden MEDIUMNAME=$(ls /media) MEDIUMMOUNTPATH=$(mount | grep sr0 | grep -Eo "/media(.*) type" | sed 's/ type//') echo Workdir: $WORKDIR echo Medienname: $MEDIUMNAME echo Mountpath: $MEDIUMMOUNTPATH mkdir -p "$WORKDIR/$MEDIUMNAME" echo md5sum des medium nach $WORKDIR/md5_medium.md5 find "$MEDIUMMOUNTPATH/" -type f -print0 | while read -d $'\0' -r file ; do md5sum "$file" | grep -o '^[0-9a-f]*' >> "$WORKDIR/md5_medium.tmp" done cat "$WORKDIR/md5_medium.tmp" | sort > "$WORKDIR/md5_medium.md5" # Daten von Medium in Workdir kopieren echo "Daten von Medium nach $WORKDIR/$MEDIUMNAME kopieren" #touch "$WORKDIR/$MEDIUMNAME"/foo cp -ru "$MEDIUMMOUNTPATH/"* "$WORKDIR/$MEDIUMNAME" echo md5sum der kopierten Daten nach $WORKDIR/md5_copy.md5 find "$WORKDIR/$MEDIUMNAME/" -type f -print0 | while read -d $'\0' -r file ; do md5sum "$file" | grep -o '^[0-9a-f]*' >> "$WORKDIR/md5_copy.tmp" done cat "$WORKDIR/md5_copy.tmp" | sort > "$WORKDIR/md5_copy.md5" echo Vergleich von md5_medium.md5 und md5_copy.md5 DIFFRESULT=$(diff "$WORKDIR/md5_medium.md5" "$WORKDIR/md5_copy.md5") echo # leerzeile ueber Ergebnis ENDTIME=$(date "+%d.%m.%y %H:%M:%S") if [ "$DIFFRESULT" != "" ]; then # ungleich tput setaf 1 # color red echo $ENDTIME MD5 Hash unterschiedlich else # gleich tput setaf 2 # color green echo $ENDTIME MD5 Hash identisch rm "$WORKDIR/md5_medium.tmp" rm "$WORKDIR/md5_copy.tmp" fi tput sgr0 echo # leerzeile unter Ergebnis tput bel eject # Medium auswerfen done # Schleife ende ===== find ===== ==== Dateien oder Ordner mit find im Zeitraum löschen ==== Dateien suchen und in einem bestimmten Zeitraum löschen. * Zeitraum * Datumsformat: jjjj-mm-dd touch --date "" end touch --date "<ÄLTESTES_DATUM>" start * Dateien suchen und löschen find -type f -newer /start -not -newer /end -exec rm -rf {} \; * löschen wenn n Tage älter find /* -mtime +n -exec rm {} \; Bedeutung Parameter (Quelle: [[https://wiki.ubuntuusers.de/]]) ^ -mtime n | sucht nach Dateien, deren Inhalt vor n bis n+1 Tagen geändert (m=modified) wurde. | ^ -mtime +n | sucht nach Dateien, deren Inhalt älter als n+1 Tage ist. | ^ -mtime -n | sucht nach Dateien, deren Inhalt jünger als n Tage ist. | ^ -ctime n | sucht nach Dateien, deren Name oder Status (Modus, Besitzer oder Gruppe) vor n bis n+1 Tagen geändert (c=changed) wurde. | ^ -atime n | sucht nach Dateien, auf die zuletzt vor n bis n+1 Tagen zugegriffen (a=accessed) wurde. (Hinweis: Die Aussagekraft der Datei-Zugriffszeit ist stark von den Einhängeoptionen atime, noatime und relatime abhängig.) | ^ -mmin n | sucht nach Dateien, deren Inhalt vor n-1 bis n Minuten geändert wurde. (Achtung: andere Zählweise als bei -Xtime) | ^ -mmin +n | sucht nach Dateien, deren Inhalt älter als n Minuten ist. (Achtung: andere Zählweise als bei -Xtime) | ^ -mmin -n | sucht nach Dateien, deren Inhalt jünger als n Minuten ist. (gleiche Zählweise als bei -Xtime) | ==== Suchen mit find inkl. versteckter Dateinen/Ordner ==== find $HOME -type d -iname ".*" -exec grep -Ir '' {} \; ===== Copy-Archive ===== #!/bin/bash # SRCDIR="" DESTDIR="" HOSTNAME=`hostname` FILENAME= if [ $(date +%d) -eq "01" ]; then DIRMONTH="$(date -d'1 month ago' +%Y-%m)" else DIRMONTH="$(date +%Y-%m)" fi DAYARCHIVENAME="${DESTDIR}/${DIRMONTH}/$(date -d'1 day ago' +%Y-%m-%d).${HOSTNAME}.${FILENAME}" LOGTS="$(date "+%b %d %Y %H:%M:%S")" TMPFILE="/tmp/${FILENAME}.tmp" BINFIND=`which find` BINTAR=`which tar` BINGZIP=`which gzip` ls ${SRCDIR} > ${TMPFILE} cd ${SRCDIR} if [ -s ${TMPFILE} ]; then sleep $[ ( $RANDOM % 10 ) + 1 ]s if [ ! -d "${DESTDIR}/${DIRMONTH}" ]; then echo "${LOGTS} erstelle ${DESTDIR}/${DIRMONTH}" mkdir ${DESTDIR}/${DIRMONTH} chmod 777 ${DESTDIR}/${DIRMONTH} fi if [ -e "${DAYARCHIVENAME}.tar.gz" ]; then echo "${LOGTS} WARNUNG: Zielarchiv existiert bereits. Sichere nichts!" else if grep -qs '/datensicherung' /etc/mtab; then #echo "${LOGTS} It's mounted." echo -n else echo "${LOGTS} WARNUNG: Ziel nicht gemounted. Versuche mount!" mount /datensicherung fi echo "${LOGTS} Archiv mit Daten wird geschrieben" ${BINTAR} cvzf "${DAYARCHIVENAME}.tar.gz" `cat ${TMPFILE}` 1> /dev/null echo "${LOGTS} loesche gesicherte Quelldaten" xargs rm < ${TMPFILE} fi else echo "${LOGTS} nichts zum Sichern vorhanden" fi rm ${TMPFILE} ===== Copy Big-Data ===== #!/usr/bin/env bash # # # export DIRLIST=dir.list export SRC= export DEST= export LOG=${DIRLIST}.log echo "sync.sh started at `date`" >> ${LOG} 2>> ${LOG}; for elem in `cat ${DIRLIST}`; do echo "" >> ${LOG} 2>> ${LOG}; echo "" >> ${LOG} 2>> ${LOG}; echo "" >> ${LOG} 2>> ${LOG}; echo "+++ starting at `date` syncing" $elem >> ${LOG} 2>> ${LOG}; rsync -a --bwlimit=5000 --stats ${SRC}/$elem ${DEST} >> ${LOG} 2>> ${LOG}; done echo "sync.sh finished at `date`" >> ${LOG} 2>> ${LOG}; exit 0; ===== CD-Copy-ISO ===== #!/bin/bash # Variablen #MNTDIR= #SRC= DEST=/data/roe MOUNTTIMEOUT=30 #eject # Laufwerk oeffnen falls nicht bereits geoeffnet # Programmschleife startet while true; do # Medien einlegen echo Medium einlegen und DVD Nr. eingeben while true; do read -p "DVD Nummer:" MEDIENNR # Abfrage: Mediennummer if [[ $MEDIENNR =~ ^exit|quit$ ]] ; then exit 0 fi if ! [[ $MEDIENNR =~ ^[0-9]+$ ]] ; then tput setaf 1 # http://en.wikipedia.org/wiki/Tput echo Nur Zahlen erlaubt tput sgr0 continue else break fi done date "+%d.%m.%y %H:%M:%S" WORKDIR=$DEST/$MEDIENNR if [ -d "$WORKDIR" ]; then tput setaf 1 echo Directory $WORKDIR exisitert bereits tput sgr0 read -p "Enter to continue" continue fi eject -t echo mounte Medium ... Einen Augenblick bitte # Medium mounten mit Fehlerkontrolle COUNTER=1 for i in `seq 1 $MOUNTTIMEOUT`; do if mount|grep -q sr0; then break else let COUNTER=COUNTER+1 echo -n . sleep 1 fi done echo # Zeilenumbruch nach Progressbar if [[ COUNTER -gt $MOUNTTIMEOUT ]]; then tput setaf 1 echo Medium ist nicht mountbar! tput sgr0 tput bel read -p "Enter to continue" eject continue fi # Medium gefunden MEDIUMNAME=$(ls /media) MEDIUMMOUNTPATH=$(mount | grep sr0 | grep -Eo "/media(.*) type" | sed 's/ type//') echo Workdir: $WORKDIR echo Medienname: $MEDIUMNAME echo Mountpath: $MEDIUMMOUNTPATH mkdir -p "$WORKDIR/$MEDIUMNAME" echo md5sum des medium nach $WORKDIR/md5_medium.md5 #cfv -rr -C -t md5 -q -f "$WORKDIR/md5_medium.md5" "$MEDIUMMOUNTPATH" #cat "$WORKDIR/md5_medium.md5" | grep --only-matching '^[0-9a-f]*' | sort > "$WORKDIR/md5_medium.md5" find "$MEDIUMMOUNTPATH/" -type f -print0 | while read -d $'\0' -r file ; do md5sum "$file" | grep -o '^[0-9a-f]*' >> "$WORKDIR/md5_medium.tmp" done cat "$WORKDIR/md5_medium.tmp" | sort > "$WORKDIR/md5_medium.md5" # Daten von Medium in Workdir kopieren echo "Daten von Medium nach $WORKDIR/$MEDIUMNAME kopieren" #touch "$WORKDIR/$MEDIUMNAME"/foo cp -ru "$MEDIUMMOUNTPATH/"* "$WORKDIR/$MEDIUMNAME" echo md5sum der kopierten Daten nach $WORKDIR/md5_copy.md5 #cfv -rr -C -t md5 -q -f "$WORKDIR/md5_copy.md5" "$WORKDIR/$MEDIUMNAME" #cat "$WORKDIR/md5_copy.md5" | grep --only-matching '^[0-9a-f]*' | sort > "$WORKDIR/md5_copy.md5" find "$WORKDIR/$MEDIUMNAME/" -type f -print0 | while read -d $'\0' -r file ; do md5sum "$file" | grep -o '^[0-9a-f]*' >> "$WORKDIR/md5_copy.tmp" done cat "$WORKDIR/md5_copy.tmp" | sort > "$WORKDIR/md5_copy.md5" echo Vergleich von md5_medium.md5 und md5_copy.md5 DIFFRESULT=$(diff "$WORKDIR/md5_medium.md5" "$WORKDIR/md5_copy.md5") echo # leerzeile ueber Ergebnis ENDTIME=$(date "+%d.%m.%y %H:%M:%S") if [ "$DIFFRESULT" != "" ]; then # ungleich tput setaf 1 # color red echo $ENDTIME MD5 Hash unterschiedlich else # gleich tput setaf 2 # color green echo $ENDTIME MD5 Hash identisch rm "$WORKDIR/md5_medium.tmp" rm "$WORKDIR/md5_copy.tmp" fi tput sgr0 echo # leerzeile unter Ergebnis tput bel eject # Medium auswerfen done # Schleife ende ===== Datenverteilung mit scp ===== Das Tool ist ursprünglich wegen einer einfacheren Verteilung von Konfigurationseinstellungen für [[linux:nagios:nrpe|NRPE]] entstanden. Damit das ganze funktioniert, erstellt man sich zunächst einer Ordnerstruktur. mkdir -p /aktuell /neu Jetzt benötigt man noch einen RSA-PublicKey für die passwordlose authentifizierung an einem SSH-Host -> siehe [[linux:ssh_ohne_password|Ssh Ohne Password]]. Nun eine kleine ANLEITUNG ## ## ## Anleitung zum Verteilen neuer Einstellungen in der NRPE Konfiguration ## ## 1. Patch erstellen 1.1 "nrpe.cfg" von Ordner "neu" nach "aktuell" kopieren 1.2 Änderungen in die "nrpe.cfg" im Ordner "neu" vornehmen 1.3 Befehl ausführen: diff -u -r -N aktuell/ neu/ > nrpe.cfg.patch 1.4 Pfade in der neuen Patch-Datei umbenennen: --- aktuell/nrpe.cfg +++ neu/nrpe.cfg umbenennen in --- ./nrpe.cfg +++ ./nrpe.cfg 2. Konfiguration verteilen 2.1 Datei "servers" ggf. anpassen ( Neue Eintraege wie folgt: "..|0" ) 2.2 Datei "rollout_newnrpeCFG.sh" ausführen und Anweisungen befolgen Man erstelle sich also eine Datei namens ''servers'' und fülle diese mit den Zielservern gefolgt von einer pipe | und der Zahl "0". Beispiel: vi /servers Inhalt: ..|0 ..|0 Die Zahl steuert das Programm an eine Verbindungsprüfung zum Zielhost durchzuführen. Wenn die Verbindung einmal erfolgreich war und der ssh-RSA-Pub-Key an den Zielhost kopiert wurde, setzt das Programm diese Zahl auf "1" und prüft beim nächsten mal nicht mehr. Nun erstellt man sich die Datei ''rollout_newnrpeCFG.sh'' mit folgendem Inhalt (Die Variablen oben sind jew. anzupassen): #!/bin/bash WORKDIR=/data/nagiosclients/NRPE/config NAGIOSCFGDIR=/usr/local/nagios/etc SSHUSER=root SSHRSA=/root/.ssh/id_rsa_ng1 AUTHKEYSFILE=/root/.ssh/authorized_keys DAEMONNAME=nrpe SERVERSFILE=$WORKDIR/servers ##### ## NOTHING TO CHANGE FROM HERE!!! ##### ### Function for copying SSH-RSA Key function rsaright { echo "Dem PC: $TARGETSVR wird aktuell nicht vertraut, oder das Authenticationfile existiert nicht." echo "kopiere öffentlichen RSA-Key" ssh-copy-id -i $SSHRSA.pub $SSHUSER@$TARGETSVR } ### Function to check SSH-Connection with Targetsvr function sshstatechange { if [ ! $TARGETSVR ]; then echo "kein Servername angegeben" exit 1 fi } function sshconnection { ### SSH-Connection authenticated by RSA-KEY OK? SSHCONNECT="ssh -n -i $SSHRSA $SSHUSER@$TARGETSVR" sshstatechange ### Check if Server has been authorized grep "^$TARGETSVR|0" $SERVERSFILE > /dev/null 2>&1 if [ $? -eq 0 ]; then rsaright ### Check if localhost inserted in "authorized_keys" $SSHCONNECT "cat $AUTHKEYSFILE |grep root@ng1" > /dev/null 2>&1 if [ $? -eq 0 ]; then echo "Dem Zielserver wird vertraut, man kann sich per Passphrase authentifizieren." sed -i "s/^$TARGETSVR|[0-9]\+/$TARGETSVR|1/g" $SERVERSFILE > /dev/null 2>&1 else rsaright sed -i "s/^$TARGETSVR|[0-9]\+/$TARGETSVR|1/g" $SERVERSFILE > /dev/null 2>&1 fi else echo ###### echo ## Neuer Durchlauf echo ###### echo echo "SSH Verbindung per Passphrase hergestellt." echo "Verarbeite Script auf $($SSHCONNECT hostname -s)" fi } function nrpenewcfg { SSHCONNECT="ssh -n -i $SSHRSA $SSHUSER@$TARGETSVR" NRPEBACKUP=`$SSHCONNECT "ls $NAGIOSCFGDIR/*.bak|sed 's/.*\///g'"` NRPEPID=`$SSHCONNECT "pgrep nrpe"` ### "nrpe.cfg" Backup echo ">sichere alte nrpe Konfiguration" $SSHCONNECT "cp $NAGIOSCFGDIR/nrpe.cfg $NAGIOSCFGDIR/nrpe.cfg.bak" NRPEBACKUP=`$SSHCONNECT "ls $NAGIOSCFGDIR/*.bak|sed 's/.*\///g'"` echo "Erstellte Sicherungsdatei ist $NRPEBACKUP." ### patching "nrpe.cfg" echo echo ">patche 'nrpe.cfg'" scp -i $SSHRSA $WORKDIR/$PATCHFILE $SSHUSER@$TARGETSVR:$NAGIOSCFGDIR > /dev/null 2>&1 NRPEPATCHFILE=`$SSHCONNECT "ls $NAGIOSCFGDIR/*.patch|sed 's/.*\///g'"` echo "Datei $NRPEPATCHFILE kopiert." echo $SSHCONNECT "cd $NAGIOSCFGDIR && patch -p1 < ./$PATCHFILE" ### restart nrpe Daemon echo echo "Die nrpe Daemon PID lautet $NRPEPID" echo "Starte den rnpe Daemon neu." $SSHCONNECT "/etc/init.d/$DAEMONNAME restart" sleep 1 NRPEPID=`$SSHCONNECT "pgrep nrpe"` echo "Die neue nrpe Daemon PID lautet $NRPEPID" echo echo Ende echo } clear echo echo echo "Dieses Script kopiert die nrpe Konfigurationsdatei auf den überwachten Zielserver" echo "und startet den nrpe Daemon neu" echo read -t 20 -p "Name der Patch-Datei aus $WORKDIR angeben: " PATCHFILE read -t 10 -p "Konfiguration auf alle Server (aus '$SERVERSFILE') verteilen? [ja|nein] " ALL_SERVERS case "$ALL_SERVERS" in Ja|ja|J|j|"") echo "Ok los geht's" while read TTARGETSVR; do TARGETSVR=$(echo $TTARGETSVR|sed 's/|.*//g') sshconnection echo echo nrpenewcfg done < $SERVERSFILE ;; Nein|nein|N|n) read -t 20 -p "Servername eingeben (inkl. DOMAIN): " TARGETSVR sshconnection echo echo nrpenewcfg ;; *) echo "Unbekannter Parameter" ;; esac ===== Rsync mit MD5-Hash Datenvergleich ===== Mit dieser Scriptsammlung kann man Daten von einem Quellserver zu einem Zielserver synchronisieren und danach von den Daten einen md5-Hash erstellten. Dieser Hash wird dann verglichen und das Ergebnis per Mail verschickt. Scriptsammlung: {{:rsync-md5.zip|}} ===== While read line ===== while read line ; do echo ${line} done < ===== USB-Device ===== So findet man heraus, welchen Device-Namen Ubuntu für, an einem bestimmten USB-PORT angeschlossenen, USB-Stick oder Festplatte verwendet. ls /sys/bus/usb/devices/-/-:*/host*/target*/*/block ===== stats ===== Statistik einer Ordnerstrucktur erstellen: #!/bin/bash # FIND="`which find`" STAT="`which stat`" echo "Geben Sie einen Dateipfad an: " read DIRPATH echo ${DIRPATH} > ./dirlist DIREND="`awk -F/ '{print $NF}' ./dirlist`" STATFILE="stat-${DIREND}.txt" DATE_FILE="`ls -l ${STATFILE}|awk -F " " '{print $6"_" $7"_" $8}'`" if [ -f ${STATFILE} ] ; then mv ${STATFILE} ${STATFILE}_${DATE_FILE} fi ${FIND} ${DIRPATH} -exec ${STAT} {} \; > ${STATFILE} ===== Logrotation files to 1 File ===== Wenn logrotate die Log-Dateien umbenennt und auch ggf. komprimiert und man aus diesen Dateien eine machen möchte, kann man das mit diesem Scriptschnipsel machen. Dazu erstellt man sich eine Datei ''files'', welche den ''ls'' Inhalt eines Ordners, in dem alle rotierten Dateien liegen, beinhaltet. cat files | while read line; do tar xfz $line -C ; cat / >> ; done ===== Switch Bandbreite ===== Diese Script fragt per SNMP einen Switch ab und berechnet die Bandbreite in einem angegebenen Zeitraum. Die Benutzung des Scriptes wird ausgegeben, wenn das Script ohne Parameter gestartet wird. #!/bin/bash pollPeriod=$1 switchip=$2 port=$3 snmp=".1.3.6.1.2.1.31.1.1.1.6" #IF-MIB::ifHCInOctets if [ -z "${1}" ]; then echo `tput setaf 1`Keine Parameter angegeben`tput sgr0`! echo echo Diese Programm berechnet die Auslastung eines Ports auf echo einem Switch in bps "("bits per second")". echo echo Es wird, per SNMP, der gleiche Werte zwei mal, in einem anzugebenden echo Zeitabstand, vom Switch zur Berechnung abgefragt. echo echo Usage: echo echo Befehl: ifOctets.sh echo echo mögliche Parameter: echo echo 1. Zeitabstand zu den 2 Utilization Messungen echo 2. welcher Switch -als IP oder DNS-Name echo 3. welcher Port auf dem Switch echo echo Beispiel: echo '"ifOctets.sh 192.168.0.1 5"' exit 0 fi clear echo echo Berechne nach Formel: echo echo `tput bold`aktueller Wert "-" erster Wert "*" 8 "/" Zeitabstand`tput sgr0` echo echo Zum Beenden einfach die Taste "q" drücken. keypress='' while : ; do previous=`snmpget -c hpswitche -v 2c ${switchip} ${snmp}.${port}|awk '{ print $4 }'` sleep ${pollPeriod} current=`snmpget -c hpswitche -v 2c ${switchip} ${snmp}.${port}|awk '{ print $4 }'` echo Previous = ${previous} echo Current = ${current} echo PollPeriod = ${pollPeriod} echo bps=`bc -l <<< "scale=2; (${current}-${previous})*8/${pollPeriod}"` Mbps=`bc -l <<< "scale=2; ${bps}/1024/1024"` echo Ergebnis Port 23: `tput setaf 3`${bps}`tput sgr0` b"/"s echo " "`tput setaf 3`${Mbps}`tput sgr0` Mb"/"s read -t 1 -n 1 key if [[ ${key} = q ]]; then break fi done ===== nur gesetzte Einstellungen in Konfigurationsdateien anzeigen ===== Hier ein Beispiel anhand der ''php.ini''. Grep filtert zunächst alle zeilen mit ; und danach die daraus entstandenen Leerzeilen. cat /etc/php/7.0/fpm/php.ini|grep -v -E "^\;"|grep -v -E "^$" ===== Ping mit Timestamp ===== ping |while read pong; do echo "$(date +%F_%X): $pong"; done ===== Timestamp als Funktion ===== Aktuelle Timestamp vor jedes ''echo'' angeben. LOGTS () { date "+%b %d %Y %H:%M:%S" } echo "$(LOGTS): etwas passiert" sleep 5 echo "$(LOGTS): etwas anderes passiert" ===== Datum Berechnung ===== In folgendem Script wir die Dauer der Laufzeit berechnet. #!/bin/bash # Aktueller Timestamp als Funktion ts () { date "+%b %d %Y %H:%M:%S" } # SleepTimer ist random zwischen 1 und 10 st=$(( ( RANDOM % 10 ) + 1 )) # Starttimestamp startts=`date --utc --date "$(ts)" +%s` echo "let's go" echo $startts sleep $st # Endtimestamp stopts=`date --utc --date "$(ts)" +%s` echo $stopts dauer=$(( $stopts-$startts )) echo "Das Script hat $dauer Sekunden gedauert." echo "ende" ===== USB-Device finden ===== Quelle: [[https://askubuntu.com/questions/1069457/get-name-and-device-file-path-of-usb-device-attached]] #!/bin/bash for sysdevpath in $(find /sys/bus/usb/devices/usb*/ -name dev); do ( syspath="${sysdevpath%/dev}" devname="$(udevadm info -q name -p $syspath)" [[ "$devname" == "bus/"* ]] || [[ "$devname" == "input/"* ]] || [[ "$devname" == "video0"* ]] || exit eval "$(udevadm info -q property --export -p $syspath)" [[ -z "$ID_SERIAL" ]] && exit busnum="$(udevadm info -a -p $(udevadm info -q path -n /dev/$devname) | awk -F "==" '/busnum/ {gsub("\"","");print $2}' | head -1)" devnum="$(udevadm info -a -p $(udevadm info -q path -n /dev/$devname) | awk -F "==" '/devnum/ {gsub("\"","");print $2}' | head -1)" bus_dev=${busnum}:${devnum} lsusb="$(lsusb -s $bus_dev)" echo "$lsusb - /dev/$devname" ) done ===== Betriebssystem Installationsdatum ===== Verschiedene Betriebssysteme haben verschiedene Möglichkeiten das Installationsdatum zu zeigen, hier sind einige. * Erstellungsdatum der Partition "/" sudo dumpe2fs $(findmnt / -no source) | grep 'Filesystem created:' * älteste Datei unter "/etc" ls -lct /etc | tail -1 | awk '{print $7, $6, $8}' * älteste Datei unter "/var/log/installer" ls --sort=t /var/log/installer -l | tail -n1