1. 为什么飞牛 fnOS 默认不让你用 root 登录?
我第一次装好飞牛 fnOS,SSH 连上去的时候,输入账号密码,顺利登录。结果想在系统盘里敲个ls /看看分区挂载情况,直接提示权限不足,连/etc下的部分配置文件都看不了。当时第一反应:这系统怎么这么别扭,我明明是管理员啊。
后来冷静下来想了想,这是 Linux 类系统的常规设计,飞牛虽然做了不少界面化的工作,但底层依然是一套完整的 Debian/Linux 环境。默认情况下,SSH 服务(OpenSSH)的配置里就写着PermitRootLogin prohibit-password或者直接禁止 root 远程登录,同时普通用户默认也不在 root 组里。这么做的目的很直接:降低被暴力破解的风险。
你想啊,root 是系统里权限最高的账号,如果开着密码登录,黑客只要拿到一个密码字典,无限尝试 root 账号,真被撞库撞出来,整台机器就彻底沦陷了。所以 Debian 系和大多数 Linux 发行版都会默认关掉 root 的远程登录能力。飞牛作为一个面向普通用户的 NAS 系统,肯定不会把 root 直接亮出来,这也是对用户的一种保护。
但问题来了:日常运维的时候,改 Docker 配置、手动挂载存储、调整网络参数,这些操作没有 root 权限根本做不了。所以我们必须通过自己的普通账号,在 SSH 会话里"临时"切换到 root,完成管理操作。这就是标题里说的"ssh 登录后切换 root 用户"这件事的来源。
理解了这个设计逻辑,你就不会觉得别扭了。飞牛不是不让你用 root,而是不让你裸奔式地直接用 root。系统给你留了一条合规的路子,只是需要你在登录之后手动翻一下权限的开关。
2. 登录后最常用的切换方式:sudo su -
2.1 一条命令完成切换
常规的切换流程是这样:先用你自己的普通账号通过 SSH 登录飞牛,比如用户名叫admin,登录成功后执行:
sudo su -系统会让你输入当前用户(也就是 admin)的密码,确认之后,你就变成了 root。注意看命令行提示符的变化,会从类似admin@fnos:~$变成root@fnos:~#,结尾的符号从$变成#,这意味着你现在拥有系统中的最高权限。
这里解释一下sudo su -这条命令的原理,很多人只知道用,不知道为什么要这么写。
sudo:以超级用户权限执行后面跟着的命令。它需要用当前用户的密码来验证身份,前提是当前用户在 sudoers 配置里有授权(飞牛默认是给管理员账号开了这个权限的)。su:切换用户(switch user)命令,不带参数时默认切换到 root。-(横杠):表示同时切换到目标用户的环境变量,相当于重新登录了一次 root 用户。如果不加这个横杠,你会发现虽然身份变成了 root,但 PATH 环境变量还是之前的,执行某些命令时会提示command not found,比较坑。
所以完整的sudo su -意思是:用我的管理员权限,切换成 root,并且加载 root 的完整环境。这是最标准、最省事的切法。
2.2 为什么推荐用 sudo su - 而不是直接 su -
有人会问:那我直接执行su -然后输入 root 密码不也一样吗?
从结果上说,确实都能到 root 身份。但区别在于:sudo 需要的是你自己的密码,su 需要的是 root 账号的密码。
飞牛系统在安装的时候,虽然设置了一个管理员账号,但默认情况下不仅没有启用 root 密码,甚至可能把 root 密码锁住了。如果你直接执行su -,它会提示输入密码,你输管理员密码大概率是过不去的,因为 root 账号的密码根本还没设置或者被锁定。
如果你确实想给 root 设置一个密码,可以手动执行:
sudo passwd root之后再执行su -就能用自己的 root 密码登录了。但我个人不建议你这么做,原因后面会详细讲,尤其是当你开启了 SSH 密钥登录之后,密码验证本身就是一个潜在风险点。
2.3 日常使用中的小习惯:临时执行单条命令
其实很多场景下,你不需要完整地切换成 root,只需要用 sudo 执行某一条命令就行。比如查看系统日志:
sudo tail -f /var/log/syslog或者重启某个服务:
sudo systemctl restart nginx这样做的好处是,你不是一直以 root 身份待在系统里,就算命令敲错了,造成的影响范围也小。切换成 root 之后,整个人容易飘,手一抖把/etc下的文件改了,救都救不回来。我自己的习惯是:能用 sudo 单条执行的就用 sudo,必须连续多条命令操作时才sudo su -。
3. sudo 执行报错怎么办:排查 sudoers 配置
3.1 常见报错信息
不是所有人的飞牛都能顺利执行sudo su -。有些用户遇到的报错很典型:
admin is not in the sudoers file. This incident will be reported.翻译过来就是:当前用户不在 sudoers 文件里,没有使用 sudo 的资格。这个报错说明你的管理员账号虽然在飞牛的 Web 界面上看着是"管理员",但底层系统里它的用户组配置缺少了sudo组的归属。
还有一种情况是 SSH 登录的用户根本不是管理员,而是你后来自己创建的一个普通用户。飞牛在 Web 界面创建用户时,默认不会给 sudo 权限,所以你登录进去之后自然没法执行任何特权命令。
3.2 排查思路:确认用户所属组
遇到这种问题,不要慌。先确认当前登录的用户名:
whoami再看看它属于哪些用户组:
groups正常情况下,管理员账号的输出里应该包含sudo这个组。如果没有,说明你的账号没被正确加入 sudo 组,或者你登录的根本不是管理员账号。
补充一个背景知识:Debian 系统的 sudo 组名就是sudo,而 CentOS/RHEL 是wheel。飞牛基于 Debian,所以我们需要把用户加到sudo组,而不是 wheel。
3.3 解决方案:通过单用户模式或者 Web 端修复
如果你在 SSH 里发现用户没有 sudo 权限,但你还有飞牛 Web 管理页面的访问权限,那最简单的办法是去"设置 -> 用户管理"看看,有没有把当前账号的角色改成管理员。飞牛的 Web 界面里,管理员角色对应的就是系统 sudo 权限,改一下就能生效。
但如果你连 Web 端都进不去了,那就得用物理接触的方式修复。飞牛主机一般是插着显示器的,或者至少接了一个键盘。把机器重启,在引导界面(GRUB)出现时,选择高级选项进入恢复模式(recovery mode),然后选择 root 用户,进入一个无需密码的 root Shell(飞牛底层是 Debian,恢复模式默认有这个入口)。进去之后执行:
usermod -aG sudo admin把 admin 替换成你自己的用户名,然后重启,再用 SSH 登录,sudo 就能用了。
这个操作有一定门槛,但遇到问题的时候知道有这条路可走,比干着急强。我的建议是:装完飞牛的第一时间,就去确认一下自己的账号能不能 sudo,别等到要部署服务时才发现了,那时往往时间紧任务重,很容易慌。
4. 直接允许 root 账号 SSH 登录:改配置,也要改风险
4.1 如何修改 sshd_config
有些人就是不想每次登录都切一次 root,希望 SSH 连接上去直接就是 root,这也不是不可以,但需要动 OpenSSH 的配置文件。
先进 root:
sudo su -然后用编辑器打开 SSH 服务的主配置文件:
vim /etc/ssh/sshd_config找到这一行:
#PermitRootLogin prohibit-password注意,不同系统的默认值不太一样,有些是#PermitRootLogin yes,有些是#PermitRootLogin no。在 Debian 系的较新版本里,默认通常是有prohibit-password这个选项的,它的意思是:允许 root 通过密钥方式登录,但不允许 root 用密码登录。
如果你想彻底放开,改成:
PermitRootLogin yes保存退出。然后重启 SSH 服务让配置生效:
systemctl restart sshd或者:
systemctl restart ssh两边的服务名在飞牛上应该都兼容,建议用sshd,实在不行再看看ssh。
4.2 配置了还得有 root 密码
即使PermitRootLogin yes了,root 没有密码还是登录不了。这个时候你需要按前面说的那样设置一个 root 密码:
sudo passwd root设置完毕之后,再用 SSH 客户端连接,用户名输入 root,密码输入刚才设置的,就能直接以 root 身份登入。
4.3 为什么我不建议你长期开着密码登录
这里说点掏心窝的话。如果你只是在自己家里内网玩飞牛,不开端口映射、不搞公网访问,那开 root 密码登录影响不大,毕竟外网没人能摸到你的 SSH 端口。但如果你做了 DDNS、端口映射、IPv6 直连公网,那开着 root 密码 SSH 就是给自己埋雷。
原因很直白:公网上的扫描机器人是无差别攻击的,专门盯着 22 端口撞库。root 账号是它们的首要目标,如果 root 还开了密码登录,密码又不够复杂,被突破是迟早的事。
所以我的建议是:即使要开 root 登录,也最好配合密钥验证,同时把PermitRootLogin设置成prohibit-password,也就是:root 只能通过密钥登录,密码登录路径直接堵死。具体配置方法下一节详细讲。
5. 密钥登录的完整配置:跳过密码,直接以 root 身份进系统
5.1 先在客户端生成密钥对
SSH 密钥登录的原理,简单说就是:你自己电脑上存一把私钥,飞牛上存一把公钥,登录时用私钥证明"我是我",不需要输入密码。
以 Windows 为例,现在 Win10/11 自带 OpenSSH 客户端,可以直接在 PowerShell 或 CMD 里执行:
ssh-keygen -t ed25519 -C "fnos-root"当然用 RSA 也可以:ssh-keygen -t rsa -b 4096。我比较推荐 ed25519,密钥短、安全性高、生成也快。执行后一路回车到底,它会默认把私钥存在C:\Users\你的用户名\.ssh\id_ed25519,公钥是id_ed25519.pub。
如果你已经有一个正在使用的密钥对,那就不用重新生成,直接把公钥丢到飞牛上就行。
5.2 上传公钥到 root 的家目录
注意,这里有个容易踩的坑:root 用户的家目录是/root,不是/home/xxx。很多人习惯性地把公钥放到/home/admin/.ssh/authorized_keys,然后发现 root 登录不了,大概率就是这个原因。
先把当前用户的公钥放好,确保能正常登录。然后切到 root:
sudo su -创建 root 的 SSH 目录并设置权限:
mkdir -p /root/.ssh chmod 700 /root/.ssh再把你的公钥内容追加进去。如果你身边有 U 盘或者直接能复制公钥内容,可以这样:
echo "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAxxxxxxx 你的备注" >> /root/.ssh/authorized_keys注意这里用的是两个>,是追加而不是覆盖。如果你之前已经配置过公钥,千万别用一个>,否则会把之前的公钥全部清空。只有确保原来没有内容时,才可以用单个>。
设置文件权限:
chmod 600 /root/.ssh/authorized_keys这个权限很关键,OpenSSH 对authorized_keys文件的权限非常敏感,如果权限是 644,它会认为文件不够安全,直接拒绝密钥登录。
5.3 修改 PermitRootLogin 为密钥专用
在/etc/ssh/sshd_config里,把配置改成:
PermitRootLogin prohibit-password这个配置的含义是:root 登录时,只能使用密钥验证,密码验证一律拒绝。这样就算有人知道 root 密码,他也进不来,因为 SSH 服务压根不给他用密码的机会。
重启 SSH 服务:
systemctl restart sshd然后用你的 SSH 客户端,用户填 root,指定私钥文件进行连接。Windows 下用 PowerShell 的话:
ssh -i C:\Users\你的用户名\.ssh\id_ed25519 root@你的飞牛IP如果一切正常,直接就能登进去,不用输密码。
5.4 密钥登录排错:常见问题定位
密钥登录偶尔会抽风,最常见的就是提示:
Permission denied (publickey,password).遇到这个报错,按下面的顺序排查:
- 确认公钥确实追加到了
/root/.ssh/authorized_keys,不是/home/xxx/.ssh/authorized_keys。 - 确认
/root/.ssh目录权限是 700,/root/.ssh/authorized_keys文件权限是 600。 - 确认你 SSH 客户端里指定的用户名是
root,不是别的。 - 确认客户端用的是私钥,不是公钥。千万别把公钥内容粘贴到私钥文件输入框里。
- 如果还是不行,把 sshd 的日志打开看看。日志位置在
/var/log/auth.log,执行:
tail -f /var/log/auth.log再试着登录一次,看日志里报什么错。这一步几乎能定位到所有问题。
我遇到过最诡异的一次情况是,/root目录权限被改成了 775,导致 OpenSSH 拒绝公钥登录(它要求家目录不能对组和其他用户可写),最后用chmod 700 /root解决。这类隐藏条件很难第一时间想到,排错时要注意。
6. 切换 root 之后,能做什么、建议做什么
6.1 配合飞牛常用运维场景
飞牛 NAS 作为家庭媒体中心,最常折腾的几个方向,几乎都需要 root 权限:
手动挂载存储空间。飞牛 Web 界面能处理常规的硬盘挂载,但如果是 exFAT 分区、群晖旧硬盘或者做了 RAID 的阵列盘,Web 界面识别不了时,就得手动用
mount命令挂载。挂载的前提就是 root。热搜词里提到"飞牛nas 存储空间未挂载怎么回事",很多查不到原因的场景,用 root 直接看dmesg | tail就能看到内核拒绝挂载的具体原因,是文件系统不识别、还是硬盘有坏道,一目了然。部署 Docker 容器。飞牛内置了 Docker 管理界面,但你要做端口映射、修改 bridge 网络配置、映射 USB 设备进容器时,Web 界面不够用,必须命令行操作。比如部署 IPTV 相关的服务,经常需要把主机的某个网络接口直接映射给容器,这种操作只能通过 docker 命令在 root 下执行。
设置定时重启。飞牛自带的任务计划有限,如果你想让 NAS 凌晨定时重启,直接用 root 执行
crontab -e加一行配置,比 Web 界面灵活得多。比如:
0 4 * * * /sbin/reboot意思是每天凌晨四点重启。热搜词里有人问"飞牛官nas 定时重启",用crontab就是最直接的办法,而且写进系统任务后不受 Web 界面重启影响。
- 修改系统服务参数。比如调整 Samba 全局配置、给网卡设置静态路由,这些虽然不一定要 root,但没 root 你连配置文件都打不开,更别提验证格式了。
6.2 日常维护建议:用 root 但不长时间留 root
我的使用习惯是:SSH 登录之后,依然用普通用户身份操作,偶尔需要执行特权命令时才 sudo。只有在需要连续操作一堆系统文件时,才sudo su -切成 root,操作完马上exit退回普通用户。
这样做的原因很简单:root 拥有对系统的完全控制权,你一个不小心输错命令,比如:
rm -rf /var /www这行命令如果以普通用户身份执行,会提示权限不足,救你一命。但如果是 root,它真的会开始删除/var下的所有内容,等你想起来要停的时候,系统已经差不多凉了。权限是一把双刃剑,用的时候要克制。
另外,root 的状态下 Shell 的提示符是#,普通用户是$,这个小细节多看一眼,可以避免在错误的环境里执行危险命令。
6.3 root 密码忘掉之后的急救办法
用了 root 一段时间,忘记密码的事情太常见了。飞牛毕竟是家里的 NAS,一年到头才动一次控制台,记不住很正常。
如果 Web 界面还能登录,其实你不一定需要找回 root 密码,直接在 Web 界面的设置里,通常有重置管理员密码或者用户管理的入口,可以把当前管理员账号重新设密。而 root 本身的密码,即使忘了,只要你的管理员账号能 sudo,重新执行一次:
sudo passwd root就能重置。
如果连 Web 界面和 SSH 都进不去了,那就只能物理接触飞牛主机,进 GRUB 恢复模式,跟前面讲的一样,用那个临时 root Shell 重新设置密码。这个方案是我在实际操作里验证过的,恢复模式下的 shell 不要求输入密码,直接能用。
6.4 给飞牛新用户的一张速查表
为了方便使用,我把 SSH 登录和 root 切换相关的常见命令整理了一个速查表:
| 目的 | 命令 |
|---|---|
| 普通用户登录后切 root | sudo su - |
| 直接执行一条特权命令 | sudo systemctl restart sshd |
| 设置/重置 root 密码 | sudo passwd root |
| 查看当前用户 | whoami |
| 查看用户所属组 | groups |
| 查看 SSH 服务状态 | sudo systemctl status sshd |
| 查看登录失败日志 | sudo tail -f /var/log/auth.log |
| 手动挂载硬盘 | sudo mount /dev/sdb1 /mnt/disk2 |
| 查看系统日志 | sudo journalctl -xe |
这里多说一句,飞牛系统毕竟是面向家庭用户的 NAS 系统,Web 界面能解决 90% 的需求。SSH 进入 root 是给折腾党准备的补充手段,不是为了甩开图形界面不用,而是在图形界面搞不定的时候有一把兜底的钥匙。
我自己用飞牛这段时间,最大的体会是:它把 Linux 系统的底层能力打包成了一个轻量 NAS 界面,但当你 SSH 进去之后,天地立刻就大了。理解了登录和切换 root 这套逻辑,你后续做任何高权限操作都会顺手很多——部署媒体服务、挂载复杂文件系统、调试网络、甚至玩旁路由,都有了入门的基础。
希望这篇经验能帮你少走我踩过的弯路。如果你是按 SSH 密钥方式做的配置,后续稳定性会高非常多;如果还是用密码,那就尽量保证密码强度足够,别在其他设备上泄露。折腾 NAS 是个持续更新的过程,以后遇到新问题再聊。