Code-Schnipsel

Unsortierte Sammlung von Codeschnipseln, die ich für erinnerns- oder wiederverwendungswert halte. Reminder: Ich bin kein Programmierer, use at your own risk and don’t judge me. :)

Navigation derzeit am besten via STRG+ALT+t oder den Klick auf das TOC-Symbol oben links.

[bash] Script-Skelett

#!/usr/bin/env bash
########################################################################
#
# Script:    Short description what this script does
# Author:    Folker "ph0lk3r" Schmidt
# Contact:   <info@ichbinein.org>
#
# Changelog (newest first):
#   - 2024-10-04: updated draft
#   - 2024-10-03: first draft
#
########################################################################

# Set error handling options
set -o errexit   # abort on nonzero exitstatus
set -o nounset   # abort on unbound variable
set -o pipefail  # don't hide errors within pipes

# Define script version
readonly version="0.0.1"

# Define some constants for later use
script_path="$(readlink -f "${0}")"
script_dir="$(dirname "${script_path}")"
script_name="$(basename "${script_path}")"
execution_time="$(date +%y-%m-%d_%H-%M-%S)"
logfile="${execution_time}_${script_name}.log"
readonly script_path
readonly script_dir
readonly script_name
readonly execution_time
readonly logfile

# Define some global variables
quiet=0

# Display usage information
function display_help {
  echo "
  usage: ${script_name} [options]
  -a            optional    Explanation for parameter -a
  -b            optional    Explanation for parameter -b
  -c arg        optional    Explanation for parameter -c with argument
  -h            optional    Print this help message
  -q            optional    Do not print logged messages"
}

# Log to a file
function log_to_file {
  current_timestamp="$(date)"
  message="${1}"
  if [[ $quiet -eq 1 ]]
  then
    echo "${current_timestamp}: ${message}" >> "${logfile}"
  else
    echo "${current_timestamp}: ${message}" | tee -a "${logfile}"
  fi
}

# Parse command line parameters
function parse_arguments {
  while getopts ':abc:hq' opt; do
    case "$opt" in
      a)
        echo "Processing option 'a'"
        ;;

      b)
        echo "Processing option 'b'"
        ;;

      c)
        arg="$OPTARG"
        echo "Processing option 'c' with '${arg}' argument"
        ;;

      h)
        display_help
        exit 0
        ;;

      q)
        quiet=1
        ;;
      :)
        echo -e "option requires an argument.\nUsage: ${script_name} [-a] [-b] [-c arg] [-h] [-q]"
        exit 2
        ;;

      ?)
        echo -e "Invalid command option.\nUsage: ${script_name} [-a] [-b] [-c arg] [-h] [-q]"
        exit 3
        ;;
    esac
  done
  shift "$(( OPTIND - 1 ))"
}

# Main code
function main {
  log "Script ${script_name} (version ${version}) called from directory ${script_dir}."
  parse_arguments "${@}"
}

# Just calling the main function after all functions are defined
main "${@}"

[bash] Text zentrieren

function display_center {
  columns="50"
  message="${1}"
  printf "%*s\n" $(( (${#message} + columns) / 2)) "${message}"
}

TAR-Archiv inline verschlüsseln und auf Tape schreiben

Wir generieren ein 214 Byte langes Passwort und speichern es in einer Datei. Wahlweise kann auch das Passwort direkt verwendet werden, hierzu bitte im Manual von openssl nachschauen. Wichtig ist, eine Blockziffer zu verwenden. AES-256 eignet sich besonders gut, da moderne Prozessoren die Verschlüsselung sehr schnell erledigen können.

openssl rand 214 > "/Pfad/zu/Passwort/in/Datei"
tar -c --directory "/Pfad/zu/Dateien" -f - "/Pfad/zu/Dateien" | openssl enc -aes-256-cbc -e -salt -pbkdf2 -iter 20000 -pass file:"/Pfad/zu/Passwort/in/Datei" | mbuffer -v 0 -m 1G -s 256k -P 95% -f -o "/Pfad/zum/Tapedevice"

Verschlüsselte Daten von Tape wiederherstellen

Zur Entschlüsselung wird das im vorigen Snippet generierte File verwendet. Bitte immer darauf achten, bestehende Keyfiles nicht zu überschreiben, sonst droht Datenverlust!

mbuffer -v 0 -m 1G -s 256k -P 95% -f -i "/Pfad/zum/Tapedevice" -o - | openssl enc -aes-256-cbc -d -iter 20000 -pass file:"/Pfad/zu/Passwort/in/Datei" | tar -x -f - --directory "/Pfad/zu/Dateien"