ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

Linux密码修改实操指南:root与普通用户密码管理及避坑

2026/10/5 7:15:34 拓冰建站 浏览量
Linux密码修改实操指南:root与普通用户密码管理及避坑 先说我自己的经历。早年管着一批Linux服务器最经常被拉去处理的事情不是性能问题也不是配置故障而是“密码又忘了”。其中一半是root密码丢了另一半是某个普通用户的密码过期导致自动化任务全部失败。改密码这件事听起来简单就是一条passwd命令但真正做久了会发现这里面的门道比你想象的要多得多。尤其是在Linux系统里root密码和普通用户密码的管理逻辑完全不同改错了轻则权限失效重则整个系统都进不去。这篇内容就把修改root密码、修改普通用户密码这件事从头到尾捋一遍把那些容易踩的坑顺手也一起讲了。1. 先弄懂root密码和普通用户密码为什么不是一回事1.1 Linux到底把密码放在哪里很多人有个误区觉得Linux和Windows一样用户信息都存在某个统一的地方改密码就是改一个文件。实际上Linux的用户信息分两个文件存/etc/passwd负责记录用户名、UID、GID、家目录和登录Shell而真正的密码哈希值在/etc/shadow里。 /etc/passwd是全局可读的所以它里面绝对不允许存密码原文或哈希/etc/shadow则只有root用户和shadow组能读。这两个文件的设计逻辑用生活里的类比就是门牌上写了每家住几口人passwd但真正开门的钥匙放在保险柜里shadow。普通用户能看到门牌信息但碰不到保险柜。所以当你改root密码或者改普通用户密码时最终操作的都是/etc/shadow里的那一条记录只是借助的工具都是passwd命令。为什么要强调这个文件层面的区别因为后面排查问题时会用到。比如你明明记得改了密码但重启后始终登不进去大概率是/etc/shadow里的记录没同步或者磁盘在某个时刻变成只读了导致写入失败。这时候去检查shadow文件的修改时间和权限往往比反复重试命令更有用。1.2 root和普通用户是两套完全不同的权限体系root在Linux里的UID是0它拥有对整个系统所有文件的读写执行权限可以修改内核参数、管理用户、安装软件、格式化磁盘。而普通用户即使内存在uid 1000以上也只能在自己家目录和自己拥有或有对应ACL权限的文件里活动。这两套权限体系是系统隔离的所以root密码和普通用户密码本质上对应的是两个不同“世界”的通行证。你可以把root想象成大房东普通用户是租客。大房东能进任何房间、换掉任何锁、重新装修租客只能在属于自己的房间里做文章。租房合同上写的很清楚租客不能去改大门的密码但在Linux上只要租客有sudo提权权限他就能变成“临时大房东”修改root密码。这既是安全隐患也是日常运维中绕不开的便利。理解了这层关系后续的sudo、su、passwd命令选择就清楚多了。修改root密码和修改普通用户密码的命令相似但前置条件的区别非常关键改别人的普通用户密码需要root或sudo权限改root密码本身也需要你先有某个方式触达root环境。2. 修改root密码的几种常用姿势2.1 已经在root环境下一条passwd搞定如果你已经用root身份登录了系统或者通过sudo su切换到root了修改root密码只需要执行passwd注意这里如果不带用户名passwd默认修改的是当前登录用户的密码。在root环境下执行passwd就会提示输入新的root密码。命令运行时会要求输入两次新密码输入过程中屏幕不会显示任何字符连星号都不显示。很多人第一次操作会比较慌以为键盘没生效其实是正常的。只要耐心输完两次并看到“passwd: password updated successfully”的提示就算成功了。补充一个细节root密码不因其账户本身“权限大”而有额外的复杂度校验。Linux系统默认只在特殊策略里要求root密码满足长度平时改root密码时即使设置成“123456”也能通过。但从安全角度我不建议这么做这个后面会专门说。2.2 当前是普通用户但能sudo先提权再改最常见的情况是你用普通用户登录了系统而这个普通用户在sudo权限组里比如Ubuntu安装时创建的第一个用户。此时修改root密码命令是sudo passwd rootsudo会先验证当前普通用户的密码验证通过后passwd root会让设置新的root密码。这中间还需要注意如果你的普通用户本身就因为密码过期而无法通过sudo验证那么这条命令也会卡在第一步。所以日常运维中建议给应急用的管理账号单独把密码策略放宽别让它在关键时刻过期。有些刚接触Linux的人会直接用su root然后输入自己普通用户的密码这是行不通的。su要求的是目标用户root的密码不是本用户的密码。如果你知道root密码那没问题如果不知道就必须走sudo route这一点非常容易混淆。2.3 彻底忘记root密码进单用户模式重置这里说的场景是指整个系统只有root账号可用或者连普通用户也不知道密码你连登录界面都进不去。这时候就要借助引导器进入单用户模式或者用救援模式。以常见的GRUB引导为例重启系统在GRUB菜单按e编辑当前启动项找到以linux开头的内核行在行尾添加rd.break或init/bin/sh然后按CtrlX引导系统。进入root shell后把文件系统重新挂载为读写模式再用passwd修改root密码最后执行touch /.autorelabel在SELinux启用的系统上并退出重启。这个操作听着简单但有几个坑。一是云服务器通常没有本地键盘和物理显示器的环境靠厂商提供的VNC或控制台才能完成这个操作二是一些强制磁盘加密的系统在进入单用户模式后还需要先解锁磁盘三是为了防止有人物理接触服务器就随意重置root密码很多系统的GRUB都设置了密码保护这时候你还需要先输入GRUB密码才能进入编辑界面。这部分的真正含义是root密码本质上不是“不可重置”但操作系统会通过引导层安全机制把物理访问的风险降低。如果你的机器放在机房且没有设置BIOS/GRUB密码任何能碰到电源键的人理论上都能通过这个方法重置root密码。所以物理安全也是密码安全的一部分别只盯着/etc/shadow。3. 普通用户密码修改的实操细节3.1 最基本的passwd username修改普通用户密码的命令是passwd username其中username就是你要改的目标用户。执行这条命令你需要是root或者拥有sudo权限。对应地如果只是用户本人想改自己的密码直接执行passwd即可不需要管理员权限系统会让你先输入旧密码再设置新密码。网上有很多教程会让你在修改普通用户密码时加上--stdin然后通过管道把密码传进去echo NewPass123 | passwd --stdin username这个用法在RHEL/CentOS/Fedora里很常见因为脚本自动化时需要非交互式地改密码。但同样这条命令在Debian/Ubuntu的默认版本上可能不支持--stdin参数会直接报“Usage: passwd [options] [user]”。所以跨发行版写脚本时要么先检查工具支持要么改用chpasswd命令echo username:NewPass123 | chpasswdchpasswd在多数发行版都有而且用法更统一。这也是我在自动化脚本里更推荐的方式。3.2 交互式改密容易犯的几个“误操作”很多人在改普通用户密码时误把目标用户输成了自己当前用户然后发现自己密码被改了用户没改。原因是passwd不带参数时会对当前用户生效当你已经root且想改普通用户密码时一定不能省略用户名。出现了这类误操作也不要慌再执行一次正确的命令就可以恢复。另一个常见误操作是把用户名拼错比如输入passwd test系统提示“user test does not exist”你就要检查是不是打错了。有些人习惯把目标用户的家目录路径当参数传进去写成passwd /home/test这同样会出错。记住命令参数里只跟“用户名”不跟路径。交互式改密还有一个体验差异是密码可见性。终端里不显示任何字符不代表输入没生效。在SSH连接不稳定的时候尤其要注意如果密码输入中途连接断了shadow文件可能处于一个中间状态重启后密码既可能是新密码也可能是旧密码。稳妥做法是改完后马上在新会话里测试一次登录不要直接关掉现有连接。3.3 创建用户并设置初始密码的标准动作新人的另一种高频需求是“新建一个普通用户并设置密码”。正确步骤是useradd -m -s /bin/bash testuser passwd testuser-m参数是为了同时创建家目录-s参数指定登录Shell。有些用户名有特殊要求可以用-u指定UID用-g指定初始组。很多系统在useradd之后管理员以为密码已经设置好了其实不是useradd创建的账号默认是“未设置密码”状态直接登录会被拒绝。所以创建完用户后必须紧跟一条passwd命令。如果你希望新用户在第一次登录时强制修改密码可以在useradd之后配合chage实现命令是chage -d 0 testuser这样该用户下一次成功登录后系统会立刻要求修改初始密码。这种方式特别适合在给同事或外包人员创建临时账号时使用避免初始密码长时间不变。4. 密码过期、sudo权限组和其他账号策略4.1 用chage控制密码生命周期密码不是设完之后就万事大吉的。很多系统管理员会接到“密码过期提醒通知”这个机制就是通过chage命令配合/etc/shadow里的字段实现的。查看某个用户的密码到期时间chage -l username输出里包含“密码过期时间”“密码失效时间”等信息。设置90天强制改密chage -M 90 username设置提前7天提醒用户chage -W 7 username这里最容易被忽略的是“账户过期”和“密码过期”的区别。密码过期后用户仍然可以登录并进入修改密码的界面而账户过期是整个人都进不来需要管理员重新设置失效时间。如果你收到的监控告警是“password expired”“password has expired”那大概率是密码过期让用户跑一次passwd或者用chage -d 0强制重置即可。4.2 把普通用户加入sudo权限组的正确做法日常运维里经常有人问“怎么把普通用户变成root”这个出发点其实有问题。正确做不是改UID也不是把普通用户放进root组而是把有需要的用户加入sudo权限组让他能通过sudo临时执行管理命令。以Ubuntu/Debian为例usermod -aG sudo testuser如果是RHEL/CentOS系组名通常是wheelusermod -aG wheel testuser加入之后testuser就可以用sudo command执行管理命令了。但注意两点一是sudo默认仍要求输入自己的密码除非你在/etc/sudoers里配置了NOPASSWD二是仅加入组还不够部分系统还需要确认/etc/sudoers文件本身有%sudo ALL(ALL:ALL) ALL或%wheel ALL(ALL:ALL) ALL这样的配置。用visudo可以安全编辑sudoers文件千万不要直接在文本编辑器里乱改否则语法错误会导致所有sudo不可用。我见过翻车的案例某管理员把配置改坏了sudo直接报“syntax error near line 3”当时只能通过物理终端或单用户模式去修复sudoers文件。所以我在改这类配置前一定会先执行visudo -c做语法检查再退出。4.3 别试图把一个普通用户的权限改成“第二个root”热词里有一类叫“把普通用户变成root”“把普通用户变成超级用户”这里要正名Linux上不应该直接把某个普通用户变成root。虽然可以通过修改UID为0来“冒充”root但系统中有很多服务依赖UID和用户名之间的映射关系强行改成0会导致文件属主显示混乱ACL权限判定异常甚至让某些服务无法启动。更好的做法是多使用sudo按需给权限。比如想让某个用户只能重启服务可以在sudoers里配置testuser ALL(ALL) NOPASSWD: /usr/bin/systemctl restart nginx这样他不需要知道root密码也不具备root全部权限但能完成特定运维任务。权限最小化是运维的基本盘。5. 特别提醒系统root和数据库root是两码事5.1 用passwd改不了数据库的root密码很多人对root的概念是混淆的。Linux系统有一个rootMySQL/MariaDB也有一个root用户两者虽然都叫root但完全不是一回事。系统root对应的是/etc/shadow中的账号数据库root对应的是MySQL权限表里的账号。所以当你在终端里执行passwd root只能改Linux系统登录密码根本影响不到MySQL/MariaDB的root密码。看到网上有人搜“给mariadb root设置密码”最后发现自己执行完passwd root后数据库依然提示Access denied原因就在这里。需要先分清你要改的到底是谁的root如果是要通过SSH或控制台登录这台Linux主机就走系统密码如果是要用数据库客户端连接MySQL/MariaDB就走数据库里的账号密码。5.2 MariaDB/MySQL的root密码重置思路如果你忘了MariaDB/MySQL的root密码首要操作不是重装数据库而是用“跳过权限表”的方式启动数据库。常规思路是先停止数据库服务再以mysqld_safe --skip-grant-tables方式启动这时任何客户端都可以无密码连上数据库接下来用SQL更新root密码。以MySQL 5.7和MariaDB 10.x为例常见的新版本写法是FLUSH PRIVILEGES; ALTER USER rootlocalhost IDENTIFIED BY NewPassword123;老版本则可以用UPDATE mysql.user SET PasswordPASSWORD(NewPassword123) WHERE Userroot AND Hostlocalhost; FLUSH PRIVILEGES;执行完后正常重启数据库服务。这里要特别小心--skip-grant-tables状态下的数据库是裸奔的不能开着外网端口否则任何人连上都能拿到全部数据。建议只在本地、短时间、确认防火墙关闭外部访问的情况下使用。5.3 为什么总出现ERROR 1045常见报错“ERROR 1045 (28000): Access denied for user rootlocalhost (using password: YES)”就是数据库认证失败。它和系统密码没有任何关系。排查思路非常固定首先确认是否记错数据库密码其次确认host是localhost还是%然后检查当前MySQL用户表里是否有对应host的记录最后再用跳过权限表的方式重置。很多新人会在这个问题上反复折腾因为折腾错了方向。比如反复修改系统root密码然后继续拿数据库客户端连接结果还是被拒。提醒所有看到这个报错的读者第一反应应该是去检查数据库授权表而不是Linux系统账号。6. 常见问题与排查速查6.1 高频报错对照表报错或现象可能原因处理方式Permission denied当前用户没有管理员权限换用sudo或root身份执行passwd: user xxx does not exist用户名打错或用户未创建用id xxx确认用户存在su: Authentication failureroot密码错误或Ubuntu的root默认未设置用sudo passwd root先设置再切换password has expired密码生命周期到期登录后执行passwd或让管理员用chage -d 0强制重置sudo: no tty present脚本里无终端执行sudosudo参数加-t或改用root运行脚本ERROR 1045 (28000)数据库root密码不对不是系统root问题按MySQL/MariaDB方式重置数据库密码passwd: Permission denied普通用户改自己之外的用户密码必须以root或sudo执行chage: user not found用户不存在或拼写错误先useradd创建用户再设置策略这张表是我日常排查最常用到的六张清单。命令记不住不可怕能根据现象定位到对应机制才关键。6.2 三个容易被忽略的隐藏点第一个隐藏点是提示“密码更新成功”不代表密码立即生效。有些分布式系统或LDAP/NSS插件会缓存用户信息改完密码后可能要等几分钟或重启相关服务。如果遇到改了密码但新密码登录不上的情况优先检查系统是否接入了LDAP/AD域改的到底是本地密码还是外部认证源的密码。第二个隐藏点是sudo缓存对改密的影响。sudo命令默认会缓存一次验证结果默认时长通常是15分钟。如果你刚通过sudo修改了普通用户自己的密码紧接着又用sudo执行命令系统可能还认旧密码的缓存导致觉得“怎么密码改完没生效”。多等一会儿或直接执行sudo -k清除缓存就能看到真实效果。第三个隐藏点是计划任务和脚本里硬编码的旧密码。很多业务系统会把root密码或普通用户密码硬编码在cron任务、备份脚本、配置文件的连接串里。你改了系统账号密码却没更新脚本里的密码第二天就会发现一堆任务开始报认证失败。这个坑在真实生产环境里太常见了。我每次改完密码后都会顺手搜索一下所有常见配置目录里的连接字符串例如用grep -r password /etc /opt /data等目录不过要注意别误扫敏感信息最好在可控的范围内进行。再说一个我自己的习惯改完任何账号的密码如果是在远程服务器上操作的我会一定先开一个全新的终端会话用新密码成功登录并且确认没问题后再关闭旧会话。这样做看起来多花了一点时间但能避免“改完密码后SSH连接中断结果是新密码还是旧密码都说不清楚”的尴尬局面。如果你有跳板机或堡垒机记得在跳板机那一侧也确认一遍授权策略是否受影响。修改root密码和修改普通用户密码表面上就是几条命令的事但实际上牵扯到用户权限模型、密码存储位置、sudo策略、数据库账号体系等一串连锁反应。这篇内容算是我几年摸爬滚打的阶段性总结希望能帮你在下一次“密码要改”的时候少走几步弯路。若再遇到具体问题优先检查错误信息本身再顺着权限链路上的文件和服务去排查多半比盲猜管用得多。