186 lines
5.2 KiB
Bash
Executable File
186 lines
5.2 KiB
Bash
Executable File
#!/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!"
|