在 Linux 中恢复对 Chmod 命令的可执行权限

我遇到了一个 有趣的讨论线程 在 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 中根据文件的权限查找文件
  • 如何复制文件并同时更改所有权、权限