我遇到了一个 有趣的讨论线程 在 Twitter. 这是关于一个面试问题。 问题是 – 如果不小心删除了chmod命令的可执行权限怎么办? 如您所知,chmod(代表 通道天使 模组e) 命令用于设置或更改类 Unix 系统中文件或目录的访问权限。 所以如果 chmod 的可执行权限被删除,就不能将权限分配给任何程序,包括 chmod 命令本身。 你坐在面试小组中,面试官刚刚问了这个问题。 那么,如何在 Linux 中恢复 chmod 命令的可执行权限呢?
“我会从其他系统复制 chmod 二进制文件吗?”,你可能会回答。 好吧,你只得到一个系统。 所以你不能从其他系统复制 chmod 二进制文件。 你可以再回复一次, “我将从 perl 设置执行位。”。 面试官说“你的机器上没有翻译。”。 也没有互联网/电话连接,因此您也无法联系任何人寻求帮助。 在这种可怕的情况下,如何恢复 chmod 命令的可执行权限? 如果您已经知道答案,请为您的智慧竖起大拇指。 如果您不是批判性思考者(像我一样!),请继续阅读。
警告:
请不要尝试在生产系统中删除 chmod 命令的执行权限。 在虚拟机或测试机器上试试这个。 这只是为了教育目的。
不小心删除了chmod命令的可执行权限怎么办?
假设您不小心运行了以下命令:
# chmod -x $(which chmod)
在这里, -X flag 将删除给定程序的可执行权限。 在我们的例子中,它是 chmod。
你很好奇,你真的不知道这个命令会做什么。 现在你失去了 chmod 命令的可执行权限。 无法再次恢复 chmod 可执行权限。 如果您尝试设置权限,请使用以下命令:
# chmod +x $(which chmod)
您将收到以下错误消息:
bash: /usr/bin/chmod: Permission denied
即使您注销并尝试从其他 sudo 用户,您不能使用 chmod 命令分配权限:
$ sudo chmod +x $(which chmod) sudo: chmod: command not found
如何将 chmod 权限恢复为原始权限? 嗯,这比你想象的要容易。
在 Linux 中恢复对 Chmod 命令的可执行权限
有几种方法可以恢复 chmod 的执行权限。 在这里,我给出了 7 种方法。
方法 1 – 将 chmod 二进制文件的内容复制到其他工作二进制文件
请记住,我们只删除了 chmod 命令的可执行权限,而没有删除其他命令的权限。 对? 是的! 其他命令仍然具有可执行权限。 因此,我们可以通过将 chmod 命令的内容复制到任何其他可执行命令来解决此问题,例如 example “mkdir”,并将 chmod 可执行权限恢复为原始权限。
在复制之前,让我们使用命令备份 mkdir 命令:
# cp /usr/bin/mkdir /usr/bin/mkdir.bak
接下来使用“cat”命令将 /usr/bin/chmod 的内容复制到 /usr/chmod/mkdir:
# cat /usr/bin/chmod > /usr/bin/mkdir
现在,mkdir 命令变成了 chmod 命令(因为我们将 chmod 的内容复制到了 mkdir 二进制文件)。
然后,使用命令恢复实际 chmod 二进制文件的可执行权限:
# mkdir +x /usr/bin/chmod
或者,您可以将 mkdir 的内容复制回 chmod 二进制文件:
# mv /usr/bin/mkdir /usr/bin/chmod
最后,从备份中恢复原来的 mkdir 命令:
# mv /usr/bin/mkdir.bak /usr/bin/mkdir
完毕! 我们成功恢复了 chmod 命令的执行权限。
检查是否使用“ls”命令恢复了可执行权限:
# ls -l /usr/bin/chmod
或者,
# ls -l $(which chmod) -r-xr-xr-x 1 root root 63864 May 27 07:16 /usr/bin/chmod
注意上面输出中的字母“x”。 表示执行权限。
您还可以通过使用 chmod 为任何其他程序分配可执行权限来验证它,如下所示:
# chmod +x ostechnix.sh
# ls -l total 0 -rwxr-xr-x 1 root root 0 May 27 07:43 ostechnix.sh
这是最简单的方法,因为您无需记住任何内容。 我们只是简单地使用 cat 命令将 chmod 的内容复制到其他命令中,然后恢复执行权限。
我在 Ubuntu 20.04 服务器版中对其进行了测试。 在其他 Linux 发行版中,chmod 二进制文件可能在 /斌/ 目录。 您可以使用以下命令找到 chmod 二进制位置:
$ which chmod
然而,这不仅是一种方式。 我做了一个快速的谷歌搜索,发现了更多的方法。 您可能需要记住以下命令。
方法 2 – 使用 cp 命令
这是另一种恢复 chmod 可执行权限的方法。
在这种方法中,我们使用“cp”命令来复制属性:
# cp --attributes-only --preserve=mode /proc/self/exe /usr/bin/chmod
方法 3 – 使用 GNU 链接器/加载器 (ld)
在这种方法中,您可以直接运行“ld”加载程序,并将您想要运行的命令传递给它,如下所示:
# /lib64/ld-linux-x86-64.so.2 /usr/bin/chmod +x /usr/bin/chmod
如果您使用 32 位系统,则命令为:
$ /lib/ld-linux.so /usr/bin/chmod +x /usr/bin/chmod
加载程序的路径可能很大程度上取决于您使用的 Linux 发行版。 以上命令适用于 Ubuntu 及其衍生产品。 在其他发行版中,路径可能不同:
# /lib/libc.musl-x86_64.so.1 /bin/chmod +x /bin/chmod
方法 4 – 使用 setfacl
我们可以使用“setfacl”命令恢复 chmod 可执行权限。
首先,为具有读取和执行权限的用户修改 chmod 二进制文件的 ACL:
# setfacl -m u::rx /usr/bin/chmod
然后,将 chmod 权限恢复为原始权限:
# chmod +x $(which chmod)
最后,删除 chmod 的所有 ACL 条目。 这是可选的。
# setfacl -b /usr/bin/chmod
如果 setfacl 命令不可用,请安装“acl”包。 为了 example,运行以下命令在 Debian、Ubuntu 及其衍生产品上安装 acl:
# apt install acl
方法 5 – 使用 rsync
Rsync 不仅仅用于在系统之间复制或备份文件和目录。 它也可用于为文件分配权限。
首先,让我们将 chmod 二进制文件复制到 /tmp 位置,同时为所有人(即用户、组和其他人)分配可执行权限:
# rsync /usr/bin/chmod /tmp/chmod --chmod=ugo+x
接下来,检查是否将可执行权限分配给 chmod:
$ ls -l /tmp/chmod
样本输出:
-r-xr-xr-x 1 root root 63864 May 27 10:01 /tmp/chmod
如果权限正常,只需使用 /tmp/chmod 文件覆盖原始文件:
# mv /tmp/chmod /usr/bin
方法 6 – 使用 Busybox
最近的一些 Linux 发行版具有 “忙箱” 默认安装。 在 Busybox 手册页中,
BusyBox 将许多常见 UNIX 实用程序的微小版本组合成一个小型可执行文件。 它为您通常在 GNU coreutils、util-linux 等中找到的大多数实用程序提供了极简替代品。BusyBox 中的实用程序通常比它们功能齐全的 GNU 表亲具有更少的选项; 但是,包含的选项提供了预期的功能,并且其行为与 GNU 对应项非常相似。
要使用 busybox 恢复 Chmod 执行权限,请运行:
# busybox chmod +x /usr/bin/chmod
方法 7 – 使用 Perl
万一 Perl 在您的系统上可用,您可以使用以下命令修复 Chmod 的执行权限:
# perl -e 'chmod 0755, "/usr/bin/chmod"'
如您所见,这是一个小问题,聪明的 Linux 用户可以轻松解决。 如果您是新手或中级 Linux 用户,您可能永远也弄不明白。 可能会问这类问题来检查受访者的精神状态以及他如何开箱即用。 感谢前面提到的 Twitter 线程,我今天学到了一些有用的东西。 希望它对你也有用。
相关阅读:
- 如何在 Linux 中根据文件的权限查找文件
- 如何复制文件并同时更改所有权、权限