Linux: bezpieczne usuwanie rekurencyjne w skryptach

0

Pracuję nad automatycznymi skryptami działającymi na Linux-ie (Debian). Te skrypty są uruchamiane z harmonogramu i manipulują plikami w ich własnych katalogach.

Na końcu skryptów muszę usunąć pliki tymczasowe.

Obecnie mam coś takiego:

#check that some variables are not empty
if [[ -z $var1 || -z $var2 || -z $var3 ]]; then
  echo "Some var is empty"
  exit 1
fi
workingdir=$var1/$var2
#some checks on working directory
if [[ ! -d $workingdir ]]; then
  echo "Directory error"
  exit 1
fi
cd $workingdir
if [[ $(pwd) != $workingdir ]]; then
  echo "Change directory error"
  exit 1
fi
#...here goes the main part of the script
#and at the end, the "cleaning"
if [[ -d $workingdir/temp/$var3 ]]; then
  find $workingdir/temp/$var3 -delete;
fi

Czy masz jakiś pomysł, którego mógłbym użyć, aby zmniejszyć ryzyko usunięcia czegoś niewłaściwego?

Dziękuję Ci.

pozdrowienia

Lennelei
źródło
1
Pierwszą rzeczą: "double-quote $variables".
Kamil Maciorowski
Dziękuję za ten link. Od jakiegoś czasu szukam i nie jestem pewien, jak zacytować cudzysłów w cudzysłowiu w pętli for /? Czy powinienem używać podwójnych cudzysłowów tylko wokół zmiennej i pozostawić symbol wieloznaczny w ten sposób? for f in "$workingdir"*; do...
lennelei
Nie widzę takiej składni w pytaniu. Nie powinieneś zadawać nowych pytań w komentarzach. Cytowany *nie zostanie rozwinięty. Dlaczego nie spróbujesz echo "$workingdir"*, echo "$workingdir*", echo "$workingdir"/*a echo "$workingdir/*"i zobaczyć na własne oczy?
Kamil Maciorowski
Przepraszam za pytanie, otworzę nowy post.
lennelei

Odpowiedzi:

1

Twój skrypt wie, jakie pliki są tworzone i gdzie się znajdują.

To ogólne stwierdzenie jest tutaj ważnym punktem. Jeśli naprawdę chcesz usunąć tylko utworzone przez siebie pliki, śledź, które pliki tworzysz. Więc zwykle robiłbyś:

TMP1=$(mktemp -t example.1.XXXXXX)
TMP2=$(mktemp -t example.2.XXXXXX)

aby utworzyć pliki tymczasowe (zobacz man mktempszczegóły) i wykonaj

rm -f "$TMP1" "$TMP2"

kiedy skończysz z plikami tymczasowymi. Alternatywnie możesz utworzyć katalog tymczasowy i go usunąć.

Czego nie powinieneś robić

rm -f /tmp/example.?.*

ponieważ spowoduje to usunięcie plików tymczasowych również dla innych uruchomionych instancji skryptu.

Ljm Dullaart
źródło
W rzeczywistości jest to trochę bardziej skomplikowane: skrypt uruchamia zadanie Java, które używa zmiennych $ workingdir i $ var3 do przechowywania danych tymczasowych w folderze $ workingdir / temp / $ var3. Nie chcę usuwać tego folderu z zadania Java, ponieważ może być potrzebny (na przykład w przypadku awarii). Właśnie dlatego szukałem pomysłów na zabezpieczenie skryptu.
lennelei
Najważniejsze jest to, że musisz śledzić pliki tymczasowe tworzone przez skrypt (lub kod Java). Możesz zdecydować, które pliki usunąć, jeśli wiesz, jakie to pliki.
Ljm Dullaart