Update Code

This commit is contained in:
Patrick Niebeling
2025-07-18 09:22:50 +02:00
parent 160e478351
commit ba0bc6d7dc
2 changed files with 91 additions and 114 deletions

103
README.md
View File

@@ -1,91 +1,28 @@
tar-multibackup # 🔐 sshs Interaktiver SSH-Verbindungshelfer mit `fzf`
===============
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 Ein komfortables Bash-Skript zur schnellen SSH-Verbindung mit bekannten oder neuen Hosts.
cd /usr/local/src Jetzt auch mit direktem Aufruf über Parameter (z.B. `sshs host:port`).
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 ## 📦 Features
* `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 - Liest bekannte Hosts aus `~/.ssh/known_hosts`
- Zeigt Liste als `host:port` (durchsuchbar)
- Direkteingabe oder freie manuelle Eingabe möglich
- **Parameter-Unterstützung:**
- `sshs host`
- `sshs host:port`
- `sshs user@host`
- `sshs user@host:port`
- Standard-Port 22 bei fehlender Angabe
- Benutzername optional wählbar
* `DEBUG` = if set to "true", `set -x` will be set ---
* `CONFIG` = if you want to use a different configuration file than the
Example: ## 🧪 Beispiele
CONFIG=/tmp/testbackup.conf DEBUG=true multibackup Interaktiv starten:
#### Example configuration ```bash
sshs
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!

102
sshs.bash
View File

@@ -2,62 +2,102 @@
KNOWN_HOSTS="$HOME/.ssh/known_hosts" KNOWN_HOSTS="$HOME/.ssh/known_hosts"
# Hosts extrahieren ignoriert gehashte Zeilen # --- Funktion: SSH-Verbindung aufbauen ---
connect_ssh() {
local host="$1"
local port="$2"
local user="$3"
if [[ -n "$user" ]]; then
TARGET="${user}@${host}"
else
TARGET="$host"
fi
echo -e "\n🔌 Verbinde mit: $TARGET (Port $port)"
sleep 0.5
exec ssh -p "$port" "$TARGET"
}
# --- Wenn Parameter übergeben wurde, direkt nutzen ---
if [[ -n "$1" ]]; then
INPUT="$1"
# user@host:port
if [[ "$INPUT" =~ ^([^@]+)@([^:]+):([0-9]+)$ ]]; then
SSH_USER="${BASH_REMATCH[1]}"
HOST="${BASH_REMATCH[2]}"
PORT="${BASH_REMATCH[3]}"
# user@host
elif [[ "$INPUT" =~ ^([^@]+)@(.+)$ ]]; then
SSH_USER="${BASH_REMATCH[1]}"
HOST="${BASH_REMATCH[2]}"
PORT="22"
# host:port
elif [[ "$INPUT" =~ ^([^:]+):([0-9]+)$ ]]; then
SSH_USER=""
HOST="${BASH_REMATCH[1]}"
PORT="${BASH_REMATCH[2]}"
# host
else
SSH_USER=""
HOST="$INPUT"
PORT="22"
fi
connect_ssh "$HOST" "$PORT" "$SSH_USER"
exit 0
fi
# --- Hosts aus known_hosts im Format host:port extrahieren ---
HOSTS=$(awk ' HOSTS=$(awk '
{ {
split($1, hosts, ","); split($1, hosts, ",");
for (i in hosts) for (i in hosts) {
if (substr(hosts[i], 1, 1) != "|") if (substr(hosts[i], 1, 1) != "|") {
print hosts[i]; if (match(hosts[i], /^\[.*\]:[0-9]+$/)) {
hostport = hosts[i]
gsub(/^\[/, "", hostport)
gsub(/\]/, "", hostport)
print hostport
} else {
print hosts[i] ":22"
}
}
}
} }
' "$KNOWN_HOSTS" | sort -u) ' "$KNOWN_HOSTS" | sort -u)
# Eingabe mit fzf (Suchfenster) # --- Auswahl via fzf ---
INPUT=$( (echo "$HOSTS") | fzf --prompt="SSH zu Host (neu eingeben möglich): " --height=100% --layout=reverse --border --print-query) INPUT=$( (echo "$HOSTS") | fzf --prompt="SSH zu Host (z.B. host:port oder frei eingeben): " --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" readarray -t LINES <<< "$INPUT"
QUERY="${LINES[0]}" QUERY="${LINES[0]}"
SELECTED="${LINES[1]}" SELECTED="${LINES[1]}"
# Wenn nichts eingegeben und nichts ausgewählt → Abbruch
if [[ -z "$QUERY" && -z "$SELECTED" ]]; then if [[ -z "$QUERY" && -z "$SELECTED" ]]; then
exit 0 exit 0
fi fi
# Wenn etwas ausgewählt wurde, nutze das, sonst das Query (freie Eingabe)
if [[ -n "$SELECTED" ]]; then if [[ -n "$SELECTED" ]]; then
TARGET_RAW="$SELECTED" TARGET_RAW="$SELECTED"
else else
TARGET_RAW="$QUERY" TARGET_RAW="$QUERY"
fi fi
# Port & Host extrahieren aus Known Hosts Format [host]:port oder normal # host:port erkennen
if [[ "$TARGET_RAW" =~ ^\[([^\]]+)\]:(.+)$ ]]; then if [[ "$TARGET_RAW" =~ ^([^:]+):([0-9]+)$ ]]; then
HOST="${BASH_REMATCH[1]}" HOST="${BASH_REMATCH[1]}"
PORT="${BASH_REMATCH[2]}" PORT="${BASH_REMATCH[2]}"
else else
HOST="$TARGET_RAW" HOST="$TARGET_RAW"
PORT="" PORT="22"
fi fi
# Port-Abfrage nur wenn kein Port aus known_hosts gesetzt # Benutzername abfragen
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 read -rp "👤 Benutzername (leer für aktuellen User: $USER): " SSH_USER
[ -z "$SSH_USER" ] && SSH_USER=""
if [[ -n "$SSH_USER" ]]; then connect_ssh "$HOST" "$PORT" "$SSH_USER"
TARGET="${SSH_USER}@${HOST}"
else
TARGET="$HOST"
fi
echo -e "\n🔌 Verbinde mit: $TARGET (Port $PORT)"
sleep 0.5
exec ssh -p "$PORT" "$TARGET"