/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 或空表示账户不会过期。
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库。