Estou tentando definir em massa algumas senhas de contas de usuário usando chpasswd
. As senhas devem ser geradas aleatoriamente e impressas para stdout
(preciso anotá-las ou colocá-las em um armazenamento de senhas) e também passadas para chpasswd
.
Ingenuamente, eu faria isso assim
{
echo student1:$(head /dev/urandom | tr -dc A-Za-z0-9 | head -c 13 ; echo '')
echo student2:$(head /dev/urandom | tr -dc A-Za-z0-9 | head -c 13 ; echo '')
} | tee >(chpasswd)
No entanto, eu me preocupo em passar a nova senha como um argumento de linha de comando para echo
, porque os argumentos geralmente são visíveis para outros usuários ps -aux
(embora eu nunca tenha visto nenhuma echo
linha aparecer em ps
).
Existe uma maneira alternativa de anexar um valor à minha senha retornada e, em seguida, passá-la para chpasswd
?
Seu código deve ser seguro, pois
echo
não aparecerá na tabela de processos, pois é um shell embutido.Aqui está uma solução alternativa:
Isso cria seus nomes e senhas
n
de alunos, deles, sem passar nenhuma senha em nenhuma linha de comando de nenhum comando.O
paste
utilitário cola vários arquivos como colunas e insere um delimitador entre eles. Aqui, usamos:
como delimitador e damos a ele dois "arquivos" (substituições de processo). O primeiro contém a saída de umseq
comando que cria 20 nomes de usuário de alunos e o segundo contém a saída de um pipeline que cria 20 strings aleatórias de comprimento 13.Se você tiver um arquivo com nomes de usuário já gerados:
Eles salvarão as senhas e nomes de usuário no arquivo
secret.txt
em vez de mostrar as senhas geradas no terminal.echo
é muito provável que esteja embutido no shell, então não apareceriaps
como um processo separado.Mas você não precisa usar a substituição de comando, você pode apenas ter a saída do pipeline diretamente para
chpasswd
:Se você quiser alterar várias senhas com uma execução de
chpasswd
, deve ser fácil repetir as partes essenciais. Ou transforme em uma função:Como um aparte: isso
head /dev/urandom
parece um pouco estranho, já queurandom
não é orientado a linhas. Ele pode ler quantidades excessivas de bytes dele, o que afetará a noção de entropia disponível do kernel, que por sua vez pode levar ao/dev/random
bloqueio. Pode ser mais limpo apenas ler uma quantidade fixa de dados e usar algo comobase64
converter os bytes aleatórios em caracteres imprimíveis (em vez de apenas jogar fora cerca de 3/4 dos bytes que você obtém).Algo assim lhe daria aprox. 16 caracteres e números:
(ou seja, 16 menos a quantidade de
+
e/
caracteres na saída debase64
. A chance de qualquer um deles é 1/32 por caractere, portanto, se eu acertar minha combinatória, isso dá cerca de 99% de chance de deixar pelo menos 14 caracteres e uma chance de 99,99% de deixar pelo menos 12.)