我正在运行 Ubuntu 20.04.5 LTS,但我搞砸了chmod -R
命令!
我在运行 chmod 时输错了目录,而不是chmod -R +x ./etc
写了chmod -R +x /etc
.
所以现在 /etc 中的所有内容以及每个子文件夹和文件都具有 +x 权限。
我能够通过从 /etc/ssh 中删除 x 权限来修复与服务器的 SSH 连接,到目前为止其他服务似乎运行良好,但迟早某些其他服务会因此而失败,我想防止那。知道该怎么做才能尽快修复它吗?
答案1
根据我的经验,最好的处理权限问题的方法是从备份重新安装。
至少,如果没有备份,我们可能只能对哪些文件应该具有哪些权限做出最好的猜测。
话虽这么说,在探索我的系统之后,我想我已经找到了一个非常好的最佳猜测,您可以使用它作为开始。
考虑使用当前权限对当前 /etc 进行备份,以防出现问题。
sudo cp -R /etc /etc.bak
首先,我将获取 /etc 下所有文件的列表
sudo find /etc -type f > allfiles.txt
我最好的猜测:任何带有“shebang”的东西都是可执行脚本,并且应该保持可执行状态
sudo find /etc -type f -exec grep --files-with-matches --binary-files=without-match '#!' {} + > shebang.txt
现在,我需要找到 /etc 中但不包含 shebang 的文件列表。我们可以通过运行来做到这一点
cat allfiles.txt shebang.txt | sort | uniq -u > nonexecutable.txt
此时进行完整性检查并查看每个文件中有多少行。
wc -l *.txt
就我而言,etc 中有大约 4000 个文件的列表,大约 125 个包含 shebangs,nonexecutable.txt 中有大约 3900 个文件
如果您对计数感到满意(如果没有备份进行比较,很难判断),您最终可以修改所有不可执行文件以删除可执行位。
cat allfiles.txt shebang.txt | sort | uniq -u | xargs -n1 chmod -x
xargs 获取不可执行文件的列表,将它们一一分解(使用标志-n1
),并将每个文件传递给命令chmod -x
已知问题:
1. 我在 /etc 中有一个可执行文件没有被此方法捕获。由于某种原因,我的 /etc 中有一个可执行文件 returned 不包含 shebang。
在运行其他所有命令后,修复此问题的命令是
find /etc -iname 'resolved' -exec chmod +x {} +
但我无法判断您在权限更改之前可能拥有哪些其他可执行文件。
2.我不知道如何修复目录权限。有些目录不是世界可读的,并且不应该具有可执行位。希望这些目录下的敏感文件已禁用读取权限。
3. shebang 搜索不会捕获二进制可执行文件。我在 /etc 目录中没有看到任何二进制可执行文件,因此这可能风险较低。
4. 我的系统上有几个带有 shebangs 的文件无法执行。这包括几个 ufw .init 脚本。
以下是我发现的一些可执行文件的概述。我想这些都是在寻找shebang时发现的。
- /etc/init.d 下的所有文件
- /etc/kernel 下的所有文件
- /etc/update-motd.d 下的所有文件
- /etc/pm/sleep.d下的所有文件
- /etc/grub.d 下的大多数文件(README 除外)
- /etc/cron.* 下的大多数文件(cron.d 目录除外)
- /etc/console-setup/*.sh
- /etc/X11/Xsession
- /etc/X11/Xreset
答案2
如果备份(或快照)可用,我会从中恢复。如果由于某种原因检查点不可用,那么您可以尝试以下操作
$ aptitude --reinstall install '~i'
这将重新安装已安装的软件包并将其权限重置为默认值。
答案3
没有办法恢复chmod
或为了争论,任何其他命令,因为没有保存所做的一切记录。人们能做的最好的事情就是“跟踪 chmod 命令并将其附加到一个文件中,并查找每个目录、文件以及受该命令影响的任何其他内容的先前和当前模式,但可能有大约七个人在世界上谁愿意经历这种单调乏味。
在这种情况下,最好的办法是从备份中恢复,并且假设备份存在。如果没有,最好重新安装操作系统。人们可以从 Live CD 或 Live USB 复制所有内容,但这只会影响上述媒体上的内容,而不会考虑安装后所做的更改。可以研究现有所有内容的权限并将其设置为正常状态,但重新安装操作系统和其他包含数据的软件所花费的时间/etc
比前者要少得多。任何其他方法都需要大量猜测,由于我给出的原因,这是不可行的。
答案4
如果服务器不是公共服务器,我认为最好复制你的数据“备份”并重新安装Ubuntu。否则你可以尝试使用一些命令来纠正权限。但我永远不会像以前那样了。 root 用户应该是数据的所有者,并且由于众所周知,服务器上的大多数文件应具有 644 权限,而目录应具有 755 权限,因此我建议按照 ubuntu wiki 中的讨论进行以下操作:
$ sudo su
______________
chown -R root:root /etc # this will chnage the owner to root
__________________
find /etc -type f -exec chmod 644 {} + # this will search all exec files and change the permisson to 644
______________________
find /etc -type d -exec chmod 755 {} + # this will search all exec dirs and change the permisson to 755
__________________
chmod 755 /etc/init.d/* /etc/rc.local /etc/network/* /etc/cron.*/*
_____________________
chmod 400 /etc/ssh/ssh*key