#!/bin/bash # Autor: Branislav Zeljak # Version: v0.9 # Beschreibung: Dieses Skript erstellt VirtualBox-VMs und klont Festplatten parallel. # Verwendung: Führen Sie das Skript aus und befolgen Sie die Eingabeaufforderungen. clear # %--------------------start/Funktionen--------------------% # Funktion zum Überprüfen der Benutzerexistenz check_user_existence() { local VAR_USER_IN_GROUP="$1" if ! grep -q "^$VAR_USER_IN_GROUP:" /etc/passwd; then echo "Der Benutzer $VAR_USER_IN_GROUP existiert nicht auf diesem System." exit 1 fi } get_group_users() { local groupname="$1" local members members=$(getent group "$groupname" | cut -d: -f4) if [[ -n "$members" ]]; then echo "$members" | tr ',' '\n' else echo "Die Gruppe $groupname existiert nicht oder hat keine Mitglieder." fi } # Funktion, um einen zufälligen Host-Namen aus der Liste auszuwählen get_random_name() { # Liste der Namen local names=("frodo" "samweis" "gandalf" "aragorn" "legolas" "gimli" "boromir" "meriadoc" "peregrin" "arwen" "galadriel" "celeborn" "elrond" "glorfindel" "faramir" "eowyn" "theoden" "treebeard" "gollum" "sauron" "saruman" "bilbo" "denethor" "radagast" "thranduil" "bard" "dori") # Zufälligen Index auswählen local random_index=$((RANDOM % ${#names[@]})) echo "${names[random_index]}" } # Funktion zur Generierung eines eindeutigen RDP-Ports generate_rdp_port() { local rdp_port rdp_port=$(shuf -i 3390-49151 -n 1) echo "$rdp_port" } # Funktion zum Suchen einer ISO-Datei basierend auf einem Muster find_iso_files() { local iso_dir="$1" find "$iso_dir" -type f -name "*.iso" | sort } # Funktion, um das Betriebssystem basierend auf der ISO-Datei zu identifizieren identify_os() { local iso_file="$1" case "$(basename "$iso_file")" in *ubuntu*server*) echo "Ubuntu_64" ;; *ubuntu*desktop*) echo "Ubuntu_64" ;; *debian*) echo "Debian_64" ;; *rhel*) echo "RedHat_64" ;; *CentOS*) echo "RedHat_64" ;; *Fedora-Workstation*) echo "Fedora_64" ;; *Fedora-Server*) echo "Fedora_64" ;; *kali-linux*) echo "kali-linux" ;; *linuxmint*) echo "Linux_64" ;; *openSUSE*) echo "OpenSUSE_64" ;; *manjaro*) echo "ArchLinux_64" ;; *) echo "Unbekannt" ;; esac } # %--------------------end/Funktionen--------------------% echo "User / Passwort: user00/Start1234" echo "Welches VDI-OS soll installiert werden?" echo echo "Für wen soll es sein?" echo COLUMNS=10 PS3="Ihre Auswahl: " options=("Aktueller Benutzer" "Anderer Benutzer" "Mitglieder einer Gruppe" "Beenden") select opt in "${options[@]}" do case $opt in "Aktueller Benutzer") VAR_GROUP_MEMBERS=$(whoami) ;; "Anderer Benutzer") read -p "Bitte geben Sie einen Benutzernamen ein: " VAR_GROUP_MEMBERS if ! check_user_existence "$VAR_GROUP_MEMBERS"; then exit 1 fi ;; "Mitglieder einer Gruppe") read -p "Bitte geben Sie den Gruppennamen ein: " VAR_GROUP if getent group "$VAR_GROUP" &>/dev/null; then echo "Mitglieder der Gruppe $VAR_GROUP:" get_group_users "$VAR_GROUP" VAR_GROUP_MEMBERS=($(get_group_users "$VAR_GROUP")) else echo "Die Gruppe $VAR_GROUP existiert nicht auf diesem System." exit 1 fi ;; "Beenden") exit ;; esac break done # Variable für das Verzeichnis VAR_VB="/storage/vbox_storage" # Verzeichnis mit ISO-Dateien ISO_DIR="/srv/data/ISO/" echo "Verfügbare ISO-Dateien werden durchsucht..." echo # Vorhandene ISO-Dateien finden und zur Auswahl anbieten iso_files=($(find_iso_files "$ISO_DIR")) if [ ${#iso_files[@]} -eq 0 ]; then echo "Keine ISO-Dateien im Verzeichnis $ISO_DIR gefunden." exit 1 fi PS3="Bitte wählen Sie eine ISO-Datei aus: " select iso_file in "${iso_files[@]}" "Beenden" do if [[ "$iso_file" == "Beenden" ]]; then exit 0 fi if [ -n "$iso_file" ]; then selected_iso="$iso_file" break else echo "Ungültige Auswahl. Bitte versuchen Sie es erneut." fi done # Betriebssystem auf Basis der ausgewählten ISO identifizieren os_name=$(identify_os "$selected_iso") if [ "$os_name" == "Unbekannt" ]; then echo "Das Betriebssystem konnte nicht automatisch erkannt werden." read -p "Bitte geben Sie das Betriebssystem manuell ein: " os_name fi # Benutzerdefinierte Werte anfordern default_name=$(get_random_name) read -p "Wie viele VMs werden benötigt? [1]: " VAR_QUANTITY VAR_QUANTITY=${VAR_QUANTITY:-1} read -p "Präfix Host Name (Vorgabe: $default_name): " VAR_NAME_PREFIX read -p "CPUs [2]: " VAR_CPU VAR_CPU=${VAR_CPU:-2} read -p "Memory [2048]: " VAR_MEM VAR_MEM=${VAR_MEM:-2048} read -p "Anzahl der HDDs (Standard: 1): " VAR_ADDITIONAL_HDD VAR_ADDITIONAL_HDD=${VAR_ADDITIONAL_HDD:-1} # Standardwerte festlegen, wenn keine Eingabe erfolgt VAR_VIDEO_RAM=64 VAR_NIC1="nat" VAR_NIC2="bridged" VAR_NET=$(ip addr show | grep "^2: " | awk '{print $2}' | sed 's/://') VAR_NAME_PREFIX=${VAR_NAME_PREFIX:-$default_name} # Schleife zur Erzeugung der VMs für jeden Benutzer in der Gruppe for VAR_USER_IN_GROUP in "${VAR_GROUP_MEMBERS[@]}" do # Generiere einen eindeutigen RDP-Port VAR_RDP_PORT=$(generate_rdp_port) # Schleife zur Erzeugung der angeforderten Anzahl von VMs for ((i = 1; i <= VAR_QUANTITY; i++)) do # VM erstellen VM_NAME="${VAR_NAME_PREFIX}_${VAR_USER_IN_GROUP}_VM$(printf "%02d" $i)" VM_DIR="$VAR_VB/$VAR_USER_IN_GROUP" sudo -u "$VAR_USER_IN_GROUP" VBoxManage createvm \ --name "$VM_NAME" \ --ostype "$os_name" \ --register \ --basefolder "$VM_DIR" # Prüfen, ob der Befehl erfolgreich war if [ $? -ne 0 ]; then echo "Fehler beim Erstellen der VM $VM_NAME." continue fi # VM-Konfigurieren sudo -u "$VAR_USER_IN_GROUP" VBoxManage modifyvm "$VM_NAME" \ --ioapic on \ --memory "$VAR_MEM" \ --cpus "$VAR_CPU" \ --vram "$VAR_VIDEO_RAM" \ --nic1 $VAR_NIC1 \ --nic2 $VAR_NIC2 \ --bridgeadapter2 ${VAR_NET} \ --graphicscontroller "vboxsvga" \ --vrde on \ --vrdemulticon on \ --vrdeport "$VAR_RDP_PORT" # Festplattencontroller hinzufügen sudo -u "$VAR_USER_IN_GROUP" VBoxManage storagectl "$VM_NAME" \ --name "SATA Controller" \ --add sata \ --controller IntelAhci sudo -u "$VAR_USER_IN_GROUP" VBoxManage storagectl "$VM_NAME" \ --name "IDE Controller" \ --add ide \ --controller PIIX4 sudo -u "$VAR_USER_IN_GROUP" VBoxManage storageattach "$VM_NAME" \ --storagectl "IDE Controller" \ --port 1 \ --device 0 \ --type dvddrive \ --medium "$selected_iso" # Schleife zur Erzeugung von zusätzlichen Festplatten for ((j = 1; j <= VAR_ADDITIONAL_HDD; j++)) do HDD_NUM=$(printf "%02d" $j) HDD_NAME="${VM_NAME}-disk${HDD_NUM}.vdi" sudo -u "$VAR_USER_IN_GROUP" VBoxManage createhd \ --filename "$VM_DIR/$VM_NAME/$HDD_NAME" \ --size 102400 \ --format VDI sudo -u "$VAR_USER_IN_GROUP" VBoxManage storageattach "$VM_NAME" \ --storagectl "SATA Controller" \ --port "$HDD_NUM" \ --device 0 \ --type hdd \ --medium "$VM_DIR/$VM_NAME/$HDD_NAME" done done done echo "VMs wurden für alle wie angegeben erstellt."