Bash для проверки существования каталога. Если не создавать с массивом

Если вы запустили программу/скрипт с самого USB-накопителя, вы должны быть в состоянии выяснить, какая карта/имя LUKS и устройство, на котором он находится (, или просто указать скрипту устройство или сопоставленное имя, если вы его знаете )и следите за тем, когда устройство «исчезает» при его удалении. Затем размонтируйте его.

Я почти уверен , что отсоединение USB приведет к исчезновению устройства (/dev/sdXn), но если это не так, вам придется наблюдать dmesgили смотреть в системном журнале, или найти его где-нибудь в /sys, возможно.

Вот доказательство -концептуального сценария bash -, который выглядит так, как будто он должен работать, но у меня нет разделов LUKS на USB-накопителе для тестирования,поэтому я не уверен, нужны ли umountтакие параметры, как --lazyили --force.

map=$( df --output=source $PWD |tail -n1 )

device=$( sudo cryptsetup status "$map" | grep -o "device:.*"|cut -d' ' -f 3 )

while [ -b "$device" ]
do
    sleep 30
done

echo "Device $device is missing, unmounting"
sudo umount -v "$map"

Если он запускается из смонтированного контейнера LUKS, $PWDдолжен найти имя LUKS, на которое он сопоставлен, а затем устройство, и если устройство перестанет быть блочным специальным файлом, размонтировать сопоставленное устройство.

PS Если устройство было смонтировано rw(доступно для записи)файловая система может быть повреждена внезапным его отключением. FAT кажется особенно уязвимой, в то время как журналируемая файловая система должна быть более надежной. Если он смонтирован ro (только для чтения -), по крайней мере, вы можете избежать этой проблемы, mount принимает -o roи cryptsetup принимает --readonly(, оба, вероятно, не нужны)

8
05.11.2019, 08:08
3 ответа

Вы должны зациклить свой массив, тогда я бы предложил в bash

array1=(
/apache
/apache/bin
/apache/conf
/apache/lib
/www
/www/html
/www/cgi-bin
/www/ftp
)
for dir in "${array1[@]}"; do
  [[ ! -d "$dir" ]] && mkdir "$dir"
done
11
27.01.2020, 20:08

Просто используйте:

mkdir -p -- "${array1[@]}"

Это также создаст промежуточные компоненты каталога, если это необходимо, поэтому ваш массив также может быть сокращен, чтобы включать только конечные каталоги:

array1=(
  /apache/bin
  /apache/conf
  /apache/lib
  /www/html
  /www/cgi-bin
  /www/ftp
)

Что вы могли бы также написать:

array1=(
  /apache/{bin,conf,lib}
  /www/{html,cgi-bin,ftp}
)

Подходы типа [[ -d... ]] || mkdir...обычно вводят условия гонки TOCTOU , и их лучше избегать везде, где это возможно (, хотя в данном конкретном случае это вряд ли будет проблемой ).

54
27.01.2020, 20:08

Я хотел бы расширить ответ @darxmurf.

Для тех, кто только изучает Linux или сценарии оболочки, я хочу отметить, что
mkdir /path1/path2/path3может делать не совсем то, что вам нужно.
Я бы предложил добавить в скрипт chown, chmodи sort.

Если /path1/path2не существует, mkdir /path1/path2/path3завершится ошибкой.
Это можно несколько исправить
mkdir -p /path1/path2/path3

В этом случае все 3 пути будут созданы с UID, GID и UMASK пользователя, выполнившего команду. Если UMASK пользователя равен 077, вы можете получить:
mkdir -m 777 -p /path1/path2/path3
тогда ваши каталоги будут выглядеть так:

drwx------ /path1
drwx------ /path2
drwxrwxrwx /path3

Это не то, что вам нужно.

При использовании sortв первую очередь будут упорядочены более короткие пути. Рассмотрим массив из:
/apache/bin/cache /apache /apache/bin
На самом деле, вы бы хотели, чтобы массив был:
/apache /apache/bin /apache/bin/cache

Мое первое предложенное изменение было бы:

array=(
/apache
/apache/bin
/apache/conf
/apache/lib
/www
/www/html
/www/cgi-bin
/www/ftp
)
array1=$( echo "${array[@]}" | tr ' ' '\n' | sort )

Это гарантирует, что каталоги более высокого уровня будут отображаться перед более низкими уровнями.

Следующее изменение, которое я хотел бы внести, это -mдля режима. Это обеспечит установку необходимых разрешений для каталога :
.mkdir -m ${mode} ${dir}

Установка владельца и группы (esp при работе от имени пользователя root ). Если вы являетесь членом группы A и группы B, команда mkdir назначит владельцем группы группу по умолчанию (— первую группу, отображаемую командой id). Таким образом :[[ ! -d "$dir" ]] && mkdir -m ${mode} "$dir" && chown ${user}:${group} "${dir}"

1
27.01.2020, 20:08

Теги

Похожие вопросы