Shell Skripte - eine kleine Sammlung

Aus Laub-Home Wiki

Dies ist eine kleine Sammlung an nützlichen kleinen Shell Skripten, die ich so im Laufe der Jahre angesammelt habe.

Skript Laufzeit berechnen

Hier ein paar Zeilen um Start und Endzeit zu speichern und später die Laufzeit des Skriptes auszugeben:

script-runtime.sh

#!/bin/bash
# Skript Laufzeit berechnen
# by A.Laub andreas[-at-]laub-home.de

# Sekundenzaehler starten ########################################
anfang=$(date +%s)

##################################################################
###Skript Aufrufe#################################################
echo "Schlafen für 10s"
sleep 10


##################################################################
# Sekundenzaehler stoppen ########################################
ende=$(date +%s)

# benoetigte Zeit in Sekunden berechnen ##########################
diff=$[ende-anfang]

# Prüfen, ob benoetigte Zeit kleiner als 60 sec ##################
if [ $diff -lt 60 ]; then
        echo -e 'Runtime '$diff' secs'

# Wenn gleich oder groeßer 60 Sekunden, ##########################
# in Minuten und Sekunden umrechnen ##############################
elif [ $diff -ge 60 ]; then
        echo -e 'Runtime '$[$diff / 60] 'min(s) '$[$diff % 60] 'secs'
fi

MySQL Datenbanken optimieren

Hier ein kleines Skript mit dem man alle Datenbanken eines MySQL Servers optimieren kann:

optimize_tables.sh

# Change these variables to reflect your situation.
dbhost="localhost"
sqluser="adminuser"
password="password"

mysqlcheck -u$sqluser -p$password -h$dbhost --auto-repair --check --optimize --all-databases

Für Docker Container:

SFTP Upload Sicherungs Script

Dieses kleine Skript erstellt ein tar.gz Archiv eines Ordners mit Timestamp und schiebt dieses via sftp auf einen Server.

sftp-transfer.sh

#!/bin/bash
# File Transfer Sicherungs Script via SFTP
# by A.Laub andreas[-at-]laub-home.de

TIMESTAMP=$(date +%Y-%m-%d_%H:%M)

if [ ! -d /tmp/trans/ ]; then
        mkdir /tmp/trans/
fi

tar -czvf /tmp/trans/export-$TIMESTAMP.tar.gz /srv/export/

echo "cd in" > /tmp/trans/sftpbatch
echo "put /tmp/trans/export-$TIMESTAMP.tar.gz" >> /tmp/trans/sftpbatch
sftp -b /tmp/trans/sftpbatch -o PubkeyAuthentication=yes -o IdentityFile=/root/.ssh/id_dsa user@10.100.10.10

rm -f /tmp/airplustrans/webcontract-export-$TIMESTAMP.tar.gz

Rsync sync Script

Hier ein Skript was via Rsync Daten von a nach b kopiert und diese exakt gleich hält:

sync-script.sh

#!/bin/bash
# sync-script.sh
# Syncs Folder a to B
# by A.Laub andreas[-at-]laub-home.de

#Sync Path
#WARNING: No / at end of path
SYNCPATH="/srv"

#Exclude Files (for every exclude you need --exclude: "--exclude *.jpg --exclude *.txt)
#EXCLUDE="--exclude *.tc"

#Sync Target
#for Rsync over SSH: Backup path on target system
SYNCTARGET="/srv"

#User
RSUSER="root"

#Target Host
RSTARGET="192.168.0.2"


/usr/bin/rsync --delete -avz --progress --partial --inplace $EXCLUDE $SYNCPATH $RSUSER@$RSTARGET:$SYNCTARGET

DNS Einträge prüfen

Hier ein kleines Skript, was prüft ob ein DNS Rekord schon angelegt und verfügbar ist. Es benachrichtigt dann via Mail.
checkdnsrecord.sh

#!/bin/bash
# checkdnsrecord.sh
# by A.Laub andreas[-at-]laub-home.de

DOMAINS="wiki.laub-home.de www.neuedomain.de"
MAIL="mailadresse@domain.com"

