Конкатенация жестко закодированного каталога и созданного пользователем текстового файла добавляет пути корневого уровня, когда это не должно - PullRequest
0 голосов
/ 28 октября 2019

Я написал скрипт, разрешающий ограниченный доступ пользователей к удалению файлов на рабочем веб-сервере. Тем не менее, чтобы избежать проблем с жирным шрифтом, приводящих к случайному удалению / проблемам с файловой системой, я жестко закодировал базовый каталог в переменной ... Но конечный результат заключается в неправильном создании нужного пути из жестко закодированного каталога + пользовательских путей, если ониесть * подстановочный знак ...

У меня есть сервер Apache 2.4.6, который кэширует веб-контент для пользователя. У них есть пользователь джейлкита для SSH в эту коробку. Поскольку это производственный процесс, они сильно ограничены в доступе, однако я хотел бы дать им возможность очищать определенные каталоги кеша на их собственных условиях. Чтобы не допустить, чтобы это пошло не так, я жестко закодировал каталог основного кэша в переменную скрипта, так что, несмотря ни на что, скрипт будет работать только по этому пути.

Пока что этот скриптхорошо работает для итерации по своим желаемым путям очистки кэша ... Пользователь создает файл .txt с / cachePath, определенным в каждой строке, и скрипт будет проходить по нему и удалять эти пути. Это прекрасно работает для / path и / content / path2 / ... Но я не могу на всю жизнь заставить его работать с подстановочными знаками (т.е. / path / , / content / path2 / ). Вероятно, есть более сексуальный способ справиться с этим, чем то, что я делал до сих пор (в настоящее время есть оператор if | else для обработки * или / *, не включенный в приведенный ниже скрипт), но я получаю всевозможные нежелательные результаты, пытаясь обработать его. * * / 1009 *, введенный пользователем * или * по произвольному путижелаемого выхода пока нет. Например, если paths.txt содержит только «*», результатом будет захват всех каталогов в / и добавление их в «cacheDir»?

/mnt/var/www/html/testing/backup
/mnt/var/www/html/testing/bin
/mnt/var/www/html/testing/boot
/mnt/var/www/html/testing/data
/mnt/var/www/html/testing/dev
/mnt/var/www/html/testing/etc
/mnt/var/www/html/testing/home
/mnt/var/www/html/testing/lib
/mnt/var/www/html/testing/lib64
...

Если paths.txt равен «./*», он добавляетфайлы из местоположения самого скрипта:

/mnt/var/www/html/testing./cacheClear.sh
/mnt/var/www/html/testing./paths.txt

В конечном итоге я ищу следующее: if / mnt / var / www / html содержит следующие каталоги:

/content/
/content/path/
/content/path/file1.txt
/content/path/file2.txt
/content/path/subdir/
/path2/
/path2/fileA.txt
/path2/fileB.txt

Затем файл, содержащий /content/path/*, должен удалить /content/path/file1.txt, file2.txt и / subdir / и сохранить каталог / content / path /.

Если paths.txtфайл содержит

/content/path
/path2/*

Тогда каталог / content / path и подфайлы / каталоги должны быть удалены, и файлы в каталоге / path2 / также будут удалены ... Но сейчас скрипт не видитобъединено $cacheDir + $paths как реальное / ожидаемое местоположение, если оно содержит * где-либо в нем. Работает нормально без * символов.

Ответы [ 2 ]

0 голосов
/ 01 ноября 2019

Получил версию, которая работает достаточно хорошо для моих целей:

#!/bin/bash
file="/usr/jail/paths.txt"
pathToDelete=$(cat $file)
cacheDir="/mnt/var/www/html"

if [ -f $file ]; then
        if [ "$pathToDelete" == "*" ] || [ "$pathToDelete" == "/*" ]; then
                echo "Full Clear"
                rm -rfv /mnt/var/www/html/*
        else
                echo "Deleting the following cache directories:"
                for i in ${pathToDelete};
                do
                        echo ${cacheDir}${i}
                        rm -rfv ${cacheDir}${i}
                done
                echo "Cache cleared successfully"
        fi
fi
0 голосов
/ 28 октября 2019

Следующий код является рабочим решением:

#!/bin/bash -x
file="/usr/jail/paths.txt"
pathToDelete="$(sed 's/^\///' $file)"
cacheDir="/mnt/var/www/html"
if [ -f $file ];then
  echo "Deleting the following cache directories:"
    for paths in "$pathToDelete"
    do
      echo $cacheDir/$paths
      rm -rfv $cacheDir/$paths
    done
    echo "Cache cleared successfully"
else
  echo "Nothing to do"
fi
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...