问题描述
在Linux实例中修改root密码时,遇到“passwd: Permission denied”的错误。
原因分析
在Linux系统中,/etc/passwd
和/etc/shadow
是直接存储用户信息和密码的核心文件,其权限或属性异常会直接影响密码修改操作。而/etc/pam.d/*
目录下的配置文件则与PAM(Pluggable Authentication Modules)模块相关,主要定义了认证规则,通常不会直接导致“Permission denied”错误,除非存在严重的配置错误(如模块缺失或格式异常)。所以,此问题通常由以下原因导致:
/etc/passwd
、/etc/shadow
、/etc/pam.d/*
等关键文件的权限设置不正确。PAM(可插拔认证模块)配置文件格式错误,例如文件为DOS格式。
系统日志中记录的相关文件不存在或模块错误等问题。
解决方案
在对系统文件进行修改前,建议创建快照或备份重要数据,以防误操作导致数据丢失。
步骤一:检查关键文件的权限
运行以下命令,检查文件权限是否正常。
ls -l /etc/passwd /etc/shadow /etc/pam.d/*
正常情况下:
/etc/passwd
权限为644
(即rw-r--r--
),所有者为root
。/etc/shadow
权限为600
(即rw-------
),所有者为root
。/etc/pam.d/*
权限为644
(即rw-r--r--
),所有者为root
。
如果发现权限异常,可以使用以下命令修复文件权限。
sudo chmod 644 /etc/passwd sudo chmod 600 /etc/shadow sudo chmod -R 644 /etc/pam.d/*
运行以下命令,检查文件不可变属性。
lsattr /etc/passwd /etc/shadow
若输出中包含
i
(如----i--------
),表示文件不可修改,可执行以下命令移除i
属性。sudo chattr -i /etc/passwd sudo chattr -i /etc/shadow
修改密码后,可重新设置
i
属性以增强安全性。sudo chattr +i /etc/passwd sudo chattr +i /etc/shadow
步骤二:检查SELinux状态
如果系统启用了SELinux服务,可能会限制密码修改操作。可以通过以下命令临时关闭SELinux。
# 查看SELinux状态
sestatus
# 临时关闭SELinux(若启用)
sudo setenforce 0
如果问题解决,可根据需求永久关闭SELinux,具体请参见永久关闭SELinux服务。
步骤三:使用strace
追踪修改密码过程
通过
strace
命令,追踪修改密码的过程,并将日志输出到/tmp/changepasswd
文件。strace -o /tmp/changepasswd passwd root
执行以下命令分析日志,若输出类似
open("/etc/pam.d/system-auth-ac\r", O_RDONLY)
,则确认/etc/pam.d/system-auth-ac
文件格式异常(DOS格式导致)。grep "open" /tmp/changepasswd | grep "\/r"
步骤四:检查并修复PAM配置文件格式
执行以下命令检查文件格式。如果问题与PAM模块相关,可能是
/etc/pam.d/system-auth-ac
文件格式异常(例如DOS格式)。# CentOS/RHEL file -i /etc/pam.d/system-auth-ac # Ubuntu/Debian file -i /etc/pam.d/passwd
如果输出中包含
us-ascii
和with CRLF line terminators
,则表示文件为DOS格式。如果文件为DOS格式,使用以下命令将文件从DOS格式转换为Unix格式。
# CentOS/RHEL sudo dos2unix /etc/pam.d/system-auth-ac # Ubuntu/Debian sudo dos2unix /etc/pam.d/passwd
步骤五:验证修改结果
完成上述步骤后,再次尝试修改root密码。
passwd root
输入新密码并确认,查看是否能够成功修改密码且不再出现“Permission denied”错误。
使用新密码登录系统,验证密码修改是否生效。
通过上述步骤,您可以逐步排查并解决“passwd: Permission denied”问题。如果问题仍未解决,请进一步检查系统日志或提交工单联系技术支持获取帮助。