装完Ubuntu之后,很多人第一件事就是折腾root密码和SSH远程登录。尤其是习惯用CentOS或Windows服务器的人,刚上手Ubuntu会发现“怎么登录界面都没有root选项”,或者明明在服务器上设置了密码,本地用SSH还是连不进去。这篇文章就专门讲清楚Ubuntu下给root设置密码、开启SSH远程登录的完整流程,以及我把这些操作踩过的坑、查过的资料一并放进来,按步骤来基本能一次搞定。
先说清楚这个内容适合谁:刚装好Ubuntu(桌面版或服务器版)想获得root权限、想从Windows/Mac远程连到Linux环境的新手;也包括用VMware或Hyper-V装了虚拟机、需要从宿主机SSH进去传文件做实验的学生党。如果你已经在Ubuntu里能用sudo,但不知道root密码怎么设、SSH怎么开,那看这篇就够了。
1. 核心思路:为什么Ubuntu默认没有root密码
1.1 Ubuntu的sudo机制与默认root账户状态
Ubuntu从很早的版本开始就默认不允许直接用root登录图形界面,也不给root设置初始密码。它采用的方式是:安装系统时创建一个普通用户,并把这个用户加入sudo组。平时操作需要管理员权限时,用sudo加命令提权,提权时输入这个普通用户的密码。
这带来的结果是:root账户在系统里是存在的,但它的密码是锁定状态(/etc/shadow里密码字段为!),所以没法直接登录。很多刚从其他发行版转过来的人会一脸懵:我明明知道root是超级管理员,为什么在Ubuntu里不能像以前一样输入su -然后回车直接进root?
这个设计初衷是安全。让所有高权限操作都走sudo,系统会留下日志,出了问题能查到是哪个用户做了什么。而且普通用户密码和root密码分开,即使普通用户密码泄露,也只是拿到了一个“能临时提权”的账号,而不是永久的管理员权限。理解这一点之后,你去设置root密码时就不会奇怪“为什么还要单独设一次”。
1.2 设置root密码前要搞清的事
设置root密码之前,有几个关键点必须明确。
第一,sudo passwd root和passwd是两码事。普通用户执行passwd只能改自己的密码,root用户执行passwd 用户名可以改任意用户密码。给root设密码用的是前者:在普通用户终端里输入sudo passwd root,这时系统会让你先输当前用户的sudo密码,验证通过后再让你设置root的新密码。
第二,设了root密码之后,原来的普通用户和sudo机制并不会失效。你依然可以继续用sudo,也可以用su -切换到root。两个通道并存,不会冲突。
第三,如果之后你又想把root密码清空、恢复成锁定状态,可以用sudo passwd -l root。这个命令是锁定root密码,不是删除root账户。同理,解锁用sudo passwd -u root。很多人误以为“忘记root密码就只能重装系统”,其实解锁方式主要是进恢复模式,这个在后面会讲。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 为root账户设置密码:实操步骤
2.1 使用sudo passwd root直接设置
登录你安装Ubuntu时创建的普通用户,打开终端,输入:
bash复制sudo passwd root
系统会依次提示:
code复制[sudo] password for yourname:
New password:
Retype new password:
passwd: password updated successfully
第一行输入普通用户的登录密码,后面两行输入要给root设置的新密码。注意输入密码时终端不会显示任何字符,这是正常的,不是键盘坏了。
看到password updated successfully就是成功了。这时可以验证一下:
bash复制su -
输入刚设置的root密码,如果提示符变成了root@主机名:~#,说明root身份已经拿到。再执行whoami,输出root,完全没问题。
这里有个细节:如果你在安装Ubuntu时设置的是自动登录,那么可能不会马上出现“输入普通用户密码”的提示,而是直接执行后续流程。这取决于你的sudo配置,不影响结果。
2.2 密码设置要点与遗忘后的处理思路
设置root密码时,建议不要用太简单的密码。因为一旦你开启了SSH的root密码登录,这个密码就直接暴露在网络访问面前。最好是字母+数字+符号组合,至少12位以上,尤其是你的Ubuntu要连到公网或校园网时,暴力破解工具每天都在扫默认端口和弱口令。
如果root密码忘记了怎么办?很多人问是不是只能重装系统。其实不用。Ubuntu在启动时可以进恢复模式(recovery mode),在GRUB菜单里选择高级选项,进入recovery mode后选root,然后可以通过一系列操作重新设置密码。但这个流程在不同版本上略有差异,有的地方还需要处理只读文件系统挂载的问题,属于运维应急手段。
更推荐的做法是:如果你忘了root密码但普通用户还能登录,直接用sudo passwd root重新设置一遍就行。因为改root密码不需要知道旧密码,只要你有sudo权限就能重置。真正棘手的情况是普通用户密码也忘了,那才需要恢复模式,或者用Live CD挂载文件系统去改/etc/shadow,但这已经超出本文范畴了。
3. 安装并启用SSH服务
3.1 安装openssh-server
设置好root密码之后,接下来是SSH远程登录。很多Ubuntu桌面版默认并没有安装SSH服务端,只有SSH客户端。也就是说你能用ssh user@host去连别人,但别人连不进你的机器。先检查一下本地是否已经装了服务端:
bash复制systemctl status ssh
如果输出里有Active: active (running),说明服务已经在运行了。如果是Unit ssh.service could not be found,说明没装。这时执行安装:
bash复制sudo apt update
sudo apt install openssh-server -y
安装过程会拉取软件包,速度取决于网络环境。装完之后再执行:
bash复制systemctl status ssh
应该能看到服务已经启动,并且是开机自启用状态。
补充一句:openssh-server这个包在Ubuntu里会创建一个ssh.service服务,有些资料里写的是sshd命令,实际在Ubuntu 18.04以后的systemd服务文件里,服务名是ssh,不是sshd。你用systemctl status sshd会报错,这是一个很常见的坑。
3.2 启动服务、开放防火墙并验证状态
服务装好后,让它开机自启并立即启动:
bash复制sudo systemctl enable --now ssh
如果Ubuntu开启了ufw防火墙,需要放行SSH端口。默认SSH端口是22,执行:
bash复制sudo ufw allow OpenSSH
或者显式放行端口:
bash复制sudo ufw allow 22/tcp
然后查看防火墙状态:
bash复制sudo ufw status
如果是inactive,说明防火墙没开,那就不用管。如果是active,需要确认22端口是ALLOW状态。
验证SSH服务是否在监听端口,用这个命令:
bash复制sudo ss -tlnp | grep sshd
输出类似LISTEN 0 128 0.0.0.0:22 0.0.0.0:*,说明服务正运行在22端口。这里0.0.0.0:22表示监听所有网卡地址,包括局域网的IP。
4. 配置SSH允许root远程登录
4.1 修改sshd_config的关键参数
这一步是整个流程里最容易踩坑的地方。很多人在前几步做完之后,去客户端连接,结果发现本机其他用户能登录,root怎么都登不上去,报Permission denied。原因就是Ubuntu的SSH配置默认对root登录做了一定限制。
打开SSH配置文件:
bash复制sudo vim /etc/ssh/sshd_config
或者用nano:
bash复制sudo nano /etc/ssh/sshd_config
找到PermitRootLogin这一行。在较新的Ubuntu里,它默认可能是:
code复制PermitRootLogin prohibit-password
prohibit-password的意思是:允许root用密钥登录,但禁止root用密码登录。所以即便你已经在第2节里设置了root密码,直接用密码登录依然会被拒绝。如果你确实需要允许root密码登录,把这行改成:
code复制PermitRootLogin yes
如果文件里没有这一行,也可以自己追加。改完后保存退出,然后检查配置语法:
bash复制sudo sshd -t
没有输出说明语法没问题。重启SSH服务:
bash复制sudo systemctl restart ssh
再试一次连接,一般就能用root密码登进去了。
还有一个需要注意的地方:Ubuntu的SSH配置不止一个文件。sshd_config里开头会有Include /etc/ssh/sshd_config.d/*.conf这一行,一些云镜像或进阶配置会在/etc/ssh/sshd_config.d/目录下放额外配置,如果你在sshd_config里改了但没生效,检查一下这个目录下有没有更高优先级的配置覆盖了你的参数。尽量避免直接删掉系统自带的配置文件,正确的做法是修改主配置,或者在sshd_config.d里新写一个自定义conf文件来覆盖默认值。
4.2 安全建议:密钥登录替代密码登录
如果你不是只在局域网里临时用一下,而是想让Ubuntu长期对外提供服务,强烈建议不要用root密码登录。用密码登录的问题在于,只要端口暴露,你就在和全世界的扫描器赛跑。23端口扫掉,22端口照样天天被攻击,这是常态。
更稳妥的方式是用SSH密钥登录。在客户端机器上生成密钥对:
bash复制ssh-keygen -t ed25519 -C "your_comment"
然后把自己的公钥拷到Ubuntu上:
bash复制ssh-copy-id user@ubuntu_ip
如果你给authorized_keys指定的用户不是root,那root登录依旧要依赖密码。可以再把公钥单独加到root用户下。具体命令是先用普通用户登录,切换root,然后把公钥内容追加到/root/.ssh/authorized_keys里,设置好权限:
bash复制sudo su -
mkdir -p /root/.ssh
chmod 700 /root/.ssh
echo "你的公钥内容" >> /root/.ssh/authorized_keys
chmod 600 /root/.ssh/authorized_keys
之后把PermitRootLogin改成prohibit-password,甚至改成no(如果不需要root直接登录),然后重启SSH。这样即便有人猜到root密码(如果root有密码)也无法直接登录,因为密码登录通道被关掉了,只能凭密钥登录。
5. 从客户端连接Ubuntu:常见方式与实操排查
5.1 确认IP与网络模式(VMware桥接/NAT)
配置好后,从客户端连接前,需要在Ubuntu上确认自己的IP地址。终端执行:
bash复制ip addr show
或者旧一点的ifconfig(没有的话先装net-tools)。在一堆输出里找到inet 192.168.x.x或10.0.x.x这类地址,那就是这台Ubuntu的局域网IP。
如果你用的是VMware或VirtualBox,要注意网络模式。NAT模式下,宿主机和虚拟机之间能互通,但宿主机之外的设备访问不到虚拟机。如果只是从宿主机用SSH连虚拟机,NAT没问题;如果想在手机或另一台电脑上连接,需要改成桥接模式,并且和路由器之间能正常通信。每次虚拟机重启IP可能变化,建议在路由器里绑定MAC地址,或者直接给Ubuntu设置静态IP,不然每次都要重新查地址。
确认IP没问题后,在Windows上用PowerShell或CMD直接输入:
code复制ssh root@192.168.1.100
这里的root用你设置密码的用户名,192.168.1.100换成实际的IP。Mac和Linux直接用终端自带的ssh命令,不需要安装额外工具。如果你习惯用图形化客户端,Windows下也可以用MobaXterm、Xshell,Mac下用Termius,但就单次连接来说,系统自带的SSH客户端已经足够。
5.2 典型连接失败问题与排查速查表
我从自己经历和帮朋友看的问题里,整理了下面这些最常碰到的情况:
| 现象 | 可能原因 | 处理方式 |
|---|---|---|
| 连接超时 | SSH服务没启动、端口不对、防火墙挡了 | systemctl status ssh确认服务;sudo ufw allow OpenSSH放行;客户端确认端口是22 |
| 连接被拒绝(Connection refused) | SSH服务端没装或监听端口不对 | 安装openssh-server;检查ss -tlnp确认服务监听 |
| Permission denied (password) | root密码错,或者PermitRootLogin限制密码登录 | 重新sudo passwd root;检查sshd_config里PermitRootLogin是否改为yes |
| Permission denied (publickey) | 服务器要求密钥登录,但客户端没有对应密钥 | 把公钥加到authorized_keys,或用密码登录后配置密钥 |
| Host key verification failed | 远端系统重装过IP相同,客户端还保留旧的公钥 | 在客户端删除known_hosts里对应IP的那一行,或直接清空文件 |
| sshd_config改错导致服务起不来 | 配置语法错误 | 用sudo sshd -t检查,改回正确配置后重启服务 |
还有一个很隐蔽的坑:如果你改了SSH端口,比如从22改成2222,但在防火墙里只放行了22,连接会表现为超时或者连接被拒绝。改端口时记得同步调整ufw规则:
bash复制sudo ufw allow 2222/tcp
另外,如果你在sshd_config里设置了AllowUsers或AllowGroups,即使root密码正确,也可能因为不在允许列表里而登录失败。排查时留意这两条配置。
实际排查时,最有效的方式是看日志。在Ubuntu上执行:
bash复制sudo tail -f /var/log/auth.log
然后在客户端重新发起连接,终端会实时打印认证过程。比如看到了Failed password for root,就是密码不对;看到User root from 192.168.x.x not allowed,就是配置里限制了用户;看到Connection closed by authenticating user root,一般和密钥或PermitRootLogin有关。
5.3 Windows/VSCode等客户端连接的特殊处理
很多人在Windows上第一次用SSH连接Ubuntu时,会被known_hosts的权限问题卡住。如果之前用过系统自带的OpenSSH,可能会出现报错:Bad owner or permissions on C:\Users\你的名字\.ssh\config。这是Windows下目录权限检查比较严格导致的,解决方法是找到这个config文件,右键属性安全,把当前用户添加为所有者,并确保只有当前用户有完全控制权限。操作完之后再连接一般就好了。
如果你用VSCode连接远程服务器写代码,那就更实用。安装Remote-SSH插件后,在配置文件~/.ssh/config里写入:
code复制Host ubuntu-server
HostName 192.168.1.100
User root
Port 22
保存后,VSCode命令面板输入“Remote-SSH: Connect to Host”,选择ubuntu-server,就能打开远程目录。这样在Windows下编辑Ubuntu里的项目,体验和本地差别不大。
如果你还需要用root身份在远程执行一些需要sudo的命令,连接时直接用User root登录是省事,但安全上要谨慎。更推荐的做法是用普通用户登录,需要用root时再su -切换,这样至少不会把root密码暴露在传输层。
6. 实操中的一些经验与后续建议
说几个我自己踩过不少坑后总结的经验。第一点,改SSH配置之前,先备份原文件:
bash复制sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak
这样改错了还能快速还原。改完配置后不要直接断开当前连接,先再开一个SSH会话测试,确认新的会话能连上,再关掉旧的。如果新会话失败,旧会话还能救你。远程维护时尤其重要,不然配置一错,整个人被锁在外面,要跑到机房或重启进恢复模式才能解决。
第二点,root密码和SSH是否允许root登录是两件事。很多人以为给root设置了密码,SSH就可以用root密码登录了,结果发现不行,原因就在PermitRootLogin。如果你只想临时从本地终端切换root,不打算远程登录root,那这一步完全不用改,保持默认的prohibit-password甚至更安全。
第三点,如果是在云服务器上操作,一般云厂商的Ubuntu镜像在第一次创建时就会让你设置root密码,或者在控制台支持重置密码。但如果你把云镜像做成虚拟机再用,很可能又是默认无root密码的状态。方法都是一样的,用初始安装的普通用户执行sudo passwd root就能解决。
后续还可以做的事情包括:把SSH端口改成非默认值来减少扫描,但这只是增加一层障碍,不是根本解法,密钥认证才是更可靠的方向。另外,如果你需要在多台Ubuntu之间批量同步文件,可以顺手配置一下SSH密钥,然后用scp或rsync走SSH协议,传输过程也会加密,配合cron脚本做定时备份体验很好。
再推荐一个可以尝试的小技巧:如果实在不放心密码强度,可以使用fail2ban来监控SSH登录失败的IP。安装比较简单:
bash复制sudo apt install fail2ban -y
启动后它会自动读取SSH日志,在一段时间内连续失败多次的IP会被临时封禁。这个工具对减少暴力破解有明显效果,特别是你的Ubuntu暴露在公网环境时,装了之后日志会安静很多。
最后说点个人体会:Ubuntu的sudo机制一开始确实劝退了不少人,但用顺了之后你会发现它其实是保护你的一种方式。即使给root设置了密码,也不要所有操作都直接用root,日常维护保持普通用户身份,只有少数命令前面加sudo足够了。SSH远程登录虽然方便,但多一道密钥认证、多用一个小端口、多看几次auth.log,总能让这台机器活得久一点。
