Estou tentando definir em massa algumas senhas de contas de usuário usando chpasswd
. As senhas devem ser geradas aleatoriamente e impressas 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, 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 ps
).
Existe uma maneira alternativa de acrescentar um valor à minha senha retornada e passá-la para chpasswd
?
echo
é um shell embutido. Não apareceria na tabela de processos.Respostas:
Seu código deve ser seguro, pois
echo
não será exibido na tabela de processos, pois é um shell interno.Aqui está uma solução alternativa:
Isso cria os nomes e as senhas
n
dos alunos , sem passar nenhuma senha em qualquer 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 atribuímos 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 seqüências aleatórias de comprimento 13.Se você possui um arquivo com nomes de usuário já gerados:
Isso salvará as senhas e nomes de usuários no arquivo, em
secret.txt
vez de mostrar as senhas geradas no terminal.fonte
echo
ouprintf
, porém o código é um pouco estranho para decifrarecho
ser um shell embutido. Na maioria das conchas, é verdade, mas não há absolutamente nenhum requisito.tee secret.txt > >(chpasswd)
etee secret.txt | chpasswd
? Este último parece muito mais comum, então eu estou querendo saber por que você escolheu para usar a substituição de processo em vez de um tubo simplestee
). Agora que você apontou, acho que vou realmente mudar (parece melhor). Obrigado.echo
provavelmente está embutido no shell, portanto, não apareceriaps
como um processo separado.Mas você não precisa usar a substituição de comando, basta obter a saída do pipeline diretamente para
chpasswd
:Se você deseja alterar várias senhas com apenas uma execução
chpasswd
, deve ser fácil repetir as partes essenciais. Ou transformá-lo em uma função:Como um aparte: isso
head /dev/urandom
parece um pouco estranho, poisurandom
não é orientado a linhas. Ele pode ler quantidades excessivas de bytes, o que afetará a noção de entropia disponível do kernel, o que, por sua vez, pode levar ao/dev/random
bloqueio. Pode ser mais fácil ler apenas 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 obtidos).Algo assim daria a você aprox. 16 caracteres e números:
(ou seja, 16 menos a quantidade de
+
e/
caracteres na saída debase64
. A chance de qualquer um é 1/32 por caractere; portanto, se eu acertar minhas combinações, isso dará uma chance de 99% de deixar pelo menos 14 caracteres e uma chance de 99,99% de deixar pelo menos 12.)fonte
printf
solução não faz o meu código original não: retornar várias linhas para vários nomes de usuário, mas eu aprecio os seus comentários onhead urandom
head -c 10 | base64
oleoduto ou o de Nilshead | tr
? É provável que 10 "linhas" de bytes aleatórios sejam centenas de bytes (dado que apenas 1 em 256 seriam novas linhas), embora em teoria possa ser exatamente 10 bytes, mas as chances disso são completamente desprezíveis. Da mesma forma, ao usarbase64
, se os bytes aleatórios forem exatamente justos\xff
, então a base64 será apenas uma sequência de barras, mas isso também é bastante improvável. Se você se importa, pode ler mais de 10 bytes, reduzir as chances disso e reduzir o comprimento da saída resultante./dev/urandom
, mas o risco não é de 0%.