刚接触Linux那会儿,我最爱折腾的就是Ubuntu。装好系统第一件事就是想切到root用户,结果输个su -直接报su: Authentication failure,一头雾水。后来才明白,Ubuntu默认压根就没给root设密码,这个设计让很多人刚上手就卡住了。这篇就把“Ubuntu启用root账号并登录”这件事从头到尾拆开讲清楚,包括为什么要这样设计、怎么启用、图形界面怎么登录、SSH远程怎么登录、遇到各种报错怎么排查,最后再说说我的安全建议。无论你是虚拟机里装Ubuntu练手,还是服务器上装了22.04 LTS在生产环境跑服务,这篇都能直接用。
1. 为什么Ubuntu默认不给你root密码
1.1 sudo机制与Ubuntu的设计哲学
Debian系的Linux默认安装完都会给你一个能用的普通用户,但这个普通用户并不默认知道root的密码。Ubuntu更进一步,默认安装阶段压根就不让你设置root密码,整个系统的root密码处于“锁定”状态。你在日常操作里看到的sudo,本质上是让普通用户临时以root身份执行某条命令,是先验证“你本人”的密码,而不是root的密码。
这套设计叫“最小权限原则”。简单说:平时用普通用户干活,真要碰系统级配置时再临时提权。好处有两点:一是避免你天天用root乱操作把系统搞炸;二是所有sudo操作都会记入/var/log/auth.log,出了问题追查起来有据可依。发烧友圈子里常说“别用root跑日常”,其实就是这个习惯养成的问题。
我在生产服务器上踩过的最深坑,就是刚学Linux那会儿全程root操作,一条rm -rf差点把数据库目录清空。从那之后我养成了习惯:能用sudo解决的,就不要切root;确需root的,敲完命令立刻退回来。
1.2 什么时候才真正需要启用root
不是所有场景都需要开root。比如普通桌面用户装软件、改配置,sudo完全够用。但下面这些场景,启用root反而能省不少事:
- 写自动化脚本需要批量修改系统文件,反复sudo会打断流程。
- 排查系统故障时要频繁执行
journalctl、ss、iptables等高权限命令,每次sudo很烦。 - 某些软件(比如磁盘分区工具、内核模块编译工具)在图形界面下需要root权限,系统不让你用root登录就没法跑。
- 服务器管理场景,希望直接用root登录SSH再分权给其他管理员。
所以接下来讲的操作不是“必须做”,而是一套“按需启用”的完整方案。
2. 三步启用root账号,实测干货
2.1 第一步:给root设置一个密码
启用root的第一步,就是给它设置密码。在终端里执行:
sudo passwd root系统会先要求你输入当前用户的密码(也就是你登录用的那个用户的密码),验证通过后,提示New password:,输入你想设置的root密码,再确认一次。看到passwd: password updated successfully就说明设置成功了。
这里有个关键点:很多教程让你直接执行sudo su -然后passwd root,我实测下来其实多此一举。sudo passwd root一步就能完成,而且更符合直觉。其实sudo passwd root和sudo su -后执行passwd的底层逻辑一样,都是先用sudo拿到提权,再用passwd修改root密码,但前者少敲一条命令,也更直观。
设置密码时建议用足够强度的组合,比如大小写字母+数字+符号,长度至少12位。别用123456或者root这种,后面会讲为什么——开了root登录后,这个账号就是公网服务器上被暴力破解的首要目标。
2.2 第二步:验证root能不能正常切换
密码设置成功后,先验证一下能不能正常切换。终端执行:
su -输入刚才设置的root密码,如果提示符变成了root@主机名:~#,就说明本地切换成功。注意这个su -和su的区别:带-参数会完整加载root的环境变量,工作目录也会切到root的家目录;不带-只是切换身份,环境变量还保留普通用户的。日常切root建议养成带-的习惯,否则有些命令路径不对会报command not found。
如果你执行su -时提示su: Authentication failure,说明root密码还没设置成功,或者输错了密码。这种情况回到2.1重新设置即可。
2.3 处理“su: 鉴定令牌操作错误”这个经典报错
这是Ubuntu新手最爱遇到的报错之一,完整报错一般是su: 鉴定令牌操作错误或者英文版su: Authentication failure。这个报错的根源只有一个:你输入的密码不对,或者root账号根本没有密码(处于锁定状态)。
排查思路:
- 确认是否执行过
sudo passwd root,没执行过就直接su -,必然报这个错。 - 确认输入密码时是否开启了Num Lock,终端里输错大小写是常事。
- 检查 /etc/shadow 里root那一行的状态。执行:
sudo cat /etc/shadow | grep '^root'正常设置过密码的,root行是root:一串加密hash:...;如果看到root:!:...或root:*:...,说明root处于锁定状态或没有有效密码。此时重新执行sudo passwd root即可。
还有一个隐蔽坑:有些人用虚拟机装Ubuntu,键盘布局选的英文,但物理键盘是中文输入法状态,输密码时输入法默认全角,密码就一直不对。这个虽然看起来离谱,但我在给人远程排查时真的遇见过。
3. 让root能登录的三种方式,从本地到远程
3.1 本地终端和图形界面登录root
设置了root密码后,本地终端Ctrl+Alt+F3之类切到tty,输入root用户名和密码就能直接登录。但图形界面(GDM登录界面)默认是拒绝root登录的,只显示普通用户列表,你手输root用户名也会被拒。
要让图形界面能登录root,需要修改GDM的配置。在Ubuntu 22.04上操作如下:
sudo nano /etc/gdm3/custom.conf在[daemon]段落下加入一行:
[daemon] WaylandEnable=false然后修改PAM认证文件:
sudo nano /etc/pam.d/gdm-password把下面这行注释掉(行首加#):
auth required pam_succeed_if.so user != root quiet_success保存后重启GDM服务:
sudo systemctl restart gdm3重启后登录界面就能选择root登录了。注意这里有个重点:在22.04默认的Wayland会话下,root登录经常黑屏,所以上面先把Wayland禁用,改成Xorg会话再登录,实测成功率会高很多。
不过我从个人使用角度建议:桌面机上图形界面登录root意义不大,日常桌面操作sudo足够了,图形界面登录root反而会把家目录、浏览器配置、输入法全搞乱。真正需要root图形界面的场景,绝大多数是某个GUI管理工具要求root运行,这种情况开个终端sudo 应用名更简单。
3.2 SSH远程登录root的配置方法
服务器场景下,很多人希望直接通过SSH用root登录。默认情况下SSH服务端配置里PermitRootLogin是prohibit-password,意思是禁止密码登录root,但允许密钥登录。所以你会发现密码明明没错,SSH就是用不了root。
要改成允许密码登录root,编辑SSH配置文件:
sudo nano /etc/ssh/sshd_config找到PermitRootLogin这一行(22.04默认在配置文件里看不到这行,因为用的是默认值),改成:
PermitRootLogin yes然后重启SSH服务:
sudo systemctl restart sshd这里要强烈建议:如果是公网服务器,PermitRootLogin yes意味着root账号可以直接用密码暴力破解,非常危险。我更推荐的做法是改成prohibit-password(默认行为),然后用SSH密钥登录root。具体步骤是:生成本地密钥对,把公钥写入服务器root的~/.ssh/authorized_keys,再设置PermitRootLogin prohibit-password。
我自己管理的服务器就是这么做的:root密钥登录 + 密码登录关闭,效果很好。另外,sshd_config修改后一定要先执行sudo sshd -t检查配置语法,确认没问题再重启,否则配置写错了重启后你可能直接把自己锁在门外。
3.3 忘记root密码或进不了系统时的自救方法
忘记root密码很常见,尤其是不常用的服务器。如果系统还能用sudo,直接重新设置就行。但如果你连普通用户密码也忘了,或者系统启动后卡在登录进不去,这时候要用恢复模式重设密码。
Ubuntu 22.04在GRUB引导界面按住Shift键(或狂按Esc)进入GRUB菜单,选择“Advanced options for Ubuntu”,然后选择recovery mode那一项。进入恢复菜单后,选择root - Drop to root shell prompt,系统会给你一个root shell(无需密码)。然后执行:
mount -o remount,rw / passwd root第一行把根文件系统重新挂载为可写,否则你设密码时会报“只读文件系统”错误。第二行设置新的root密码。设置完重启即可。
如果GRUB菜单进不去或恢复模式都用不了,还有一个更底层的路子:在GRUB启动项上按e编辑,在Linux那一行末尾追加init=/bin/bash,然后按Ctrl+X或F10启动。这会把系统直接引导到一个bash shell,用root身份执行:
mount -o remount,rw / passwd root这个方法在虚拟机环境下特别常用。有热词提到“esxi虚拟机ubuntu忘记root密码 Ctrl+D输入不了”,说的就是这个场景——追加init=/bin/bash后系统会提示你输入root密码进入维护模式,如果root密码忘了就会一直Ctrl+D死循环。解决办法就是上面这套:直接在bash里用password命令重置密码,绕开维护模式的认证环节。
有一点要注意:这些方法只要能物理接触到机器就能改密码,所以物理安全同样重要。别觉得开了root就是万能钥匙,机器本体被拿走了什么都不安全。
4. 高频问题排查与避坑经验
4.1 SSH连不上的典型原因和处理顺序
启用root后SSH连接失败,是排查频率最高的问题。按下面顺序查,基本都能定位:
- 确认SSH服务在跑:
sudo systemctl status sshd。没装的话先sudo apt install openssh-server。 - 确认配置文件语法:
sudo sshd -t,有错误会直接打印出来。 - 确认PermitRootLogin配置生效:
sudo sshd -T | grep permitrootlogin。这个命令显示运行时实际生效的配置,不是文本文件里的内容。如果显示prohibit-password,说明你以为改好的配置没生效,原因可能是没重启服务或者配置文件改错位置了。 - 看端口是否被防火墙拦了:
sudo ufw status。UFW默认开启时22端口没放行,外部连不上。放行命令:sudo ufw allow OpenSSH。 - 最后看日志:
sudo tail -n 50 /var/log/auth.log,里面有Failed password for root或者Connection closed by authenticating user字样,能帮你判断是密码错、被拒绝还是IP被封。
遇到Connection reset by IP这类瞬间断连的报错,通常不是认证问题,而是SSH服务崩了或网络层面重置了连接。有个小技巧:改SSH配置时先开一个额外的会话保持连接,再动配置。改坏了还能用另一个会话回滚,避免把自己锁在外面。
4.2 sudoers文件损坏的自救方法
这个坑说大不大,说小能让你整台服务器瞬间失去管理权限。假设你手误把/etc/sudoers改坏了,执行任何sudo都会报parse error,连重命名文件都做不了。如果你还开着root的shell,可以直接改回去;但如果当前只有普通用户会话,就很尴尬。
自救方法还是走恢复模式:进recovery shell后用root权限执行visudo -c检查语法,然后visudo打开文件修正错误。没有恢复模式可用时,就用3.3节的init=/bin/bash大法进入bash shell,然后mount -o remount,rw /后手工修复/etc/sudoers。
这里要记住一条铁律:修改sudoers永远用visudo,不要用nano或vim直接改。visudo保存时会做语法校验并锁定文件防止并发写入,能拦截绝大多数手误。我有个同事当年直接vim /etc/sudoers,保存时少写了个括号,结果整台测试服务器的所有sudo全挂,最后只能重启进单用户模式救回来。
4.3 高频问题速查表
| 问题现象 | 根本原因 | 解决方案 |
|---|---|---|
su: Authentication failure | root未设密码或密码输错 | 执行sudo passwd root重新设置 |
| 图形界面登录root后黑屏/闪退 | Wayland会话与root不兼容 | 在/etc/gdm3/custom.conf禁用Wayland |
| SSH提示permission denied,密码正确 | PermitRootLogin是prohibit-password | 改成yes或用密钥登录 |
| 修改sshd_config后配置不生效 | 服务未重启或改错文件 | sudo sshd -t && sudo systemctl restart sshd |
sudo: /etc/sudoers is world writable | sudoers权限被改错 | chmod 440 /etc/sudoers并进恢复模式修复 |
| 开机后一直Ctrl+D循环 | init=/bin/bash维护模式 | 直接在这个shell里执行mount -o remount,rw /和passwd |
看到速查表里sudoers is world writable那条,顺带说一下:很多人改sudoers时用chmod 777图方便,这会直接触发sudo报错拒绝运行。sudoers文件的正确权限是440,属主root:root。如果已经改坏了,恢复模式下执行:
chown root:root /etc/sudoers chmod 440 /etc/sudoers这两个命令基本是救命的。
5. root账号的安全使用习惯与我的实操经验
5.1 安全基线:开了root别裸奔
启用root登录不是终点,安全配置才是关键。我总结了四条自己一直在用的基线策略:
- 限制root的SSH来源IP。在
/etc/ssh/sshd_config里加AllowUsers root@你的办公网IP,只允许特定IP登录root。不知道IP就加AllowUsers root@192.168.1.*之类网段。 - 公网服务器永远用密钥登录root,关闭root密码登录。对普通用户保持密码登录没问题,但root必须加密钥。
- 启用fail2ban防止暴力破解。
sudo apt install fail2ban后默认就能保护SSH,连续失败几次自动封IP。我实测配置简单的环境里,攻击日志能减少90%以上。 - root密码定期更换,不要和普通用户密码设置成一样的。
如果服务器被入侵了,第一件事就是查/var/log/auth.log和last命令看有没有陌生登录记录。有热词提到“更换root密码”,日常运维中怀疑密码泄露时,执行sudo passwd root换密码是最直接的止损操作。
5.2 我的真实体会:什么时候用root,什么时候回到sudo
这几年的运维经验让我总结出一句话:root是工具,不是身份。日常操作坚持用sudo,遇到需要连续执行多条高权限命令时再切root,执行完马上exit退回普通用户。这个习惯能在出问题时有效减少误操作范围。
有个很实用的折中方案:遇到一条命令需要root权限但又不确定会不会有风险,可以先sudo -i进入root shell,用history记录所有操作,出问题时能快速定位哪条命令导致故障。另外,如果经常要重复执行一堆root命令,别每次sudo,直接写成脚本,脚本里在关键步骤前后加日志,这样比切来切去安全得多。
最后再分享一个小技巧:Ubuntu 22.04里root密码策略其实默认是过期的,你在/etc/shadow里看到root行是root:$6$...:19000:0:99999:7:::,第三段字段如果小于当前日期对应的天数,系统会提示你修改密码。密码设置完如果长期不用root登录,这条链条也不会自己失效,但保持定期更新密码是个好习惯。这个字段格式以后有空可以单独写一篇,暂时只要记住别把root密码当摆设就行。