É possível criar um contêiner LUKS de forma não interativa, usando a entrada padrão como arquivo-chave: echo -n "mypassword" cryptsetup luksFormat --key-file - dev/sda2
Mas não é possível alterar a senha de forma não interativa e sem usar arquivos de chave porque:
-
cryptsetup
não aceita senhas na linha de comando; Só os aceita de arquivos e interativamente; Provavelmente, para evitar o vazamento da senha no histórico do seu shell. - Embora você possa usar a entrada padrão como um arquivo de chave, para adicionar ou alterar senhas, é necessário fornecer uma senha existente junto com a nova; São duas entradas e há apenas uma entrada padrão.
Opção 1 - Use pipes nomeados
Tecnicamente, isso requer um arquivo, mas o arquivo é um pipe nomeado, não um arquivo de chave:
mkpipe fifo
echo -n "oldpass" | cryptsetup luksAddKey --key-file - test.img fifo &
echo -m "newpass" > fifo
O primeiro comando cria o pipe nomeado, o segundo usa stdin para fornecer a senha original e lê a nova senha do pipe. Este segundo comando bloqueia, então o &
coloca em segundo plano. O terceiro comando grava a nova senha no pipe, o que permite que o cryptsetup seja desbloqueado e continue.
Opção 2 - usando a API cryptsetup
O Cryptsetup não é apenas um utilitário, mas também uma biblioteca (libcryptsetup). Você pode usar uma função como crypt_keyslot_add_by_passphrase () em seu próprio código para adicionar um Nova senha. Esta função específica aceita a senha existente e nova como char *
(uma string).