Если вы запустили программу/скрипт с самого 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
(, оба, вероятно, не нужны)
Вы должны зациклить свой массив, тогда я бы предложил в 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
Просто используйте:
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 , и их лучше избегать везде, где это возможно (, хотя в данном конкретном случае это вряд ли будет проблемой ).
Я хотел бы расширить ответ @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}"