Preciso editar manualmente /etc/shadow
para alterar a senha raiz dentro de uma imagem de máquina virtual.
Existe uma ferramenta de linha de comando que pega uma senha e gera um /etc/shadow
hash de senha compatível na saída padrão?
Preciso editar manualmente /etc/shadow
para alterar a senha raiz dentro de uma imagem de máquina virtual.
Existe uma ferramenta de linha de comando que pega uma senha e gera um /etc/shadow
hash de senha compatível na saída padrão?
Respostas:
Você pode usar os seguintes comandos para o mesmo:
openssl passwd -6 -salt xyz yourpass
Nota: a passagem -1
gerará uma senha MD5, -5
um SHA256 e -6
SHA512 (recomendado)
mkpasswd --method=SHA-512 --stdin
Métodos aceita md5
, sha-256
esha-512
Como o @tink sugeriu, podemos atualizar a senha chpasswd
usando:
echo "username:password" | chpasswd
Ou você pode usar a senha criptografada com chpasswd
. Primeiro, gere-o usando o seguinte:
perl -e 'print crypt("YourPasswd", "salt", "sha512"),"\n"'
Depois, você pode usar a senha gerada para atualizar:
echo "username:encryptedPassWd" | chpasswd -e
Essa senha criptografada que podemos usar para criar um novo usuário com senha, por exemplo:
useradd -p 'encryptedPassWd' username
openssl passwd -1
qual 1) não acaba lá e 2) gera um sal aleatório para você (o que também não acaba no histórico do shell).
openssl passwd
documentação para quem tenta descobrir o que a -1
opção faz.
python3 -c 'import crypt; print(crypt.crypt("test", crypt.mksalt(crypt.METHOD_SHA512)))'
- da pergunta relacionada ao ServerFault
No Ubuntu 12.04, existe o mkpasswd (do pacote whois): Overfeatured front end to crypt (3)
mkpasswd -m sha-512 -S saltsalt -s <<< YourPass
Onde:
-m
= Calcule a senha usando o método TYPE. Se TYPE for help, os métodos disponíveis serão impressos.-S
= sal usado.Por exemplo
$ mkpasswd -m help
-s = Read password from stdin
Esta solução tem os seguintes benefícios:
Solicita novamente a senha para evitar erros.
$ python3 -c "from getpass import getpass; from crypt import *; \
p=getpass(); print('\n'+crypt(p, METHOD_SHA512)) \
if p==getpass('Please repeat: ') else print('\nFailed repeating.')"
Para aqueles sem sistemas baseados no Debian. Python3 funciona tão bem.
python3 -c 'import crypt; print(crypt.crypt("test"))'
NOTA: A string "test" é a senha que estamos gerando como uma string criptografada.
crypt.mksalt
não funciona ao gerar senhas para /etc/shadow
. Mas o método do @ Alex131089 funciona!
openssl
é uma ferramenta bastante universal.
Nenhum dos métodos atuais é aceitável para mim - eles passam a senha na linha de comando (que termina no histórico do meu shell), exigem a instalação de utilitários adicionais ( python3
, makepasswd
), usam sais codificados ou usam técnicas antigas de hash.
Esse método geraria hashes SHA-512 após solicitar a senha e usaria um sal aleatório.
Um método que utiliza o Python 2 sem nenhuma biblioteca não padrão:
python2 -c 'import crypt, getpass,os,base64; print crypt.crypt(getpass.getpass(), "$6$"+base64.b64encode(os.urandom(16))+"$")'
Para fazer isso sem aviso: (Isso deixará sua senha no histórico de comandos)
python2 -c 'import crypt, os,base64; print crypt.crypt("MyPassword", "$6$"+base64.b64encode(os.urandom(16))+"$")'
ps
saída na fração de segundo que o comando está executando. (O mais seguro continua a usar a versão que solicita a senha)
O par openssl
e chpasswd -e
não funcionou no meu caso no RHEL6. A combinação openssl passwd
e o usermod -p
comando fizeram o trabalho.
Gere o valor de hash da senha junto com o valor de salt:
$ openssl passwd -1 -salt 5RPVAd clear-text-passwd43
$1$5RPVAd$vgsoSANybLDepv2ETcUH7.
Em seguida, copie a sequência criptografada para usermod. Certifique-se de envolvê-lo com aspas simples.
$ usermod -p '$1$5RPVAd$vgsoSANybLDepv2ETcUH7.' root
Confira no arquivo de sombra.
$ grep root /etc/shadow
root:$1$5RPVAd$vgsoSANybLDepv2ETcUH7.:17774:0:99999:7:::
Ainda outro método para gerar senhas, está usando a openssl
ferramenta.
Gere senhas MD5
openssl passwd -1 -salt SaltSalt SecretPassword
# output: $1$SaltSalt$FSYmvnuDuSP883uWgYBXW/
Gere senhas DES
openssl passwd -crypt -salt XR SuprScrt
# output: XR1dOp2EVMph2
Expandindo um pouco as críticas de u150825 e Gert van den Berg, me vi precisando de algo relativamente flexível para diferentes situações com diferentes sistemas de automação. Decidi adicionar à minha pequena biblioteca de scripts úteis e escrever isso. Ele usa apenas bibliotecas nativas do python 2.7+ e funciona no python3 também.
Você pode buscá-lo aqui, se quiser. É fácil deixar isso para o seu ambiente se você precisar usá-lo muito, hospedado em http ou qualquer outra coisa, e você pode executá-lo em qualquer plataforma usando qualquer interpretador python padrão que você tenha disponível. confiando de forma confiável.
O padrão é solicitar o uso do getpass com prompts no stderr (permitindo a captura fácil do stdout), mas se você colocar uma string nele, ela simplesmente colherá do stdin. Dependendo de como você está lidando com isso, também pode não estar aparecendo no histórico de comandos; portanto, esteja ciente do que você está trabalhando. Eu gosto de ter uma ferramenta flexível que se comporte da maneira esperada, em vez de ter que confiar em pacotes ou em python, alinhando meu caminho para a vitória de 10 maneiras diferentes.
chpasswd
?
chpasswd -e
, certifique-se de usar aspas simples na stringecho
em que você está ; caso contrário, se houver$
ou outros caracteres especiais, eles não serão tratados literalmente.