Shell Skripte - eine kleine Sammlung
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