for i in $DOMAINS; do
if [ -z "$(nslookup $i | grep "server can't find $i")" ]; then
        nslookup $i | mail -s "$i ist angelegt" $MAIL
fi
done

in den Cron Hourly mittels:

ln -s /usr/local/sbin/checkdnsrecord.sh /etc/cron.hourly/checkdnsrecord.sh

Oracle Datenbank Backup Skript

Zur Vorbereitung muss im Oracle Datenbankserver das Backup Directory gesetzt werden. Hierzu sollte man sich als "oracle" User am System einloggen und dann an die Datenbank verbinden:

sqlplus / as sysdba

Nun kann man sich mit folgendem Befehl die bestehenden Directories ausgeben:

select * from all_directories;

mit diesem Befehl wird dann das neue Backup Dir gesetzt:

create directory BACKUP_DIR as '/srv/backup';
exit

Hier ein kleines Skript mit dem man Oracle Full Backups mit expdp erstellen kann.

oracle-backup.sh

#!/bin/bash
# oracle-backup.sh
# Oracle Full Dump Skript mit Mail Benachrichtigung
# by A. Laub andreas[-at-]laub-home.de

# Set Variables
ORACLE_BASE=/srv/u01/app/oracle
ORACLE_HOME=$ORACLE_BASE/product/11.2.0.3/dbhome_1
BACKUPDIR=/srv/backup
BACKUPFILE=oracle-full.dmp
ORACLESHELLUSER=oracle
USER=system
PASSWORD=password
DBNAME=TNSALIAS
LOGFILE=oracle-full.log
DPATH="/srv/u01/app/oracle/product/11.2.0/dbhome_1/bin"
MAIL=mail@domain.de

# Delete old Backups
rm -f $BACKUPDIR/$BACKUPFILE.gz


# Run Backup
su - $ORACLESHELLUSER -c "export ORACLE_HOME=$ORACLE_HOME; $DPATH/expdp $USER/$PASSWORD@$DBNAME DIRECTORY=BACKUP_DIR DUMPFILE=$BACKUPFILE FULL=y LOGFILE=$LOGFILE"

# Zippen
gzip $BACKUPDIR/$BACKUPFILE

# Statusmail
if [ -n "$(grep "successfully completed" $BACKUPDIR/$LOGFILE)" ]; then
        mail -s "$(hostname -s) - DB-Dump - $(grep "successfully completed" $BACKUPDIR/$LOGFILE | awk '{print $3" "$4 }')" $MAIL < $BACKUPDIR/$LOGFILE
else
        mail -s "$(hostname -s) - DB-Dump - ERROR" $MAIL < $BACKUPDIR/$LOGFILE
fi

MySQL Datenbank Backup Skript

hier ein kleines Skript um eine MySQL Datenbank komplett zu sichern.

Der benutze Backup Benutzer sollte mindestens folgende Rechte besitzen:

SELECT, SHOW DATABASES, LOCK TABLES, SHOW VIEW

so legen wir den User an:

mysql -uroot -p

dann:

CREATE USER 'backup'@'localhost' IDENTIFIED BY  'yourpassword';

GRANT SELECT , 
SHOW DATABASES ,
LOCK TABLES ,
EVENT ,
SHOW VIEW ON * . * TO  'backup'@'localhost' IDENTIFIED BY  '***' WITH MAX_QUERIES_PER_HOUR 0 MAX_CONNECTIONS_PER_HOUR 0 MAX_UPDATES_PER_HOUR 0 MAX_USER_CONNECTIONS 0 ;

mysqldump.sh

#!/bin/bash
#
# mysqldump.sh
#
# MySQL Database Dump
#
# Sichert die Datenbank auf die lokale Platte
# behält Backups 3 Tage
#
# by A. Laub andreas[-at-]laub-home.de

export PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

DB_USER="backupuser"
DB_PASSWD="backuppassword"

OUT="/srv/mysql-backup"

DATE=`date +%Y-%m-%d_%H:%M`
ALT=`date +%Y-%m-%d -d "3 days ago"`

mysqldump --user=$DB_USER --password=$DB_PASSWD --events --all-databases > $OUT/mysqldump.$DATE.sql
nice -n 19 gzip $OUT/mysqldump.$DATE.sql

rm -rf $OUT/mysqldump.$ALT*

Dies ist ein einfaches Skript. Ein weiteres Skript um MySQL oder MariaDB Datenbanken zu sichern findet ihr hier:

Loggen der HDD Spindown bzw. Spinup Zyklen

Dieses Skript prüft auf einen Status Wechsel des Statuses (Suspend/Active) einer oder mehrerer Festplatten. So wird protokiliert wann eine Festplatte in den Suspend geht und wann diese wieder Active ist.
drivestate.sh

#!/bin/bash
# This Script logs the drive State Changes of an HDD using hdparm
# by A. Laub andreas[-at-]laub-home.de

#Load the Pathes
export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

# HHD="/dev/sda /dev/sdb /dev/sdc"
HDD="/dev/sda /dev/sdb"
UTC=$(date +%s)
for i in $HDD; do
        DISK=$(echo "$i" | awk -F"/" '{ print $3 }')
        NOW=$(hdparm -C $i | grep "drive state" | awk '{ print $4 }')
        if [ -f /tmp/drivestate-$DISK ]; then
                LAST=$(cat /tmp/drivestate-$DISK)
                if [ $NOW != $LAST ]; then
                        echo "$NOW" > /tmp/drivestate-$DISK
                        echo "$(date +"%b %d %H:%M:%S") drivestate of $i changed to $NOW at $UTC" >> /var/log/drivestate
                fi
        else
                echo "$NOW" > /tmp/drivestate-$DISK
        fi
done

damit es regelmäßig checkt einfach einen cronjob einrichten:
crontab -e

# Check the Drivestate
* * * * * /usr/local/sbin/drivestate.sh

Dateien Umbenennen

Will man in mehreren Dateinamen etwas ändern, zum Beispiel einen Domainname im Logfile, kann man dies mit folgendem kleinen Skript machen. Bei diesem Beispiel wird die Domain im Dateinamen in eine andere geändert. Also eine Art Suchen und Ersetzen für Dateien.

search-replace-files.sh

#!/bin/bash
SUCHEN="www.domain1.de"
ERSETZEN="www.domain2.de"
INORDNER="/var/log/httpd/"

cd $INORDNER
for i in $(find . -iname "*$SUCHEN*" | awk -F './' '{print $2}'); do
        mv $i $(echo $i| sed s/$SUCHEN/$ERSETZEN/g)
done

Zeichensatz von Dateien konvertieren

Will man zum Beispiel in PHP Dateien den Zeichensatz von iso-8859-1 nach UTF-8 konvertieren, kann das folgende kleine Skript weiterhelfen:
convert-charset.sh

#!/bin/bash
for i in $(find . -iname "*.php"); do
        iconv -f iso-8859-1 -t UTF-8 $i > $i.bak
        mv $i.bak $i
done