尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

Ubuntu root密码设置与重置:从sudo机制到恢复模式的完整指南

Ubuntu root密码设置与重置:从sudo机制到恢复模式的完整指南 第一次接触Ubuntu的时候我其实挺不习惯的。以前在CentOS和Debian系服务器上折腾惯了装完系统第一件事就是“sudo passwd root”给root设个密码甚至习惯直接root登录干活。结果装完Ubuntu 22.04发现自己居然连root密码都没设置过安装过程中压根没有让你设置root密码的步骤登录界面能看到的只有装系统时创建的那个普通用户。当时我第一反应是“这不是残废系统吗”后来才意识到Ubuntu这套默认无root密码的设计不是疏忽是故意的。如果你也有类似的疑问或者你正在被“忘记root密码”“修改root密码”“root密码到底怎么设置”这类问题卡住这篇文章基本能把场景聊透。不论你是物理机、虚拟机、云服务器还是WSL环境底下这些方法都能用得上。我会从机制讲起再逐步覆盖正常设置、忘记密码后的恢复流程以及一些不常用但关键时刻能救命的兜底操作。1. 为什么Ubuntu默认没有root密码先搞清楚机制再动手很多新手踩坑踩的不是操作本身而是压根没理解Ubuntu的用户权限模型。CentOS、RHEL这类发行版在安装时会强制你设置root密码全程用root管理。Ubuntu从桌面版到服务器版则完全是另一套逻辑默认不启用root账号也不设置root密码管理操作全部通过一个拥有sudo权限的普通用户完成。这套机制的核心是sudo工具。安装Ubuntu时你创建的第一个用户会被自动加入sudo组相当于拿到了“管理员授权”。执行管理命令时不用切到root而是通过sudo command临时提权。系统会要求输入当前普通用户的密码来确认身份。注意这里验证的是你自己账号的密码不是root的。为什么Ubuntu要这么设计主要是安全和审计两个原因。安全方面root账号是攻击者的首要目标默认禁用等于直接踢掉了一个暴力破解入口。审计方面每次sudo操作都会在/var/log/auth.log里留下记录出了事可以追溯到底是谁、在什么时间执行了什么命令。而直接root登录所有操作都混杂在同一个身份下排障和追责都会麻烦很多。想验证这套机制可以直接看/etc/shadow文件里的root记录。在终端输入sudo grep ^root: /etc/shadow正常安装完的Ubuntu这行一般是root:*:19000:0:99999:7:::或者root:!:...的形式。密码字段里的星号和感叹号都表示“锁定状态”也就是说root账号没有可用密码物理登录和远程登录都进不去只能以普通用户身份通过sudo提权。理解了这个前提你就会明白“给root设置密码”和“修改root密码”不是一回事前者是从锁定状态激活root账号后者是换个新密码。底下的操作虽然都是passwd root但适用场景和前置条件完全不同。2. 给root设置或修改密码最简单也最容易被忽视细节的操作2.1 sudo passwd root 完整流程给root设置初始密码的操作很简单一句话总结就是sudo passwd root执行后会依次提示你输入两次新密码。这里有个容易让人懵的点终端里输密码时屏幕上什么都不显示连星号都没有。很多人以为键盘坏了或者系统卡住其实是正常的输完回车就好。整个交互过程大概是这样[sudo] password for yourname: New password: Retype new password: passwd: password updated successfully看到“password updated successfully”就是成功了。这个命令的本质是通过sudo获得临时的root权限然后调用passwd命令修改root账号的密码字段。如果你的Ubuntu当前已经处于root身份比如刚执行过sudo -i那直接运行passwd root效果相同但特意跑到root身份下去改root密码其实没必要sudo passwd root一步就够了。2.2 修改root密码的两种情况已经设置过root密码、现在想换一个分两种情况第一种是你还记得当前root密码。直接登录root或者通过su -切到root然后运行passwd root输入当前密码验证后设置新密码。第二种是你已经不记得当前root密码了或者觉得输密码太麻烦。比如你有sudo权限的普通用户还能登录那直接sudo passwd root就能重置——这个命令并不会验证旧的root密码因为sudo本身已经完成了身份授权。很多教程只说了“修改root密码”却没强调这一点导致一部分人以为必须先知道旧密码才能改冤枉路走了一大截。2.3 验证密码是否真的设置成功密码设置完很多人心里不踏实怕没生效。我习惯用两步验证先看shadow文件是否更新sudo grep ^root: /etc/shadow正常设置成功后root行会从root:*或root:!变成类似root:$6$abcdefgh$...长篇哈希字符串...:19000:0:99999:7:::$6$表示使用SHA-512加密$y$是更新的yescrypt加密方式看到这种格式就对了。再测试能否用root登录su -输入刚设置的root密码能正常进入root shell说明没问题。su -和sudo -i的区别在于前者用的是root自己的密码后者用的是当前用户的sudo权限两者在最终效果上都是切到root shell但验证途径完全不同。2.4 密码强度与生成建议给root设置密码时我的建议是至少16位尽量用混合大小写字母、数字和符号的组合。如果你想省脑子可以用系统自带的密码生成工具openssl rand -base64 24输出一串比如v6xL9tJz2mWpQ8kR3uBfN4cY这样的随机字符复制到密码设置里就行。当然生成的密码要记在密码管理器里别只存脑子里早晚会忘。3. 忘记root密码时从恢复模式重置的完整链路3.1 什么时候会用到恢复模式很多人平时根本不用root账号密码设完就忘了。直到某天需要执行某些必须root的操作、或者sudo身份本身也失效时才想起密码早被抛到脑后了。还有一种更常见的场景你是接管别人的服务器或者二手虚拟机前任管理员设置的root密码根本没移交给你。这时候就需要绕过登录验证从系统层面重置密码。Ubuntu自带的恢复模式Recovery Mode是首选项整个流程不需要额外介质只用本机就能完成。3.2 进入恢复模式的具体操作搞清楚步骤再动手重启电脑在BIOS/UEFI自检过后、GRUB引导菜单出现时按住Shift键部分新版本按Esc进入GRUB菜单。选择“Advanced options for Ubuntu”回车进入。在内核列表里找到带“(recovery mode)”字样的选项按回车启动。系统加载完会进入一个恢复菜单Recovery Menu里面有几个选项选择“root – Drop to root shell prompt”。3.3 到这一步很多人的文件系统是只读的进入root shell后一个关键问题马上会出现此时根文件系统是只读挂载的。这是恢复模式的默认行为目的是防止故障状态下文件系统被二次破坏。如果你不做任何处理直接运行passwd root大概率会看到Authentication token manipulation error这样的报错密码改不成功。解决方式很固定先重新挂载根文件系统为可读写mount -o rw,remount /执行完可以顺手确认一下df -h / | tail -1如果显示的挂载参数里有rw字样说明已经是读写状态了。然后正常修改密码passwd root连续输入两次新密码看到更新成功的提示输入exit退出root shell回到恢复菜单选择“Resume normal boot”继续正常启动。3.4 云服务器和物理机的差异以上流程对物理机、本地虚拟机完全适用。但云服务器要另说——云平台上通常没法进入GRUB菜单因为控制台界面比较有限很多云厂商的VNC体验也只能呈现BIOS阶段Shift键敲烂了也进不了GRUB。这种情况下更实际的做法是直接通过云厂商提供的方式挂载系统盘去重置密码。比如很多云平台支持“重置实例密码”功能或者在救援模式下挂载数据盘后通过chroot修改密码。这些平台差异比较大就不在这里展开了总之记住一点碰到云服务器优先看厂商控制台有没有密码重置入口别死磕本地恢复模式。4. 单用户模式与chroot兜底当恢复菜单也不灵的时候4.1 给GRUB加参数直接进root shell恢复模式菜单偶尔也会抽风比如系统文件损坏、引导异常导致菜单选项报错。另一种思路是直接在GRUB层面做手脚跳过系统菜单启动后直接进root shell。步骤如下重启进入GRUB菜单。选中默认的Ubuntu内核启动项按e键进入编辑模式。找到以linux开头的一行通常是第二行或第三行在行尾添加参数rw init/bin/bash注意这里的rw很关键它会让内核挂载根文件系统时直接以读写模式挂载省去了恢复模式里再mount -o rw,remount /的步骤。init/bin/bash的意思是让系统跳过正常的init进程systemd直接启动一个bash作为初始进程跳到root shell。按CtrlX或F10启动。启动完成后你会直接进入root命令行此时文件系统是读写的直接passwd root改完密码重启即可。这个方法的限制是如果你用了全盘加密LUKS启动过程会要求输入解密密钥没有密钥的话走不通。另外因为跳过了systemd系统服务和网络都不会启动只适合做密码重置这类基础操作别指望改完密码顺便在里面装包。4.2 用安装介质chroot改密码还有一种兜底方案适合GRUB都进不去、或者不想动引导配置的情况拿一个Ubuntu的启动U盘或者ISO镜像的live环境启动进入桌面环境然后通过chroot挂载目标系统修改密码。启动live环境之后先确认目标系统的根分区位置lsblk -f根据分区大小和文件系统类型判断哪个是自己的系统盘。然后挂载根分区和其他必要目录sudo mount /dev/sda2 /mnt sudo mount --bind /dev /mnt/dev sudo mount --bind /proc /mnt/proc sudo mount --bind /sys /mnt/sys接着切进目标系统sudo chroot /mnt /bin/bash在chroot环境中执行passwd root修改完成后依次退出chroot并卸载分区exit sudo umount /mnt/dev sudo umount /mnt/proc sudo umount /mnt/sys sudo umount /mnt然后重启拔掉启动介质按正常流程进入系统。这个方法比GRUB参数法更通用也能处理更多类型的系统故障不只是密码重置。比如系统引导坏了、某个服务起不来导致系统循环重启chroot进去修都是常规操作。它唯一的成本是需要一个可用的Ubuntu启动介质手边没有的话就得现场做一个。4.3 如果是普通用户密码忘记而不是root密码忘记顺带提一嘴很多人搜索“Ubuntu忘记root密码”时实际场景其实是忘了登录界面那个普通用户的密码。这种情况下不需要这么复杂直接在GRUB里用恢复模式走到root shell后执行mount -o rw,remount / passwd 用户名把“用户名”换成你的账号名就行。或者更简单重启在登录界面按CtrlAltF2切换到TTY终端用root身份登录后强制修改普通用户密码。不过这个前置条件是root密码你得知道不知道还是走恢复模式方便。5. root密码设置之后的日常与安全哪些事别再踩坑5.1 root密码设完SSH还是连不上这是设置root密码后最高频的困惑密码明明改成功了用SSH工具连服务器却提示Permission denied密码输错可能还会无限重试被拉黑。原因在于Ubuntu默认的SSH配置里PermitRootLogin通常是prohibit-password或者直接不允许root密码登录。这是安全加固策略的一部分——root账号密码如果被暴力破解成功整台服务器就沦陷了所以默认把root远登录入口关掉。如果你确实有root远程登录的需求比如某些自动化工具需要可以修改SSH配置文件sudo nano /etc/ssh/sshd_config找到#PermitRootLogin prohibit-password改成PermitRootLogin yes然后重启SSH服务sudo systemctl restart sshd这里我不建议在公网服务器上开启root密码登录被爆破的体验极其酸爽。如果你需要在服务器上做管理操作老老实实用普通用户的sudo权限就够了。跑在内网、且对安全性有能力兜底的话可以自行权衡。如果你只想临时用一下还有一种折中做法——设好root密码后在本地用su -切到root执行操作SSH入口继续保持关闭状态。5.2 设root密码前先想清楚你真的需要吗很多教程喜欢说“Ubuntu要设置root密码才能管理”这是典型的误导。Ubuntu的机制设计初衷就是让你不要依赖root账号日常管理走sudo完全够用。设置root密码意味着开放了一个额外的入口多一份需要保护的东西。如果你设root密码只是为了偶尔切到root执行几条命令我更推荐保持root密码为锁定状态直接sudo -i临时获得root shell。这个命令在终端里输入后验证的是当前用户的密码不会动root的密码状态用完exit退出就行。5.3 密码设完就忘的老毛病怎么治root密码不像普通用户密码它平时基本用不到遗忘概率很高。我的做法是设完就写进密码管理器或存在一个加密笔记里同时用系统内置的钥匙串或保险库管理工具统一托管。如果你实在不放心自己记性还可以在设置密码时顺便生成一个备份密钥文件echo root密码: 你的密码 | gpg --symmetric --output ~/root-password.gpg用GPG对称加密保存在本地需要时解密查看。文件本身是加密的即使被拷贝走没有密码也打不开。这个方法算是个不太常规但很实用的习惯系统管理员手里同时管着几十台机器时特别有用。5.4 设置root密码后有时需要注意桌面登录如果你在Ubuntu桌面版上设置了root密码注意在登录界面手动输入root用户名时默认情况GNOME登录界面是看不到root这个账号的因为Ubuntu默认隐藏UID小于1000的用户。这也是正常现象不代表密码设置失败。你可以在登录界面点击“未列出”然后手动输入root用户名和密码或者干脆继续用普通用户日常登录只在需要时通过终端切root。5.5 一个额外提醒chroot环境里也要注意文件系统挂载状态前面提到的恢复模式和chroot操作都是直接把密码重置指令扔到目标系统的shadow文件里。如果你在操作过程中发现passwd命令报错比如提示卡在“cannot change mode”或者文件写不进去九成是文件系统还是只读状态。这时候需要确认挂在目标分区的选项重跑一遍挂载命令确保是rw。顺带说明一个底层逻辑passwd写入shadow并不是简单覆盖一个密码字符串它要对密码做哈希计算、加盐、生成新的shadow条目整个写入过程涉及到文件锁和权限校验。只读文件系统上这些操作都会被拒绝所以看到报错不要慌先去查挂载状态。6. 写在最后的一点体会我自己的服务器和开发机大部分情况下都不会主动设置root密码而是维护一个带sudo权限的管理员账号。真正需要root的空闲操作用sudo -i就够了。只有在少数场景——比如某些应用强制要求root登录、自动化脚本需要直接执行root命令——才会显式给root设置一个高强度密码并配合SSH公钥登录一起使用。设置root密码这事本身不难难的是理解自己为什么要这么操作。如果你只是想解决“系统提示需要root权限”那老老实实用sudo。如果是为了给root账号建立一套可用的登录凭据那按本文第一种方式操作就行。如果连sodu都失效了那就走恢复模式或者chroot。改完密码之后记得把新密码存进密码管理器别问我为什么强调这个我是靠格式化系统解决过自己密码问题的人。
返回列表