Как найти определенный символ/строку в конце каждой строки файла и добавить этот символ, если он отсутствует, за исключением последней строки?

Другой вариант — использовать скрипт /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

0
01.10.2020, 06:40
4 ответа

Можно (в sed):

  1. Удалите все 1, где они существуют.s/^\(.*\)1$/\1/
  2. Затем добавьте его обратно для всех строк.s/.*/&1/
  3. Но только для строк, которые не являются последними$!{…}
sed '$!{s/^\(.*\)1$/\1/;s/.*/&1/}' file

Или, ничего не захватив (без звездочек ), одно из двух:

sed '$!{s/1$//;s/$/1/}' file
sed '/1$/b;$!s/$/1/' file
0
18.03.2021, 23:01

Один из способов может быть

 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/' 
2
18.03.2021, 23:01

Другой вариант:

sed '$!s/1\{0,1\}$/1/'

(некоторые sedреализации поддерживают не -стандарт \?в качестве альтернативы\{0,1\}).

Или его эквивалент расширенного регулярного выражения для тех sedреализаций, которые поддерживают -E(, которые скоро станут стандартными):

sed -E '$!s/1?$/1/'

То есть во всех строках, кроме(!)последней ($), замените один необязательный (\{0,1\}/?) завершающий($)1на 1.

2
18.03.2021, 23:01

Использование любого awk в любой оболочке на каждом сервере Unix:

$ awk 'NR>1{print p 1} {sub(/1$/,""); p=$0} END{print p}' file
hello1
hello1
hell1
hel1
end
2
18.03.2021, 23:01

Теги

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