Bash Scripte kompilieren

Auf der Suche nach einer Möglichkeit Bash Scripte zu kompilieren bin ich auf SHC gestossen. Man kann sich fragen warum ein bash Script kompiliert werden sollte: Ganz einfach, so kann nicht jeder den Inhalt lesen, was vorallem interessant ist, wenn das bash Script Passwörter enthält.

SHC wurde von Francisco Javier Rosales García entwickelt. Installiert wird SHC aus dem Repository oder kann direkt beim Entwickler heruntergeladen werden.


foobar:/home/camma# apt-get install shc

Das Bash Script kompiliert man so:
Zuerst muss ein Script erstellt werden:
linux:/home/camma# echo "#!/bin/sh" > meinbashscript.sh
linux:/home/camma# echo "echo \"Hallo Welt, ich bin kompiliert\" " > meinbashscript.sh

Nun muss getestet werden ob’s auch funktioniert.

linux:/home/camma# sh meinbashscript.sh
Hallo Welt, ich bin kompiliert

Nun kann das Script kompiliert werden:

linux:/home/camma# shc -f meinbashscript.sh

Kommt hier eine Fehlermeldung kann es sein, dass auf der Zeile 1 kein #!/bin/sh steht. Nun kann kontrolliert werden, ob das Script auch funktioniert.

linux:/home/camma# ./meinbashscript.sh.x
Hallo Welt, ich bin kompiliert

Es funktioniert. Der Compiler hängt jeweils am Schluss ein .x an den Dateinamen.

Bash Script zum erstellen eines File und MySQL Backup mit FTP Upload

Update 21.07.2009
– mysqldump angepasst, damit die dumps auch mit phpMyAdmin eingelesen werden können.
– durchgängige Benennung der Dateien (Zeitformat überall gleich)
– Problembehebung Zeitformat (19:22:20 hat zumindest Mac auf einem smb Share nicht gerne)
– DB information_schema wird nicht mehr mitgesichert
– Vor jeder File Erstellung wird die Zeit neu eingelesen. Dadurch hat man die genaue Übersicht des Backupzeitpunkts

Update 30.06.2009 – INCFILE Pfad angepasst. Nun wird das tar-inc-backup.dat File sicher im gleichen Ordner wie das Script abgelegt.

Gestern habe ich das für mich ultimative Script zum erstellen eines Backup via Bash Script entdeckt.


#!/bin/sh
# Website + MySQL backup script
# Full backup day - Sun (rest of the day do incremental backup)
# Copyright (c) 2005-2006 nixCraft
# This script is licensed under GNU GPL version 2.0 or above
# Modified June 2009 by BlatterTech Informatik www.blattertech.ch
#
# Restore Database Backup
# gunzip mybackup.sql.gzip
# mysql -u USER -p dbname < mybackup.sql # # Restore Files # You need to restore the last full backup first ($FULLBACKUP day) # followed by each of the subsequent incremental backups to the # present day in the correct order. # # --------------------------------------------------------------------- ### Backp Name ### BACKUPSET="Backup of Website xy" SHORTNAME="websitexy" ### System Setup ### DIRS="/home/path/to/files /home/path/to/other/files" BACKUP=/tmp/backup.$$ NOW=$(date +"%Y%m%d") SCRIPTPATH=`dirname $0` INCFILE="$SCRIPTPATH/$SHORTNAME-tar-inc-backup.dat" DAY=$(date +"%u") # 1=Mon, 2=Tue, 3=Wed, .. FULLBACKUP="2" ### MySQL Setup ### MUSER="mysqluser" MPASS="mysqlpassword" MHOST="localhost" MYSQL="$(which mysql)" MYSQLDUMP="$(which mysqldump)" GZIP="$(which gzip)" ### FTP server Setup ### FTPD="/path/on/ftpserver" FTPU="ftpuser" FTPP="ftppassword" FTPS="your.ftpserver.com" NCFTP="$(which ncftpput)" ### Other stuff ### EMAILID="your@email.com" ### Start Backup for file system ### [ ! -d $BACKUP ] && mkdir -p $BACKUP || : ### See if we want to make a full backup ### i=$(date +"%Hh%Mm%Ss") if [ ! -f $INCFILE ]; then FTPD="$FTPD/full" FILE="$SHORTNAME-files-full-$NOW-$i.tar.gz" tar -g $INCFILE -zcvf $BACKUP/$FILE $DIRS elif [ "$DAY" == "$FULLBACKUP" ]; then FTPD="$FTPD/full" FILE="$SHORTNAME-files-full-$NOW-$i.tar.gz" tar -zcvf $BACKUP/$FILE $DIRS else FTPD="$FTPD/incremental" FILE="$SHORTNAME-files-i-$NOW-$i.tar.gz" tar -g $INCFILE -zcvf $BACKUP/$FILE $DIRS fi ### Start MySQL Backup ### # Get all databases name DBS="$($MYSQL -u $MUSER -h $MHOST -p$MPASS -Bse 'show databases')" for db in $DBS do if [ "$db" == "information_schema" ]; then continue fi i=$(date +"%Hh%Mm%Ss") FILE=$BACKUP/$SHORTNAME-mysql-$db.$NOW-$i.sql.gz $MYSQLDUMP -Q --opt --compact -u $MUSER -h $MHOST -p$MPASS $db | $GZIP -9 > $FILE
# FILE=$BACKUP/$SHORTNAME-mysql-$db.$NOW-$(date +"%T").sql.bz2
# $MYSQLDUMP -Q --opt --compact -u $MUSER -h $MHOST -p$MPASS $db | bzip2 -cq9 > $FILE
done

