运行“chmod 222 /bin/chmod”后如何修复“chmod”权限?

运行“chmod 222 /bin/chmod”后如何修复“chmod”权限?

我跑步是chmod 222 /bin/chmod为了了解更多chmod。之后,当我跑步时/bin/chmod,我得到了permission denied

我尝试将 的权限改chmod755,但是没有效果。

有人知道如何解决此问题吗?

答案1

您使之chmod不可执行。

有三个(不,实际上是四个)选项可以恢复这种情况:

  1. 重新安装coreutils软件包,如Artur Meinild 的回答

  2. 我喜欢的解决方案:

    • 从安装介质启动并开始实时 Ubuntu 会话。

    • 启动磁盘应用程序,找到 Ubuntu 安装所在的分区并挂载它。记下分区挂载的路径(类似于/media/username/somename)。

    • 打开终端并运行:

      sudo chmod 755 /media/username/somename/usr/bin/chmod
      
    • 卸载分区,关闭实时会话并从正常安装中重新启动。

  3. 执行此操作时请务必小心!运行以下命令:

    sudo cp -p /usr/bin/ls /tmp/chmod
    sudo cp /usr/bin/chmod /tmp/chmod
    sudo /tmp/chmod 755 /usr/bin/chmod
    

    解释:首先,我们将另一个仍可执行的文件(我选择了/usr/bin/ls)复制到/tmp/chmod。通过使用命令-p的参数cp,我们保留了权限,因此我们确保生成的文件也是可执行的。

    接下来,我们/tmp/chmod用实际的内容覆盖刚刚创建的文件/usr/bin/chmod,但是没有保留权限。 的内容/tmp/chmod将被实际的 覆盖chmod,但仍可执行。

    所以我们可以用来/tmp/chmod恢复实际的权限/usr/bin/chmod

    或者,我们可以删除/tmp/chmod不再需要的,但这不是必需的;下次系统启动时,/tmp目录无论如何都会被清除。

  4. 您可以使用任何支持chmod()系统调用的编程语言。由于 Ubuntu 默认包含 Python 解释器,因此使用 Python 可能是最简单的方法:

    sudo python3 -c 'import os; os.chmod("/usr/bin/chmod", 0755)'
    

答案2

dpkg-statoverride

dpkg-statoverride在 Ubuntu 上默认可用...其主要目的是覆盖文件的所有权和模式...您可以像这样使用它:

sudo dpkg-statoverride --update --add root root 755 /bin/chmod

rsync

rsync在 Ubuntu 上默认可用...在--archive, -a模式下,它应该只设置权限(因为文件永远不会改变)...即像这样一次性使用:

sudo rsync -a --chmod=755 /bin/chmod /bin/chmod

使用install命令

还有另一个实用程序叫做installGNU 核心实用程序以及默认情况下应在系统上可用的...它主要用于复制刚编译的文件并使其可执行,即安装它们,因此得名...它应该rwxr-xr-x默认为复制的文件提供权限...它还可以-m选择动态更改该文件的权限(但在这种情况下你可能不需要这个选项,因为默认设置就足够了),但你始终可以这样做:

sudo install -m +x /bin/chmod mychmod

然后,您只需执行以下操作即可:

sudo ./mychmod 755 /bin/chmod

使用动态链接器/加载器

另一个简单的解决方案是使用动态链接器/加载器本身...这是一种运行二进制文件的特殊方式,因为它不需要权限(这有点类似于运行一个不可执行的 shell 脚本,将其作为参数传递给/bin/sh例如)...根据您二进制文件编译的体系结构,您很可能想要使用变amd64体...在您的系统上找到它的名称和路径,例如:

$ dpkg -S 'ld-linux*'
manpages: /usr/share/man/man8/ld-linux.8.gz
manpages: /usr/share/man/man8/ld-linux.so.8.gz
libc6:amd64: /lib64/ld-linux-x86-64.so.2
libc6:i386: /lib/i386-linux-gnu/ld-linux.so.2
libc6-i386: /lib32/ld-linux.so.2
libc6:i386: /lib/ld-linux.so.2
libc6:amd64: /lib/x86_64-linux-gnu/ld-linux-x86-64.so.2

然后,只需像这样一次性使用它:

sudo /lib64/ld-linux-x86-64.so.2 /bin/chmod 755 /bin/chmod

别的 ...

在您的系统中搜索其他可以更改/设置文件权限的实用程序...一种方法是使用例如搜索手册man -K "chmod"...以下是我在系统上找到的一些内容:

chacl更改文件或目录的访问控制列表):

sudo chacl u::rwx,g::r-x,o::r-x /bin/chmod

bwrap容器设置实用程序):

sudo bwrap --die-with-parent --bind / / --chmod 755 /bin/chmod -- /bin/true

答案3

你做了最明显的事情之一绝不处理chmod- 你将chmod其自身更改为不可执行。即使是意志的力量也无法sudo使此命令再次起作用(以其当前形式 - 但请参阅其他答案)。

使其再次运行的一种方法是使用以下命令重新安装 GNU coreutils 包:

sudo apt install --reinstall coreutils

一个通用提示(对于 Linux 实用程序尤其重要):当学习某件事时,第一的了解每个命令的作用,第二在隔离环境(容器/虚拟机)中尝试一些东西,并且只在那之后您是否应该在生产系统上运行命令。

答案4

通过动态tar模式更改(#符号表示该命令应以 root 身份运行):

# cd /bin
# tar -mode 755 -cf chmod.tar chmod
# tar -xf chmod.tar

旧答案hexedit

# cd /bin
# tar -cf chmod.tar chmod
# hexedit chmod.tar

修复 tarball 中的权限;它是0000222;将其更改为0000755。然后运行:

# tar -xf chmod.tar

相关内容