diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..e69de29 diff --git a/README.md b/README.md index e69de29..38ade6b 100644 --- a/README.md +++ b/README.md @@ -0,0 +1,91 @@ +tar-multibackup +=============== +Bash script to backup multiple folders and to clean up old backups based on a retention time. Features configurable post/pre-commands, tar excludes as well as backup retentions. + +### Installation + cd /usr/local/src + git clone https://gitea.gnilebein.de/gnilebein/tar-multibackup.git + ln -sf /usr/local/src/tar-multibackup/multibackup /usr/local/bin/multibackup + chmod +x multibackup + cp /usr/local/src/tar-multibackup/multibackup.conf ~/.multibackup.conf + +### Configuration and usage + +* `timestamp` = Format of the timestamp, used in the backup target filename +* `backup_destination` = Directory which is used to store the archives/backups +* `folders_to_backup` = Array of folders to backup +* `backup_retention` = Retention time how long we should keep the backups +* `pre_commands` = Array of commands that are executed before the backup starts (stop specific service) +* `post_commands` = Array of commands that are executed after the backup finished (start specific service) +* `tar_options` = Additional tar Options + +### Environment configurations + +* `DEBUG` = if set to "true", `set -x` will be set +* `CONFIG` = if you want to use a different configuration file than the + +Example: + + CONFIG=/tmp/testbackup.conf DEBUG=true multibackup + +#### Example configuration + +In the example below you can find a `multibackup` configuration file to backup a productional [LiveConfig](http://www.liveconfig.com/) instance. + +`vi ~/.multibackup.conf` + + # Timestamp format, used in the backup target filename + timestamp=$(date +%Y%m%d) + + # Destination where you want to store your backups + backup_destination="/var/backups" + + # Folders to backup + folders_to_backup=( + "/etc" + "/var/mail" + "/var/www" + "/var/lib/mysql" + "/var/spool/cron" + "/var/lib/liveconfig" + ) + + # Files and folders that are excluded in the tar command + tar_excludes=( + "nginx-php-fcgi.sock" + ) + + # Additional tar Options + tar_options=() + + # How long to you want to keep your backups (in days) + backup_retention="+7" + + # Commands that are executed before the backup started + # (We have to make sure the liveconfig process is not running) + # (otherwise the databases changes while we try to save it) + pre_commands=( + "service liveconfig stop" + ) + + # Commands that are executed after the backup is completed + # (To restart the liveconfig process again, once the backup is completed) + post_commands=( + "service liveconfig start" + ) + +#### Cronjob setup + +To make sure the backup is executed automatically and recurring, we're going to add a simple cronjob: + +`vi /etc/cron.d/backup-liveconfig` + + # + # cronjob to backup LiveConfig, daily at 5:00 am + # + + 0 5 * * * root /usr/local/bin/multibackup &>/dev/null + +#### CREDITS +This Backup Script is a fork of https://github.com/frdmn/tar-multibackup +Text kopiert! \ No newline at end of file diff --git a/sshs.bash b/sshs.bash new file mode 100644 index 0000000..f1569d5 --- /dev/null +++ b/sshs.bash @@ -0,0 +1,63 @@ +#!/bin/bash + +KNOWN_HOSTS="$HOME/.ssh/known_hosts" + +# Hosts extrahieren – ignoriert gehashte Zeilen +HOSTS=$(awk ' + { + split($1, hosts, ","); + for (i in hosts) + if (substr(hosts[i], 1, 1) != "|") + print hosts[i]; + } +' "$KNOWN_HOSTS" | sort -u) + +# Eingabe mit fzf (Suchfenster) +INPUT=$( (echo "$HOSTS") | fzf --prompt="SSH zu Host (neu eingeben möglich): " --height=100% --layout=reverse --border --print-query) + +# fzf gibt als erstes die Suchanfrage aus, dann die Auswahl +# split in erste Zeile (Query) und zweite Zeile (Auswahl) +readarray -t LINES <<< "$INPUT" +QUERY="${LINES[0]}" +SELECTED="${LINES[1]}" + +# Wenn nichts eingegeben und nichts ausgewählt → Abbruch +if [[ -z "$QUERY" && -z "$SELECTED" ]]; then + exit 0 +fi + +# Wenn etwas ausgewählt wurde, nutze das, sonst das Query (freie Eingabe) +if [[ -n "$SELECTED" ]]; then + TARGET_RAW="$SELECTED" +else + TARGET_RAW="$QUERY" +fi + +# Port & Host extrahieren aus Known Hosts Format [host]:port oder normal +if [[ "$TARGET_RAW" =~ ^\[([^\]]+)\]:(.+)$ ]]; then + HOST="${BASH_REMATCH[1]}" + PORT="${BASH_REMATCH[2]}" +else + HOST="$TARGET_RAW" + PORT="" +fi + +# Port-Abfrage nur wenn kein Port aus known_hosts gesetzt +if [[ -z "$PORT" ]]; then + read -rp "🔢 Port (leer für 22): " PORT + PORT=${PORT:-22} +fi + +# User-Abfrage +read -rp "👤 Benutzername (leer für aktuellen User: $USER): " SSH_USER + +if [[ -n "$SSH_USER" ]]; then + TARGET="${SSH_USER}@${HOST}" +else + TARGET="$HOST" +fi + +echo -e "\n🔌 Verbinde mit: $TARGET (Port $PORT)" +sleep 0.5 + +exec ssh -p "$PORT" "$TARGET" \ No newline at end of file