Inhaltsverzeichnis

Scriptschnipsel

Hier sind div. Schnipsel aus irgendwelchen Scripten zusammengestellt, die vielleicht einen Denkanstoß beim
scripten bringen.

Grundlagen

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 [ <BEDINGUNG> == "y" -o <BEDINGUNG> == "Y" ]; then
  <BEFEHL>
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
  <BEFEHL>
else
  exit
fi

Ordner prüfen

Erstellen eines Ordners wenn er nicht existiert.

if [ ! -d "<ORDNER_NAME>" ]; then
  <BEFEHL>
else
  exit
fi

Befehl existiert

Prüfen ob ein Befehl existiert.

if [ -x $(command -v <BEFEHL>)  ]; 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 backupscript

Verzeichnisse vergleichen

diff -rqy <DIR1> <DIR2>
Parameter Beschreibung
r recursiv
q kurze ausgabe; nur unterschiedliche Dateien anzeigen
y tabelarische Ausgabe

Mit "ls" nur Ordner anzeigen

ls -d <PFAD> | sed 's!/$!!'

Mit "ls" nur Dateien anzeigen

ls -l <PFAD> | awk '{print $9}'

oder eine einzelne Datei

ls -l <PFAD> | awk '{print $9}'|grep <DATEINAME>

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=<PFAD_ZUM_ZUPRÜFENDEM_VERZEICHNIS>
WORKDIR=<PFAD_ZUM_VERZEICHNIS_DIESES_SCRIPTES>
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=<ZIELPFAD>
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.

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 '<SUCHBEGRIFF>' {} \;

Copy-Archive

#!/bin/bash
# 
 
SRCDIR="<QUELL_PFAD>"
DESTDIR="<ZIEL_PFAD>"
HOSTNAME=`hostname`
FILENAME=<DATEI_NAME_OHNE_SUFFIX>
 
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=<PFAD_ZU_QUELLE>
export DEST=<PFAD_ZU_ZIEL>
 
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 NRPE entstanden.
Damit das ganze funktioniert, erstellt man sich zunächst einer Ordnerstruktur.

mkdir -p <WORKDIR> <WORKDIR>/aktuell <WORKDIR>/neu

Jetzt benötigt man noch einen RSA-PublicKey für die passwordlose authentifizierung an einem SSH-Host → siehe 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: "<HOSTNAME>.<DOMAIN>.<TLD>|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 <WORKDIR>/servers

Inhalt:

<HOSTNAME1>.<DOMAIN>.<TLD>|0
<HOSTNAME2>.<DOMAIN>.<TLD>|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}
  <COMMAND>
done < <FILENAME>

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/<USB_ROOT_HUB>-<HUB_PORT>/<USB_ROOT_HUB>-<HUB_PORT>:*/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 <PFADE_ZU_TEMP_UNZIP_ORDNER>; cat <PFADE_ZU_TEMP_UNZIP_ORDNER>/<LOGDATEI_NAME> >> <AUSGABEDATEI_NAME>; 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 <IP_OR_HOSTNAME>|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.