目的

在终端无法交互的情况下,通过 shell 脚本修改密码。

使用管道符

以下方法均在 root 用户下执行

方法一:

# echo 用户名:密码 | chpasswd

方法二:

# echo -e "密码\n密码" | passwd 用户名

方法二在 docker build 中会直接打印 \n,原因待探究。

USERMOD 命令

# usermod -p `openssl passwd -6 密码` 用户名

openssl passwd 参数:

-1:基于 MD5 的密码算法
-5:基于 SHA256 的密码算法
-6:基于 SHA512 的密码算法(推荐)
-salt:使用指定盐值,不指定则随机生成盐值

目前主流 Linux 发行版采用 yescrypt 加密,openssl 不支持此加密,详见 openssl issue 19340

添加用户的同时指定密码

# useradd -m -s /bin/bash -u 1000 -p `openssl passwd -6 密码` 用户名

useradd 参数:

-m:如果用户的主目录不存在,则创建它
-s:用户登录的 shell
-u:用户 uid
-p:加密后的密码

相关文件

/etc/shadow

共 9 个字段:

user:$1$AokRr$Fe2970fZE64eYgCIArCR7w3A0:19905:0:99999:7:::

1. 用户名
2. 加密密码
3. 上次密码修改时间,从 1970 年 1 月 1 日起计算,单位:天
4. 最小修改密码间隔的天数
5. 密码有效天数
6. 密码需要变更前的警告天数
7. 密码过期后的宽限天数
8. 账号失效时间,从 1970 年 1 月 1 日起计算,单位:天
9. 保留字段

可以使用 chage 命令,更改/查看密码的相关信息

字段 2 密码的格式如下,由 $ 分隔:

$1$Qtc6Dw1X$BgJqQSPrinLaJ9pTJ09lI1
[-][------][---------------------]
 |     |              |
 |     |              +-> 加密后的密码
 |     +----------------> salt
 +----------------------> $1:md5
                          $5:sha256
                          $6:sha512
                          $y:yescrypt

/etc/passwd

共 7 个字段:

mark:x:1001:1001:mark,,,:/home/mark:/bin/bash
[--][-][--] [--] [-----] [--------] [--------]
|    |   |    |     |         |        |
|    |   |    |     |         |        +-> 7. 登陆 shell
|    |   |    |     |         +----------> 6. 家目录
|    |   |    |     +--------------------> 5. GECOS,存储用户信息(姓名、电话等)
|    |   |    +--------------------------> 4. 组 id
|    |   +-------------------------------> 3. 用户 id
|    +-----------------------------------> 2. x 表示此用户设有密码,密码保存在 /etc/shadow
+----------------------------------------> 1. 用户名

/etc/group

共 4 个字段:

wheel:x:10:root,king
[---][-][-][-------]
  |   |  |     |
  |   |  |     +------> 4. 组中的用户,逗号分隔
  |   |  +------------> 3. 组 id
  |   +---------------> 2. 组密码,x 仅仅是密码标识,组密码保存在 /etc/gshadow
  +-------------------> 1. 组名