i=$(date +"%Hh%Mm%Ss")
### Make md5 Sum ###
$(which md5sum) -b $BACKUP/* >$BACKUP/$SHORTNAME-backup$NOW-$i.md5

### Dump backup using FTP ###
#Start FTP backup using ncftp
#If ncftp not aviable, use ftp:
#ftp -inv $FTPS <$T
echo "Hostname: $(hostname)" >>$T
echo "Backup Set: $BACKUPSET"
echo "Backup failed" >>$T
mail -s "BACKUP FAILED" "$EMAILID" <$T rm -f $T fi

Das Script habe ich hier gefunden.

Auf der selben Seite gibt es einen Generator um das Script mit den eigenen Parametern abzufüllen.
http://bash.cyberciti.biz/backup/wizard-ftp-script.php

Ich habe das Script noch ein wenig aufgebohrt. So habe ich die Möglichkeit geschaffen beim Fehlermail mitzugeben welches Backup den Fehler verursacht hat. Zudem habe ich die Bezeichnung des Backuptages auf die Tagesnummer geändert. Somit ist das Script nicht von der Systemsprache abhängig.
Zu guter letzt, habe ich eine Prüfung eingebaut ob das tar.dat File vorhanden ist. Dieses wird für das incrementelle Backup verwendet. Falls dieses nicht existiert, wird ein Fullbackup gemacht.

Kunden von CeviNet können das Script einfach in Ihrem Webspace als Cronjob einbinden:

Cronjob einrichten

Cronjob einrichten

GNU Screen

GNU Screen ist ein Konsolenprogramm mit der man mehrere virtuelle Konsolen eröffnen kann. Der Vorteil von Screen liegt darin, dass die Screen Sessions nach dem Ausloggen auf dem Server offen bleiben. Somit kann ein Programm gestartet werden und bleibt laufen obwohl man ausgeloggt ist.

Ein weiterer Vorteil von Screen, ist das Session Sharing. So können zwei verschiedene Personen auf der gleichen Screen Session arbeiten. Das heisst, beide sehen gleichzeitig die Eingaben des anderen. Ich habe dies schon mehrfach bei komplizierteren Operationen an Servern oder zur Schulung benutzt.

Screen ist bei den meisten Linux Distributionen enthalten oder kann aus den Quellen installiert werden.


screen -> startet eine Shell. Auch "screen programm"
Strg+a in Verbindung mit weiteren Tastenkombinationen für Befehle ausführen
Strg+a, c für weitere virtuelle konsolen.
Strg+a, Leertaste zum zwischen den virtuellen Shells zu switchen
Strg+a, d wird screen verlassen läuft aber im Hintergrund
screen -r zum Sitzung wiederherstellen (z.B. nach erneutem Login)
screen -x --> Session Sharing (wird durch die zweite Person ausgeführt)

Ubuntu – sudo für Benutzer einrichten

Vor kurzem musste ich wieder mal auf der Ubuntu Kiste für einen neuen User sudo einrichten. So halte ich nun hier die Befehle fest die es braucht um Sudo einzurichten.
Um sudo für einen User einzurichten muss in /etc/sudoers folgende Zeile ergänzt werden:


# Members of the admin group may gain root privilege
%admin ALL=(ALL) ALL

Zum Editieren sollte visudo verwendet werden.
Danach auf der Konsole folgende Befehle ausführen


# /usr/sbin/groupadd admin
# /usr/sbin/usermod -g admin Benutzer

Wird ein neuer Benutzer erstellt der dieser Gruppe zugeordnet werden soll:


# useradd -G GRUPPE USERNAME