#!/bin/bash # fix-vm-access.sh # Script per fixare accesso SSH e password su VM che non rispondono set -e VM_ID=${1:-201} SSH_KEY="ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIOyva+cul3WOW3ct53a0QMRTkhtKvA2QpJI0p8bv48tH alex@alex-XPS-15-9570" ROOT_PASSWORD="TempProxmox123!" echo "=== VM Access Fix Tool ===" echo "VM ID: $VM_ID" echo "" # Ferma la VM echo "⏸ Stopping VM $VM_ID..." qm stop $VM_ID || true sleep 5 # Trova il disco echo "πŸ” Finding VM disk..." DISK_INFO=$(qm config $VM_ID | grep -E "^scsi0:" | head -1) echo "Disk info: $DISK_INFO" # Estrai il volume VOLUME=$(echo "$DISK_INFO" | cut -d: -f2 | cut -d, -f1 | xargs) echo "Volume: $VOLUME" # Converti il path del volume in device path STORAGE_NAME=$(echo $VOLUME | cut -d: -f1) DISK_NAME=$(echo $VOLUME | cut -d: -f2) # Check storage type STORAGE_TYPE=$(pvesm status | grep "^$STORAGE_NAME " | awk '{print $2}') echo "Storage type: $STORAGE_TYPE" if [[ $STORAGE_TYPE == "zfspool" ]]; then # ZFS storage ZFS_POOL=$(cat /etc/pve/storage.cfg | grep -A5 "^zfspool: $STORAGE_NAME" | grep "pool " | awk '{print $2}') DEVICE_PATH="/dev/zvol/$ZFS_POOL/$DISK_NAME" echo "ZFS pool: $ZFS_POOL" elif [[ $STORAGE_TYPE == "lvmthin" ]] || [[ $STORAGE_TYPE == "lvm" ]]; then # LVM storage VG_NAME=$(cat /etc/pve/storage.cfg | grep -A5 "^lvmthin: $STORAGE_NAME\|^lvm: $STORAGE_NAME" | grep "vgname " | awk '{print $2}') DEVICE_PATH="/dev/$VG_NAME/$DISK_NAME" echo "LVM VG: $VG_NAME" elif [[ $STORAGE_TYPE == "dir" ]]; then # Directory storage DIR_PATH=$(cat /etc/pve/storage.cfg | grep -A5 "^dir: $STORAGE_NAME" | grep "path " | awk '{print $2}') DEVICE_PATH="$DIR_PATH/images/$VM_ID/$DISK_NAME" echo "Directory path: $DIR_PATH" else echo "❌ Unknown storage type: $STORAGE_TYPE" exit 1 fi echo "Device path: $DEVICE_PATH" if [ ! -e "$DEVICE_PATH" ]; then echo "❌ Error: Device $DEVICE_PATH not found!" if [[ $STORAGE_TYPE == "zfspool" ]]; then echo "Available ZFS volumes:" zfs list -t volume | grep vm-$VM_ID else echo "Available LVM volumes:" lvs | grep vm-$VM_ID fi exit 1 fi # Crea mount point MOUNT_POINT="/mnt/vm${VM_ID}_rescue" mkdir -p "$MOUNT_POINT" echo "πŸ“¦ Setting up loop device..." # Setup device mapper per il disco kpartx -av "$DEVICE_PATH" sleep 2 # Trova la partizione root (prova diverse possibilitΓ ) ROOT_PART="" # Per ZFS e LVM, usa kpartx if [[ $STORAGE_TYPE == "zfspool" ]] || [[ $STORAGE_TYPE == "lvmthin" ]] || [[ $STORAGE_TYPE == "lvm" ]]; then # Cerca i mapper devices creati da kpartx DISK_BASENAME=$(basename "$DEVICE_PATH" | sed 's/-/--/g') for PART in /dev/mapper/${DISK_BASENAME}p1 \ /dev/mapper/${DISK_BASENAME}p2 \ /dev/mapper/*vm-${VM_ID}*p1 \ /dev/mapper/*vm-${VM_ID}*p2 \ /dev/mapper/*vm--${VM_ID}*p1 \ /dev/mapper/*vm--${VM_ID}*p2; do if [ -e "$PART" ]; then echo "Testing partition: $PART" if mount -o ro "$PART" "$MOUNT_POINT" 2>/dev/null; then if [ -d "$MOUNT_POINT/root" ] && [ -d "$MOUNT_POINT/etc" ]; then ROOT_PART="$PART" umount "$MOUNT_POINT" break fi umount "$MOUNT_POINT" fi fi done fi if [ -z "$ROOT_PART" ]; then echo "❌ Could not find root partition!" echo "Available mapper devices:" ls -la /dev/mapper/ | grep vm-${VM_ID} kpartx -dv "$DEVICE_PATH" exit 1 fi echo "βœ“ Found root partition: $ROOT_PART" # Monta la partizione echo "πŸ“‚ Mounting filesystem..." mount "$ROOT_PART" "$MOUNT_POINT" echo "πŸ”§ Fixing access..." # Configura password echo "Setting root password..." echo "root:${ROOT_PASSWORD}" | chroot "$MOUNT_POINT" chpasswd 2>/dev/null || \ echo "root:${ROOT_PASSWORD}" > "$MOUNT_POINT/tmp/setpw.txt" # Crea directory SSH mkdir -p "$MOUNT_POINT/root/.ssh" # Aggiungi chiave SSH echo "Adding SSH key..." echo "$SSH_KEY" > "$MOUNT_POINT/root/.ssh/authorized_keys" # Permessi corretti chmod 700 "$MOUNT_POINT/root/.ssh" chmod 600 "$MOUNT_POINT/root/.ssh/authorized_keys" # Fix SSH config echo "Configuring SSH..." if [ -f "$MOUNT_POINT/etc/ssh/sshd_config" ]; then sed -i 's/#*PermitRootLogin.*/PermitRootLogin yes/' "$MOUNT_POINT/etc/ssh/sshd_config" sed -i 's/#*PubkeyAuthentication.*/PubkeyAuthentication yes/' "$MOUNT_POINT/etc/ssh/sshd_config" fi # Se c'era un file temporaneo per la password, crea uno script di startup if [ -f "$MOUNT_POINT/tmp/setpw.txt" ]; then cat > "$MOUNT_POINT/etc/rc.local" << 'EOFRC' #!/bin/bash if [ -f /tmp/setpw.txt ]; then cat /tmp/setpw.txt | chpasswd rm /tmp/setpw.txt fi exit 0 EOFRC chmod +x "$MOUNT_POINT/etc/rc.local" fi echo "βœ“ Configuration applied" # Sync e unmount sync sleep 2 echo "πŸ“€ Unmounting..." umount "$MOUNT_POINT" kpartx -dv "$DEVICE_PATH" rmdir "$MOUNT_POINT" echo "πŸš€ Starting VM..." qm start $VM_ID echo "" echo "βœ… Fix completed!" echo "" echo "Wait 30 seconds, then try:" echo " ssh root@192.168.1.$((200 + VM_ID - 200))" echo " or" echo " qm terminal $VM_ID" echo " Login: root" echo " Password: $ROOT_PASSWORD" echo "" echo "⚠️ Remember to change the password after first login!"