Bash Magic

Alle Befehle echoen

set -x oder in Script einfach #!/bin/bash -x

Cert-Ablaufdatum

DOMAIN=example.com
echo | openssl s_client -showcerts -servername $DOMAIN -connect ${DOMAIN}:443 2>/dev/null | openssl x509 -inform pem -noout -text | grep 'Not After' | sed 's/.*: //' 

SSH-Keys easy von einem Server auf den anderen kopieren

`ssh root@server1.com grep shah .ssh/authorized_keys | ssh server2.com tee -a .ssh/authorized_keys

Alle Domains aus BIND-Config lesen

Mit Vorsicht zu genießen! Deckt vermutlich nicht alle edge cases ab. cat /etc/bind/db.external/db.example.com.soa | sed -e '/^[[a-z0-9*]/!d' | awk -F ' ' '{ print $1 }'

Alle Rails-Deploys löschen, die älter sind als ein Monat

Beispiel example.com:

cd /var/www/app/shared/system/app-updates/production
find . -type d -maxdepth 1 ! -name "2019-08*" -exec echo rm -rf {} +

Monat vorher anpassen zu Monat von letztem Deploy mit mehreren Ordnern (könnte man automatisieren, aber schadet nicht da selbst ein Auge drauf zu haben). Wenn Ergebnis ok aussieht, das echo entfernen.

Alle Dateien mit exakter Größe löschen

for i in *; do size=$(stat -c%s $i); if [[ $size == 52428800 ]]; then rm $i; fi; done

snippets

now="$(date +%Y%m%d_%H%M%S%z)"

brace expansion

Mit Braces und komma wird das Dingen expandiert. ABER nicht mit space dazwischen, das macht kaputto! dig example.{com,net} wird zu dig example.com example.net

Ausrechnen, wieviel Text die Notizen haben

cd ~/notes/ && echo "Deine Notizen haben $(find . -name '*.md' -exec cat {} + | sed '/^[[:space:]]*$/d' | wc -l) Zeilen und $(find . -name '*.md' -exec cat {} + | sed '/^[[:space:]]*$/d' | wc -c) Zeichen. Wahnsinn!"

Variablennamen dynamisch übergeben

https://unix.stackexchange.com/questions/557361/how-to-dynamically-set-a-variable-name-in-shell-script

Also ${!var}

Real-life Beispiel: (check_env soll prüfen, ob Umgebungvariable gesetzt ist)

marvin@BWP-3200556:~$ docker run -it debian:latest
root@fb003c0e6d2c:/# check_env(){   [ -z "$1" ] && echo "$1 not defined" && exit 1; } # falsch / funktioniert nicht, weil -z gegen den reinen String prüft
root@fb003c0e6d2c:/# export TESTVAR=123
root@fb003c0e6d2c:/# check_env TESTVAR
root@fb003c0e6d2c:/# check_env asasfsafsd
root@fb003c0e6d2c:/# check_env(){   [ -z "${!1}" ] && echo "$1 not defined" && exit 1; } # so ists richtig
root@fb003c0e6d2c:/# check_env TESTVAR
root@fb003c0e6d2c:/# check_env asasfsafsd
asasfsafsd not defined
exit