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

Cha*_*ard 24 permissions command-line bash chmod gnu

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

我尝试将 的权限更改chmod为 back 755,但不起作用。

有人有关于如何解决这个问题的提示吗?

raj*_*raj 45

你使chmod不可执行。

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

  1. 重新安装该软件包,如Artur Meinild 的回答coreutils中所述。

  2. 我的首选解决方案:

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

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

    • 打开终端并运行:

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

  3. 这样做时要非常小心!运行以下命令:

    sudo cp -p /usr/bin/ls /tmp/chmod
    sudo cp /usr/bin/chmod /tmp/chmod
    sudo /tmp/chmod 755 /usr/bin/chmod
    
    Run Code Online (Sandbox Code Playgroud)

    说明:首先,我们将另一个仍然可执行的文件(我选择/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)'
    
    Run Code Online (Sandbox Code Playgroud)

  • 选项 4 非常简单,有几种语言可能可用:python、perl、php。 (17认同)
  • 为什么 2 是您的首选解决方案?其他的似乎更容易。 (4认同)
  • +1提及我最喜欢的聪明解决方案:使用“cp”仅复制具有适当权限的不同二进制文件并覆盖它 (2认同)
  • @AugustJanse我只是认为这是解决此类问题的“正确”或“规范”(与公司名称无关;))的方法。第一个是矫枉过正,另外两个有点“hackish”。正如上面评论中提到的,这种方法通常用于修复许多其他损坏的东西。 (2认同)

Raf*_*ffa 26

dpkg-statoverride

\n

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

\n
sudo dpkg-statoverride --update --add root root 755 /bin/chmod\n
Run Code Online (Sandbox Code Playgroud)\n

rsync

\n

rsync默认情况下在 Ubuntu 上可用...在--archive, -a模式下,它应该只设置权限(因为文件永远不会更改)...即在一次使用时如下所示:

\n
sudo rsync -a --chmod=755 /bin/chmod /bin/chmod\n
Run Code Online (Sandbox Code Playgroud)\n

通过install命令

\n

还有另一个installGNU 核心实用程序调用的实用程序,默认情况下在您的系统 \xe2\x80\xa6 上应该可用它\xe2\x80\x99s 主要用于复制刚刚编译的文件并使它们可执行,即安装它们,因此name \xe2\x80\xa6 默认情况下它应该为复制的文件提供权限rwxr-xr-x...它还可以选择-m动态选择性地更改该文件的权限(虽然在这种情况下您可能不需要该选项,因为默认值应该足够了),但你总是可以这样做:

\n
sudo install -m +x /bin/chmod mychmod\n
Run Code Online (Sandbox Code Playgroud)\n

然后,您可以简单地执行以下操作:

\n
sudo ./mychmod 755 /bin/chmod\n
Run Code Online (Sandbox Code Playgroud)\n

使用动态链接器/加载器

\n

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

\n
$ dpkg -S \'ld-linux*\'\nmanpages: /usr/share/man/man8/ld-linux.8.gz\nmanpages: /usr/share/man/man8/ld-linux.so.8.gz\nlibc6:amd64: /lib64/ld-linux-x86-64.so.2\nlibc6:i386: /lib/i386-linux-gnu/ld-linux.so.2\nlibc6-i386: /lib32/ld-linux.so.2\nlibc6:i386: /lib/ld-linux.so.2\nlibc6:amd64: /lib/x86_64-linux-gnu/ld-linux-x86-64.so.2\n
Run Code Online (Sandbox Code Playgroud)\n

然后,只需一次性使用它,如下所示:

\n
sudo /lib64/ld-linux-x86-64.so.2 /bin/chmod 755 /bin/chmod\n
Run Code Online (Sandbox Code Playgroud)\n

别的 ...

\n

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

\n

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

\n
sudo chacl u::rwx,g::r-x,o::r-x /bin/chmod\n
Run Code Online (Sandbox Code Playgroud)\n

bwrap容器设置实用程序):

\n
sudo bwrap --die-with-parent --bind / / --chmod 755 /bin/chmod -- /bin/true\n
Run Code Online (Sandbox Code Playgroud)\n

  • @steeldriver和Raffa,它仍然需要,是的(`cp /bin/ls ./ls; chmod 0 ./ls; /lib64/ld-linux-x86-64.so.2 ./ls`,我得到一个错误)。但是,如果您以 root 身份运行它,则可以像 root 通常那样忽略权限位等烦人的细节,因此它可以在那里工作。与这里的动态加载器的特殊性无关。(这并不是说当内核将其作为执行二进制文件的正常过程的一部分加载时它不会很特别,但这就是我们在这里所做的。) (2认同)

Art*_*ild 23

你做了唯一不应该的事情chmod- 你将chmod自身更改为不可执行。即使是 的权力也不sudo会让这个命令再次起作用(以其当前的形式 - 但请参阅其他答案)。

让它再次工作的方法是使用以下命令重新安装 GNU coreutils 软件包:

sudo apt install --reinstall coreutils
Run Code Online (Sandbox Code Playgroud)

一般提示(这对于 Linux 实用程序尤其重要):在学习某些内容时,首先阅读每个命令的作用,然后在隔离环境(容器/虚拟机)中尝试一些内容,只有在此之后,您才可以在自己的计算机上运行命令。生产系统。

  • “只有*之后*您才应该在生产系统上运行命令。” 一千个赞! (6认同)

小智 13

除了所有其他答案之外,如果您已busybox安装,则可以通过运行以下命令来使用它:

sudo busybox chmod 0755 /usr/bin/chmod
Run Code Online (Sandbox Code Playgroud)

Busybox 可以通过启用universe存储库来安装,然后运行:

sudo apt update && sudo apt install busybox
Run Code Online (Sandbox Code Playgroud)

  • @raj,我确实想知道。我在评论中建议的部分原因是我似乎在我可以访问的每个 Ubuntu 上都有它,即使是我认为没有人会明确安装它的那些。软件包描述说“busybox-static”是“优先级:标准”,我想这意味着它应该默认安装,但也许有人会纠正我。 (2认同)

Jos*_*hua 12

随着即时tar模式的改变(该#符号意味着该命令应该以 root 身份运行):

# cd /bin
# tar -mode 755 -cf chmod.tar chmod
# tar -xf chmod.tar
Run Code Online (Sandbox Code Playgroud)

旧答案调用hexedit

# cd /bin
# tar -cf chmod.tar chmod
# hexedit chmod.tar
Run Code Online (Sandbox Code Playgroud)

修复压缩包内的权限;这是0000222; 将其更改为0000755. 然后运行:

# tar -xf chmod.tar
Run Code Online (Sandbox Code Playgroud)

  • Ubuntu 的 GNU `tar` 支持动态更改权限,即 `sudo tar --mode 0755 -cf chmod.tar /bin/chmod`。 (4认同)