问题现象
执行passwd命令修改密码时,系统返回Permission denied错误。
问题原因
文件锁定:核心认证文件(如
/etc/passwd,/etc/shadow)被设置了不可变属性,禁止所有修改操作。读写权限配置不当:文件读写权限配置不当,导致
passwd命令无法修改密码。SELinux策略限制:系统开启SELinux,且安全策略阻止
passwd修改密码。PAM配置文件格式异常:PAM配置文件(
/etc/pam.d/)使用DOS格式会导致解析失败。
解决方案
在执行任何系统文件修改前,请先为系统盘手动创建单个快照对配置数据进行备份。以便在发生意外时能够快速恢复。
步骤一:检查并修改文件属性
检查文件属性。
sudo lsattr /etc/passwd /etc/shadow如果输出中包含
i属性或a属性(如----ia------),表示文件被锁定。使用chattr移除锁定。sudo chattr -ia /etc/passwd sudo chattr -ia /etc/shadow移除属性后,尝试执行
passwd命令。
步骤二:检查并修复文件权限
查看文件权限。
sudo ls -l /etc/passwd /etc/shadow核对权限是否符合标准。如若权限不正确,使用
chmod修复。/etc/passwd:标准权限为644(-rw-r--r--)。/etc/shadow:标准权限为000(----------)或600(-rw-------)。
sudo chmod 644 /etc/passwd sudo chmod 000 /etc/shadow修复权限后,尝试执行
passwd命令。
步骤三:检查SELinux状态
检查SELinux的当前状态。
sestatus如果
Current mode为enforcing,表示系统处于强制模式,会禁止违反安全策略的文件修改。可以将SELinux临时调整为宽容模式,暂时允许这些操作。setenforce 0关闭SELinux后,尝试执行
passwd命令。
步骤四:检查PAM配置文件格式
检查PAM系统配置文件的格式。
sudo file -i /etc/pam.d/passwd如果输出包含
ASCII text, with CRLF line terminators,则表示文件是DOS格式(使用CRLF换行),Linux系统无法解析含CRLF(\r\n)换行符的文件。需要转换格式。sudo yum install -y dos2unix sudo dos2unix /etc/pam.d/passwd转换格式后,尝试执行
passwd命令。
后续建议
问题解决后,可重新为/etc/passwd和/etc/shadow文件添加不可变属性,防止意外篡改。
sudo chattr +i /etc/passwd
sudo chattr +i /etc/shadow