在Linux中还原Chmod命令的可执行权限

时间:2020-03-21 11:46:51  来源:igfitidea点击:

如果我们不小心删除了Chmod命令的可执行权限,我们会怎么做?

让我们说你意外运行以下命令:

# chmod -x $(which chmod)

其中-X标志将删除给定程序的可执行许可。
在我们的情况下,它是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命令的内容复制到任何其他可执行命令,例如"mkdir",并将CHMod可执行权限还原回其原件来修复此问题。

在复制之前,让我们使用命令备份mkdir命令:

# cp /usr/bin/mkdir /usr/bin/mkdir.bak

接下来使用"cat"命令将/usr/bin/chmod的内容复制/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 Jan 27 07:16 /usr/bin/chmod

请注意上述输出中的字母"x"。
它表示执行权限。

我们还可以通过将可执行权限分配给具有以下内容的CHMOD的任何其他程序来验证:

# chmod +x theitroad.sh
# ls -l
total 0
-rwxr-xr-x 1 root root 0 Jan 27 07:43 theitroad.sh

这是最简单的方法,因为我们不必记住任何内容。
我们只使用CAT命令将CHMOD的内容复制到其他命令,然后恢复执行权限。

我在Ubuntu 20.04服务器版中测试了它。
在其他Linux发行版中,CHMod二进制文件可以在/bin /目录下可用。
我们可以使用以下命令找到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"包。
例如,运行以下命令以在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 Jan 27 10:01 /tmp/chmod

如果权限可以确定,只需用/tmp/chmod文件覆盖原始文件:

# mv /tmp/chmod /usr/bin

方法6 - 使用BusyBox

最近的一些Linux发行版默认安装了"BusyBox"。
从BusyBox手册页,

BusyBox将许多常见UNIX实用程序的微小版本组合成一个小型可执行文件。
它为我们通常在GNU Coreutils,Util-Linux等中找到的大多数公用设施提供最少的替代品。
Busybox中的实用程序通常具有比其全功能GNU表兄弟更少的选项;但是,包括的选项提供了预期的功能,并表现得非常类似于他们的GNU对应物。

要恢复Chmod执行BusyBox的权限,运行:

# busybox chmod +x /usr/bin/chmod

方法7 - 使用Perl

只需在系统上使用Perl,我们可以使用命令修复Chmod的执行权限:

# perl -e 'chmod 0755, "/usr/bin/chmod"'