/etc/shadow
文件存储了用户的加密密码和其他账户相关信息。与 /etc/passwd
不同,/etc/shadow
只有超级用户才能访问,且文件中的密码是经过加密处理的。编辑 /etc/shadow
文件时,需要了解其内容格式,以免破坏系统的认证机制。
/etc/shadow
文件格式
每行对应一个用户账户,字段用冒号(:
)分隔。通常包含以下内容:
username:password:last_change:min_days:max_days:warn_days:inactive_days:expire_date:reserved
各字段含义如下:
-
username
:- 用户名,与
/etc/passwd
中的用户名相对应。
- 用户名,与
-
password
:- 用户的加密密码。这个字段可以包含以下几种内容:
- 加密后的密码字符串。
!
或*
表示该账户被锁定,无法登录。- 空字符串表示不需要密码即可登录(不建议这样做)。
通常,这里的密码是通过哈希函数加密后的值。常见的加密算法有
MD5
、SHA-256
、SHA-512
,并且在密码前面会有相应的标识符来表示使用的加密方法。例如:
$1$
:表示使用 MD5 加密。$5$
:表示使用 SHA-256 加密。$6$
:表示使用 SHA-512 加密。
- 用户的加密密码。这个字段可以包含以下几种内容:
-
last_change
:- 从1970年1月1日起至上次密码修改之间的天数。
-
min_days
:- 两次密码修改之间的最小天数。如果设为
0
,则没有限制。
- 两次密码修改之间的最小天数。如果设为
-
max_days
:- 密码的最大有效天数。超过这个天数,用户将被要求更改密码。
-
warn_days
:- 密码过期前,系统向用户发出密码过期警告的天数。
-
inactive_days
:- 密码过期后,账户失效前的非活动天数。超过此天数,账户将被锁定。
-
expire_date
:- 账户过期日期,表示自1970年1月1日以来的天数。过期后,用户无法登录。设为
-1
或空表示账户不会过期。
- 账户过期日期,表示自1970年1月1日以来的天数。过期后,用户无法登录。设为
-
reserved
:- 保留字段,目前未使用,通常为空。
示例
以下是一个典型的 /etc/shadow
文件的条目示例:
user1:$6$abcd$EFGhijklmnopqrstuvwxyz1234567890abcdef:18845:0:99999:7:::
user1
:用户名。$6$abcd$EFGhijklmnopqrstuvwxyz1234567890abcdef
:使用 SHA-512 加密的密码。18845
:上次密码修改的日期(从1970年1月1日开始计算的天数)。0
:最小密码修改天数。99999
:最大密码有效天数。7
:密码到期前7天提醒用户更改密码。- 剩余字段为空或默认,表示没有设置额外限制。
注意事项
-
编辑工具:建议使用超级用户权限的文本编辑工具,如
vi
或nano
,来编辑/etc/shadow
文件。修改前,务必备份原始文件。 -
密码加密:手动编辑密码时,建议使用加密工具生成加密字符串,例如使用
openssl passwd
命令生成 SHA-512 加密密码:openssl passwd -6
-
避免错误修改:不正确的修改可能导致用户无法登录或系统认证问题,因此编辑时要谨慎。
通过理解 /etc/shadow
文件格式和内容,可以有效地管理系统用户的密码和相关信息。
python 生成方式
用python工具生成/etc/shadow上需要使用的密码部分,其中可以使用passlib;
passlib是一个支持多种哈希算法的Python库,专门用于处理密码哈希和验证。它支持生成符合/etc/shadow格式的密码字段。
安装 passlib
pip install passlib
代码示例
from passlib.hash import sha512_crypt
password = "hello"
hashed_password = sha512_crypt.hash(password, rounds=5000, salt="gFj0G/ECExVW")
print("Hashed password:", hashed_password)
这个Python示例使用passlib生成符合/etc/shadow格式的SHA-512哈希值。
小结
生成符合/etc/shadow文件格式的加密密码有很多工具和方法,常见的有:
命令行工具:如openssl、mkpasswd、htpasswd。
编程语言接口:如C语言中的crypt函数、Python的crypt模块和passlib库。