Другой вариант — использовать скрипт /lib/cryptsetup/scripts/decrypt_derived
, который также является частью cryptsetup в Debian/Ubuntu.
Вместо кэширования ключа вы используете ключ тома одного диска в качестве дополнительного пароля для второго диска. Для этого требуется добавить второй пароль ко второму (и третьему и т. д. )зашифрованным дискам, но LUKS поддерживает это. Поэтому это решение также работает, если ваши несколько зашифрованных дисков не используют один и тот же пароль.
Пример добавления ключа из sda6crypt в sda5:
Добавить ключ тома sda6crypt в качестве дополнительного пароля для sda5:
mkfifo fifo
/lib/cryptsetup/scripts/decrypt_derived sda6crypt > fifo &
cryptsetup luksAddKey /dev/sda5 fifo
rm fifo
Настройте автоматическую разблокировку sda5crypt в/etc/crypttab
ls -la /dev/disk/by-uuid/ | grep sda5
echo "sda5crypt UUID= sda6crypt luks,initramfs,keyscript=/lib/cryptsetup/scripts/decrypt_derived" >> /etc/crypttab
При этом используется именованный канал(fifo
)для передачи ключа, чтобы не хранить ключ громкости во временном файле на диске.
Параметр keyscript
работает только в том случае, если crypttab
обрабатывается оригинальными инструментами cryptsetup Debian, повторная реализация systemd в настоящее время не поддерживает его. Если ваша система использует systemd (, то есть большинство систем ), вам нужна опция initramfs
, чтобы принудительно выполнить обработку в initrd с помощью инструментов cryptsetup до запуска systemd.
На основанииhttps://unix.stackexchange.com/a/32551/50793
Можно (в sed):
1
, где они существуют.s/^\(.*\)1$/\1/
s/.*/&1/
$!{…}
sed '$!{s/^\(.*\)1$/\1/;s/.*/&1/}' file
Или, ничего не захватив (без звездочек ), одно из двух:
sed '$!{s/1$//;s/$/1/}' file
sed '/1$/b;$!s/$/1/' file
Один из способов может быть
sed -e '
s/1$/&/;t
$!s/$/1/
' file
sed -e '
$q; /1$/!s/$/1/
' file
Или:
sed -e '$!{/1$/!s/$/1;}'
Или если нет пустых строк:
sed -e '$!s/[^1]$/&1/'
Другой вариант:
sed '$!s/1\{0,1\}$/1/'
(некоторые sed
реализации поддерживают не -стандарт \?
в качестве альтернативы\{0,1\}
).
Или его эквивалент расширенного регулярного выражения для тех sed
реализаций, которые поддерживают -E
(, которые скоро станут стандартными):
sed -E '$!s/1?$/1/'
То есть во всех строках, кроме(!
)последней ($
), замените один необязательный (\{0,1\}
/?
) завершающий($
)1
на 1
.
Использование любого awk в любой оболочке на каждом сервере Unix:
$ awk 'NR>1{print p 1} {sub(/1$/,""); p=$0} END{print p}' file
hello1
hello1
hell1
hel1
end