# 记一次 Linux 服务器误操作与抢救历程

原文：https://blog.grtsinry43.com/moments/2025/03/16/linux-chown-restore/

作者：grtsinry43

发布时间：2025-03-15T16:54:49Z

内容更新时间：2025-03-15T16:54:49Z

今天，我不知怎么操作...把 `/usr` 目录的所有者改成 www 用户和 www 用户组了，然后就...

```shell
sudo: /usr/bin/sudo must be owned by uid 0 and have the setuid bit set
```

## 起因

其实，我就在 **一个项目的目录** 执行了 `sudo chown -R www *`，但是，莫名其妙的...整个 `/usr` 目录就全部归属了 www: www 的权限，emm...我甚至都不知道问题怎么出来的，但是这个时候还是要保持冷静，分析一下当前的情况：

1. sudo 无法使用，root 用户未设置过密码，无法登录
2. 系统部分命令二进制文件会因为权限问题出错，不过链接 `/bin` 中的核心命令安全
3. 我们有对主机（服务器）的物理访问权限
4. Ubuntu Server 内置了 recovery mode

如何恢复系统的正常使用？

## 抢救

emm...linux 嘛，~~（按我总救挂了的 Arch 来说）~~ 只要不 rm 都能救回来的，我们首先拿回 sudo 再说

我们重启时候，等待开机时候长按 shift 呼出 grub 高级选项（远程服务器也可以直接 vnc 连接上去），选择 `recovery mode`，等待开机日志之后就可以选择 root 模式进入，这里我们有了 root 就安全啦

![image](https://blog.grtsinry43.com/uploads/2025/03/16/image.png_974ef7fd-8910-448c-9dc9-0518742ddf03.png)

思路就是我们可以借助包管理器覆盖安装，将会重写软件的执行文件和安装目录的权限

我们首先用 root 权限覆盖之前所有的更改：

```shell
chown -R root:root /usr
```

可以参考正确的权限：

![image](https://blog.grtsinry43.com/uploads/2025/03/16/image.png_a6503da7-3a1c-40fc-a7ea-3233b4405acf.png)

然后我们先救 sudo，之后在 ssh 上慢慢操作，

```shell
apt install sudo --reinstall
```

![image](https://blog.grtsinry43.com/uploads/2025/03/16/image.png_5e859d67-439e-4581-9db3-e55144435d41.png)

终于回来了，现在拿到了 sudo 只要慢慢解决就好了

离开之前可以为 root 设置下密码以防万一

```shell
passwd root
```

## 解决

有了权限，我们就要慢慢解决问题了

首先可以尝试修复损坏和依赖有问题的包：

```shell
sudo apt update --fix-missing
sudo apt update --fix-broken
sudo apt install -f
```

还记得我们之前的想法是覆盖所有包吗，这类操作的思路都是获取已经安装的软件包列表，通过管道符重新传进入并覆盖安装

```shell
dpkg --get-selections | grep -v deinstall | awk '{print $1}' > packages.txt
sudo apt install --reinstall $(cat packages.txt)
```

注意这里可能会出现 Conflicts，比如这里我因为 n 卡的驱动冲突，这里不能正常安装，那就先把 n 卡驱动删掉，反正服务器上这个影响不是很大，救活要紧，总之经过漫长的等待之后...大概会装几百到一千个包，然后你的 `/usr` 就满血复活了。

![image](https://blog.grtsinry43.com/uploads/2025/03/16/image.png_69e20b34-65d1-4a7f-a541-9447420031f4.png)

## 其他提醒

为了避免类似问题再次发生，建议：

- 在执行 `chown` 或 `chmod` 命令时，确保你明确知道自己在做什么，尤其是在使用 `-R` 递归选项时。
- 定期备份重要数据和系统配置文件。
- 确保 root 用户设置了密码，以便在紧急情况下可以使用 `su` 切换到 root 用户。

## 总结

好吧，吃一堑长一智，说实在的...我到现在也没明白到底怎么造成的，usr这个路径都没输入过。

不过还好面临这个问题我没有慌，还是表面云淡风轻内心其实也很麻木地解决了这个问题，~~（毕竟救过很多次Arch了）~~

就这样，希望没有下一次了...
