在 Ubuntu 14.04.2 LTS 上执行以下命令:
adduser fu
然后输入密码bar
并按下Enter所有其他问题,创建一个允许我登录并具有以下特征的用户/etc/passwd
:
fu:x:1002:1002:,,,:/home/fu:/bin/bash
但是,这样做:
useradd fu --password bar --groups adm,cdrom,sudo,dip,plugdev,lpadmin --shell /bin/bash --create-home
創造/etc/passwd
fu:x:1002:1002::/home/fu:/bin/bash
和不允许我登录并且添加--user-group
也无济于事......
正如我所需要的useradd
(用于 Docker 脚本)我该怎么办?
PS 我已经看过/usr/sbin/adduser
了,但是我perl
不清楚要添加哪些参数才能adduser
具有相同的功能useradd
答案1
问题#1:
用户输入中的逗号/etc/passwd
只是用户信息的字段分隔符,例如“全名”,“房间号”,“工作电话”和“家庭电话”,因此我猜省略它们与空白字段相同;
问题 #2:
[...] -p,- 密码密码 返回的加密密码墓穴(3)默认为 禁用密码。 笔记:不建议使用此选项,因为密码(或 列出进程的用户将可以看到加密密码。 您应该确保密码符合系统密码 政策。 [...]
这意味着所期望的密码useradd
是一个已经加密的密码(从我通过的测试判断SHA-512
):实际上,作为选项的参数传递的字符串-p
在中以纯文本形式写入/etc/shadow
,并且登录后从这里读取的密码应该是加密的。
因此,最直接的解决方案是使用passwd
以下命令设置密码:
echo -e 'bar\nbar' | passwd fu
如果你不能使用passwd
,那么子 shell 中的这个 python 命令作为-p
选项的参数应该执行以下操作:
python -c 'import crypt; print crypt.crypt("bar", "$6$'$(< /dev/urandom tr -dc 'a-zA-Z0-9' | head -c 32)'")'
指令分解:
python -c 'import crypt; print crypt.crypt("<string>", "$<encryption_type>$<encryption_salt>")'
*<string> = 要加密的字符串;<encryption_type> = 加密类型;<encryption_salt> = 加密盐
Crypts<string>
使用<encryption type>
和<encryption_salt>
使用crypt()
库调用
在这种情况下:
<string>
=bar
,要加密的密码<encryption_type>
=6
,SHA-512
<encryption_salt>
=< /dev/urandom tr -dc 'a-zA-Z0-9' | head -c 32
,随机 32 个字符串
答案2
这可能不起作用,因为您的密码bar
未加密。手册页指出useradd
:
The encrypted password, as returned by crypt(3).
这Stack Overflow 上的问题有一些答案可能会对您的脚本有所帮助,因为问题询问有关添加用户和密码。
由于根据用户评论,该问题的已接受答案没有更新,因此我将在此重现解决方案:
echo -e "bar\nbar\n" | passwd fu
该命令将把用户的密码更改fu
为bar
。当然,需要使用 useradd 创建用户。
另一个解决方案是使用chpasswd
,正如第二高投票率的答案所建议的那样:
echo fu:bar | chpasswd
我已经测试了这两种解决方案,并且它们都有效。
已编辑删除adduser
信息并指出链接问题中的哪些建议确实有效。