From a5ee241e159c9bfc01e47c0cec7f312b0c3997ad Mon Sep 17 00:00:00 2001 From: root Date: Wed, 18 Mar 2026 09:29:16 +0300 Subject: [PATCH] =?UTF-8?q?=D0=A3=D1=81=D1=82=D0=B0=D0=BD=D0=BE=D0=B2?= =?UTF-8?q?=D0=BA=D0=B0=20=D0=B8=D1=81=D0=BF=D0=BE=D0=BB=D0=BD=D0=B8=D0=BC?= =?UTF-8?q?=D0=BE=D0=B3=D0=BE=20=D1=84=D0=BB=D0=B0=D0=B3=D0=B0=20=D0=B4?= =?UTF-8?q?=D0=BB=D1=8F=20=D0=B4=D0=B8=D1=80=D0=B5=D0=BA=D1=82=D0=BE=D1=80?= =?UTF-8?q?=D0=B8=D0=B8=20=D1=80=D0=B0=D1=81=D1=88=D0=B0=D1=80=D0=B5=D0=BD?= =?UTF-8?q?=D0=BD=D0=BE=D0=B9=20=D0=B2=20=D0=92=D0=B8=D0=BD=D0=B4=D0=BE?= =?UTF-8?q?=D0=B2=D1=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scan_to_exe_and_set_x_flag.sh | 142 ++++++++++++++++++++++++++++++++++ 1 file changed, 142 insertions(+) create mode 100755 scan_to_exe_and_set_x_flag.sh diff --git a/scan_to_exe_and_set_x_flag.sh b/scan_to_exe_and_set_x_flag.sh new file mode 100755 index 0000000..6c42107 --- /dev/null +++ b/scan_to_exe_and_set_x_flag.sh @@ -0,0 +1,142 @@ +#!/usr/bin/env bash +# Совместим с TrueNAS CORE (FreeBSD) и SCALE (Linux) +# Безопасен при перенаправленном stdin + +# Проверка наличия терминала для интерактивного режима +if [[ -t 0 ]]; then + INTERACTIVE=1 +else + INTERACTIVE=0 + echo "Внимание: stdin не подключён к терминалу. Режим подтверждения отключён." + echo "Используйте флаг --force для автоматического выполнения." + if [[ "$*" != *"--force"* ]]; then + exit 1 + fi +fi + +# Цвета (только если вывод в терминал) +if [[ -t 1 ]]; then + RED='\033[0;31m'; GREEN='\033[0;32m'; YELLOW='\033[1;33m'; BLUE='\033[0;34m'; NC='\033[0m' +else + RED=''; GREEN=''; YELLOW=''; BLUE=''; NC='' +fi + +# Проверка аргумента +if [[ $# -lt 1 ]] || [[ "$1" == "--help" ]] || [[ "$1" == "-h" ]]; then + echo "Использование: $0 [--force] <путь_к_директории>" + echo " --force Пропустить подтверждение (для автоматизации)" + exit 1 +fi + +# Обработка флага --force +FORCE=0 +if [[ "$1" == "--force" ]]; then + FORCE=1 + shift +fi + +TARGET_DIR="$1" + +# Проверка директории +if [[ ! -d "$TARGET_DIR" ]]; then + echo -e "${RED}Ошибка:${NC} Директория не существует: $TARGET_DIR" >&2 + exit 1 +fi + +# Нормализация пути +TARGET_DIR="$(cd "$TARGET_DIR" 2>/dev/null && pwd || echo "$TARGET_DIR")" + +echo -e "${BLUE}========================================${NC}" +echo -e "${BLUE}Подготовка к обработке Windows-файлов${NC}" +echo -e "${BLUE}========================================${NC}" +echo "" +echo -e "Директория: ${YELLOW}${TARGET_DIR}${NC}" +echo -e "Расширения: ${YELLOW}.exe .bat .cmd .com${NC} (любой регистр)" +echo -e "Права: ${YELLOW}ug+x${NC} (владелец + группа)" +echo "" + +# Подсчёт файлов (безопасный метод для BSD) +FILE_COUNT=0 +while IFS= read -r -d '' file 2>/dev/null; do + ((FILE_COUNT++)) 2>/dev/null || FILE_COUNT=$((FILE_COUNT + 1)) +done < <(find "$TARGET_DIR" -type f \( -iname "*.exe" -o -iname "*.bat" -o -iname "*.cmd" -o -iname "*.com" \) -print0 2>/dev/null || true) + +echo -e "Найдено файлов: ${GREEN}${FILE_COUNT}${NC}" +echo "" + +if [[ $FILE_COUNT -eq 0 ]]; then + echo -e "${YELLOW}Не найдено подходящих файлов. Обработка не требуется.${NC}" + exit 0 +fi + +# Предпросмотр (только если интерактивно) +if [[ $INTERACTIVE -eq 1 ]]; then + echo -e "${BLUE}Примеры найденных файлов (первые 10):${NC}" + COUNT_PREVIEW=0 + while IFS= read -r -d '' file 2>/dev/null; do + echo " • $file" + COUNT_PREVIEW=$((COUNT_PREVIEW + 1)) + [[ $COUNT_PREVIEW -ge 10 ]] && break + done < <(find "$TARGET_DIR" -type f \( -iname "*.exe" -o -iname "*.bat" -o -iname "*.cmd" -o -iname "*.com" \) -print0 2>/dev/null || true) + + if [[ $FILE_COUNT -gt 10 ]]; then + echo " ... и ещё $((FILE_COUNT - 10)) файлов" + fi + echo "" +fi + +# Подтверждение (только если интерактивно и не --force) +if [[ $INTERACTIVE -eq 1 && $FORCE -eq 0 ]]; then + echo -e "${YELLOW}Внимание:${NC} Будут изменены права ${GREEN}ТОЛЬКО${NC} для владельца и группы (ug+x)" + echo -n "Продолжить? (y/n) [n]: " + read -r CONFIRM || CONFIRM="n" + + case "${CONFIRM,,}" in + y|yes|д|да) + echo -e "\n${GREEN}Подтверждено. Начинаем обработку...${NC}" + ;; + *) + echo -e "\n${YELLOW}Операция отменена.${NC}" + exit 0 + ;; + esac + echo "" +elif [[ $FORCE -eq 1 ]]; then + echo -e "${YELLOW}Режим --force: подтверждение пропущено.${NC}" + echo "" +fi + +# Обработка файлов +SUCCESS=0 +FAILED=0 +TOTAL=0 + +while IFS= read -r -d '' file 2>/dev/null; do + TOTAL=$((TOTAL + 1)) + if chmod ug+x "$file" 2>/dev/null; then + BASENAME="${file##*/}" + echo -e "[${GREEN}OK${NC}] $BASENAME" + SUCCESS=$((SUCCESS + 1)) + else + BASENAME="${file##*/}" + echo -e "[${RED}FAIL${NC}] $BASENAME (нет прав?)" + FAILED=$((FAILED + 1)) + fi +done < <(find "$TARGET_DIR" -type f \( -iname "*.exe" -o -iname "*.bat" -o -iname "*.cmd" -o -iname "*.com" \) -print0 2>/dev/null || true) + +# Итог +echo "" +echo -e "${BLUE}========================================${NC}" +echo -e "${BLUE}Итог обработки${NC}" +echo -e "${BLUE}========================================${NC}" +echo -e "Успешно: ${GREEN}${SUCCESS}${NC}" +echo -e "Ошибок: ${RED}${FAILED}${NC}" +echo -e "Всего: ${BLUE}${TOTAL}${NC}" +echo "" + +if [[ $FAILED -gt 0 ]]; then + echo -e "${YELLOW}Внимание:${NC} Некоторые файлы не обработаны (возможно, нет прав на запись)." + echo "Проверьте: mount -v | grep '${TARGET_DIR%/*}' — возможно, ФС смонтирована как read-only." +fi + +echo -e "${GREEN}Готово.${NC}"