我需要手动编辑/etc/shadow
以更改虚拟机映像内的root密码。
是否有一个命令行工具可以获取密码并/etc/shadow
在标准输出上生成兼容的密码哈希?
我需要手动编辑/etc/shadow
以更改虚拟机映像内的root密码。
是否有一个命令行工具可以获取密码并/etc/shadow
在标准输出上生成兼容的密码哈希?
Answers:
您可以使用以下命令来实现相同的目的:
openssl passwd -6 -salt xyz yourpass
注意:传递-1
将生成MD5密码,-5
SHA256和-6
SHA512(推荐)
mkpasswd --method=SHA-512 --stdin
方法接受md5
,sha-256
和sha-512
如@tink所建议,我们可以使用chpasswd
来更新密码:
echo "username:password" | chpasswd
或者,您可以通过使用加密的密码chpasswd
。首先使用以下命令生成它:
perl -e 'print crypt("YourPasswd", "salt", "sha512"),"\n"'
然后,您可以使用生成的密码进行更新:
echo "username:encryptedPassWd" | chpasswd -e
我们可以使用此加密密码来创建一个具有密码的新用户,例如:
useradd -p 'encryptedPassWd' username
openssl passwd -1
方法:1)并没有结束,2)为您生成了随机盐(这也没有出现在shell历史中)。
python3 -c 'import crypt; print(crypt.crypt("test", crypt.mksalt(crypt.METHOD_SHA512)))'
- 来自相关的ServerFault问题
在Ubuntu 12.04上,有mkpasswd(来自whois软件包):过度功能化的前端到crypt(3)
mkpasswd -m sha-512 -S saltsalt -s <<< YourPass
哪里:
-m
=使用TYPE方法计算密码。如果TYPE是帮助,则将打印可用的方法。-S
=用盐。例如
$ mkpasswd -m help
-s = Read password from stdin
该解决方案具有以下优点:
重新提示输入密码,以免出错。
$ 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.')"
对于那些没有基于Debian的系统的人。Python3也可以正常工作。
python3 -c 'import crypt; print(crypt.crypt("test"))'
注意:字符串“ test”是我们作为加密字符串生成的密码。
crypt.mksalt
在为生成密码时,使用不起作用/etc/shadow
。但是@ Alex131089的方法有效!
openssl
是一个非常通用的工具。
目前方法都不是我接受-他们要么通过在命令行上的密码(这在我的壳的历史结束了),需要额外的工具(安装python3
,makepasswd
),使用硬编码盐或使用旧的散列技术。
提示输入密码后,此方法将生成SHA-512哈希,并使用随机盐。
没有任何非标准库的利用Python 2的方法:
python2 -c 'import crypt, getpass,os,base64; print crypt.crypt(getpass.getpass(), "$6$"+base64.b64encode(os.urandom(16))+"$")'
要在没有提示的情况下执行此操作:(这会将您的密码保留在命令历史记录中)
python2 -c 'import crypt, os,base64; print crypt.crypt("MyPassword", "$6$"+base64.b64encode(os.urandom(16))+"$")'
ps
命令运行的一秒钟内显示在输出中。(最安全的方法是使用提示输入密码的版本)
在我的情况下,RHEL6中的openssl
and chpasswd -e
对不起作用。结合openssl passwd
和usermod -p
指挥完成了这项工作。
生成密码的哈希值以及盐值:
$ openssl passwd -1 -salt 5RPVAd clear-text-passwd43
$1$5RPVAd$vgsoSANybLDepv2ETcUH7.
然后,将加密的字符串复制到usermod。确保用单引号引起来。
$ usermod -p '$1$5RPVAd$vgsoSANybLDepv2ETcUH7.' root
在影子文件中签出。
$ grep root /etc/shadow
root:$1$5RPVAd$vgsoSANybLDepv2ETcUH7.:17774:0:99999:7:::
生成密码的另一种方法是使用该openssl
工具。
生成MD5密码
openssl passwd -1 -salt SaltSalt SecretPassword
# output: $1$SaltSalt$FSYmvnuDuSP883uWgYBXW/
生成DES密码
openssl passwd -crypt -salt XR SuprScrt
# output: XR1dOp2EVMph2
扩展了对u150825和Gert van den Berg的批评,我发现自己需要一些相对灵活的东西,以适应具有不同自动化系统的不同情况。我决定将自己的有用脚本添加到自己的小程序库中,并将其编写。它仅使用来自python 2.7+的本机库,并且同样适用于python3。
如果愿意,可以在这里领取。如果您需要大量使用它,将其托管在http上,也可以轻松地将其放置在您的环境中,并且可以使用任何可用的默认python解释器在任何平台上运行它,可靠地依靠它工作。
它默认为在stderr上使用带有提示的getpass提示(允许轻松捕获stdout),但是如果您将字符串传递给它,它将仅从stdin中获得。根据您的操作方式,它也可能不会出现在命令历史记录中,因此只需了解您正在使用的内容即可。我喜欢拥有一种能够以预期方式运行的灵活工具,而不必依靠软件包或python来完成10种不同方式的胜利。
chpasswd
?
chpasswd -e
,请确保在您echo
输入的字符串上使用单引号。否则,如果有$
或其他特殊字符,则不会按字面意义对待它们。