手动为 /etc/shadow 生成密码

Lor*_*ein 136 linux password shadow

我需要手动编辑/etc/shadow以更改虚拟机映像内的 root 密码。

是否有命令行工具可以获取密码并/etc/shadow在标准输出上生成兼容的密码哈希?

Rah*_*til 160

您可以使用以下命令:

方法一(md5、sha256、sha512)

openssl passwd -6 -salt xyz  yourpass
Run Code Online (Sandbox Code Playgroud)

注意:传递-1将生成一个 MD5 密码,-5一个 SHA256 和-6SHA512(推荐)

方法二(md5、sha256、sha512)

mkpasswd --method=SHA-512 --stdin
Run Code Online (Sandbox Code Playgroud)

该选项--method接受md5sha-256并且sha-512

方法三(des、md5、sha256、sha512)

正如@tink 所建议的,我们可以使用以下chpasswd方法更新密码:

echo "username:password" | chpasswd 
Run Code Online (Sandbox Code Playgroud)

或者,您可以将加密的密码与chpasswd. 首先使用它生成它:

perl -e 'print crypt("YourPasswd", "salt", "sha512"),"\n"'
Run Code Online (Sandbox Code Playgroud)

然后你可以使用生成的密码来更新/etc/shadow

echo "username:encryptedPassWd" | chpasswd -e
Run Code Online (Sandbox Code Playgroud)

我们还可以使用加密的密码来使用此密码创建新用户,例如:

useradd -p 'encryptedPassWd'  username
Run Code Online (Sandbox Code Playgroud)

  • 上面的方法 1) 和 2) 使用 MD5 进行散列。MD5 不再被视为最佳实践,因为存在哈希冲突。使用方法 3) 或 http://unix.stackexchange.com/a/198906/10911 中描述的方法。 (10认同)
  • 请注意,这些 make 最终会出现在您的 shell 历史记录中。我会使用 `openssl passwd -1`,它 1) 不会在那里结束,并且 2) 为您生成一个随机盐(也不会在 shell 历史记录中结束)。 (8认同)
  • 使用 `chpasswd -e` 时,请确保在你输入的字符串上使用单引号;否则,如果有 `$` 或其他特殊字符,它们将不会按字面意思处理。 (6认同)
  • 对于 SHA-512 哈希:`python3 -c 'import crypt; 打印(crypt.crypt(“test”,crypt.mksalt(crypt.METHOD_SHA512)))'` - [来自相关的ServerFault问题](http://serverfault.com/a/330072/286178) (4认同)
  • [`openssl passwd` 文档](https://www.openssl.org/docs/manmaster/apps/passwd.html) 适合任何试图弄清楚 `-1` 选项的作用的人。 (2认同)

use*_*018 38

在 Ubuntu 12.04 上,有 mkpasswd(来自 whois 包):功能过多的前端到 crypt(3)

mkpasswd  -m sha-512 -S saltsalt -s <<< YourPass
Run Code Online (Sandbox Code Playgroud)

在哪里:

  • -m= 使用 TYPE 方法计算密码。如果 TYPE 有帮助,则打印可用的方法。
  • -S = 使用盐。

例如

$ mkpasswd -m help

-s = Read password from stdin
Run Code Online (Sandbox Code Playgroud)

  • 无需指定盐,mkpasswd 负责生成随机盐。 (13认同)
  • @CMCDragonkai:错误的问题。您需要询问您的系统期望什么。 (3认同)

u15*_*825 19

该解决方案具有以下优点:

  • 无需额外安装
  • 不将密码存储在您的 shell 历史记录中
  • 为您生成随机盐
  • 使用现代的强散列算法 SHA-512
  • 重新提示输入密码,以免出错。

    $ 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.')"
    
    Run Code Online (Sandbox Code Playgroud)

参考


Gre*_*reg 5

对于那些没有基于 Debian 的系统的人。Python3 也能正常工作。

python3 -c 'import crypt, getpass; print(crypt.crypt(getpass.getpass()))'
Run Code Online (Sandbox Code Playgroud)

getpass.getpass()将在命令行上提示您输入密码。

  • @MichałF 看来这不起作用,因为盐腌没有正确完成。感谢您指出了这一点。我已经删除了盐,因为[加盐取决于操作系统](https://superuser.com/questions/822079/etc-shadow-in-old-format-where-is-salt-stored)并且它不实用在我的回答中考虑所有操作系统范围。您应该使用 @RahulPatil 概述的方法 1,因为它允许您使用加盐,并且“openssl”是一个非常通用的工具。 (2认同)

Ger*_*erg 5

当前的方法都不是我可以接受的 - 它们要么在命令行上传递密码(最终会出现在我的 shell 历史记录中),要么需要安装其他实用程序(python3makepasswd),要么使用硬编码盐,要么使用旧的哈希技术。

此方法将在提示输入密码后生成 SHA-512 哈希值,并使用随机盐。

一种使用Python 2而不使用任何非标准库的方法:

python2 -c 'import crypt, getpass,os,base64; print crypt.crypt(getpass.getpass(), "$6$"+base64.b64encode(os.urandom(16))+"$")'
Run Code Online (Sandbox Code Playgroud)

要在没有提示的情况下执行此操作:(这会将您的密码保留在命令历史记录中)

python2 -c 'import crypt, os,base64; print crypt.crypt("MyPassword", "$6$"+base64.b64encode(os.urandom(16))+"$")'
Run Code Online (Sandbox Code Playgroud)

  • 为了避免将密码留在命令历史记录中,您可以将环境变量 HISTCONTROL 设置(至少对于 bash)为“ignorespace”,然后在命令前面添加一个前导空格。 (3认同)