• Глобальные настройки:

SQSH_DIR — где искать *.sqsh
MOUNT_POINT — куда монтировать

  • Алгоритм:

1. Размонтировать MOUNT_POINT через sudo umount.
Если занято — показать процессы (lsof) и выйти.
2. Собрать все *.sqsh из SQSH_DIR.
Нет файлов — выйти.
3. Меню: имена файлов + «Exit».
Стрелки + Enter.
4. Монтировать: sudo mount -t squashfs <файл> <точка>
Успех — выйти сразу.
Ошибка — вернуться в меню.

Простой, гибкий, безопасный. Требует sudo и lsof/fuser.

-----------------

#!/bin/bash

Global variables

SQSH_DIR="/dat/sqsh" # Directory containing *.sqsh files
MOUNT_POINT="/mnt/sqsh" # Mount point for squashfs files

Function to unmount the mount point unconditionally

unmount_point() {
echo "Trying to unmount $MOUNT_POINT..."
sudo umount "$MOUNT_POINT" 2>/dev/null

Check if still mounted

if mountpoint -q "$MOUNT_POINT"; then
echo "Unmount failed. Checking if occupied..."
occupied=$(lsof "$MOUNT_POINT" 2>/dev/null)
if [ -n "$occupied" ]; then
echo "Error: $MOUNT_POINT is occupied by processes:"
echo "$occupied"
echo "Please close any open files or processes and try again."
exit 1
else
echo "Error: Failed to unmount $MOUNT_POINT for unknown reason."
exit 1
fi
fi
echo "$MOUNT_POINT is now unmounted and free."
}

Get list of .sqsh files

get_sqsh_files() {
sqsh_files=($(ls -1 "$SQSH_DIR"/*.sqsh 2>/dev/null))
if [ ${#sqsh_files[@]} -eq 0 ]; then
echo "No *.sqsh files found in $SQSH_DIR. Exiting."
exit 1
fi
}

Array of menu items (will be populated dynamically) and commands

menu_items=()
commands=()

Populate menu with .sqsh files and Exit

populate_menu() {
for file in "${sqsh_files[@]}"; do
basename=$(basename "$file")
menu_items+=("$basename")
commands+=("sudo mount -t squashfs $file $MOUNT_POINT")
done
menu_items+=("Exit")
commands+=("exit 0")
}

Current selected item

current=0

Function to display the menu

display_menu() {
clear
echo "=== SquashFS Mount Menu ==="
for i in "${!menu_items[@]}"; do
if [ $i -eq $current ]; then
echo "> ${menu_items[$i]}"
else
echo " ${menu_items[$i]}"
fi
done
echo "=========================="
echo "Use arrow keys to navigate, Enter to select, Ctrl+C to quit"
}

Function to handle key input

read_arrow() {
read -s -n 1 key
if [[ $key == $'\x1b' ]]; then
read -s -n 2 key
case $key in
'[A') # Up arrow
((current--))
if [ $current -lt 0 ]; then
current=$((${#menu_items[@]} - 1))
fi
;;
'[B') # Down arrow
((current++))
if [ $current -ge ${#menu_items[@]} ]; then
current=0
fi
;;
esac
elif [[ $key == "" ]]; then # Enter key
execute_command
fi
}

Function to execute the selected command

execute_command() {
clear
echo "Executing: ${menu_items[$current]}"
echo "-----------------------------"
if [ "${commands[$current]}" == "exit 0" ]; then
exit 0
fi
eval "${commands[$current]}"
if [ $? -ne 0 ]; then
echo "Error: Command failed! Check permissions or file."
echo "-----------------------------"
echo "Press any key to return to menu..."
read -s -n 1
else
echo "Success: Mounted successfully."
echo "-----------------------------"
exit 0 # Exit immediately after successful mount
fi
}

Main logic

unmount_point
get_sqsh_files
populate_menu

Main loop

while true; do
display_menu
read_arrow
done

[file-name 000274_2025-10-27_15-17-58.txt]