如何从 `chmod -x chmod` 中恢复?

Jos*_*tro 6 permissions chmod executable system-recovery

假设您无法访问 Internet 或重新启动机器,我该如何恢复

chmod -x chmod
Run Code Online (Sandbox Code Playgroud)

?

Jos*_*tro 8

1 - 使用实现 chmod

红宝石:

ruby -e 'require "fileutils"; FileUtils.chmod 0755, “chmod"'
Run Code Online (Sandbox Code Playgroud)

Python:

python -c "import os;os.chmod('/bin/chmod', 0755)”
Run Code Online (Sandbox Code Playgroud)

珀尔:

perl -e 'chmod 0755, “chmod”'
Run Code Online (Sandbox Code Playgroud)

节点.js:

require("fs").chmod("/bin/chmod", 0755);
Run Code Online (Sandbox Code Playgroud)

C:

$ cat - > restore_chmod.c 
#include <sys/types.h>
#include <sys/stat.h>

int main () {
    chmod( "/bin/chmod", 0000755 );
}
^D

$ cc restore_chmod.c

$ ./a.out
Run Code Online (Sandbox Code Playgroud)

2 - 使用 chmod 创建另一个可执行文件

通过创建可执行文件:

$ cat - > chmod.c 
int main () { }
^D

$ cc chmod.c

$ cat /bin/chmod > a.out
Run Code Online (Sandbox Code Playgroud)

通过复制可执行文件:

$ cp cat new_chmod

$ cat chmod > new_chmod
Run Code Online (Sandbox Code Playgroud)

3 - 启动 BusyBox(里面有 chmod)

4 - 使用 Gnu Tar

创建具有特定权限的存档并使用它来恢复 chmod:

$ tar --mode 0755 -cf chmod.tar /bin/chmod

$ tar xvf chmod.tar
Run Code Online (Sandbox Code Playgroud)

做同样的事情,但在运行中,甚至不费心去创建文件:

tar --mode 755 -cvf - chmod | tar xvf -
Run Code Online (Sandbox Code Playgroud)

打开到另一台机器的套接字,创建一个存档并在本地恢复它:

$ tar --preserve-permissions -cf chmod.tar chmod

$ tar xvf chmod.tar
Run Code Online (Sandbox Code Playgroud)

另一种可能性是定期创建存档,然后对其进行编辑以更改权限。

5 - cpio

cpio允许您操作档案;运行时cpio file,在前 21 个字节之后有 3 个字节表示文件权限;如果你编辑这些,你很高兴:

echo chmod |
  cpio -o |
  perl -pe 's/^(.{21}).../${1}755/' |
  cpio -i -u
Run Code Online (Sandbox Code Playgroud)

6 - 动态装载机

/bin/ld.so chmod +x chmod
Run Code Online (Sandbox Code Playgroud)

(实际路径可能有所不同)

7 -/proc巫术(未经测试)

一步步:

  • 做一些力量的inode到高速缓存中(attribls -@,等)
  • 检查 VFS 结构的 kcore
  • 使用sed或类似的东西来改变执行位而内核没有意识到它
  • 运行chmod +x chmod一次

8 - 时间旅行(git;尚未测试)

首先,让我们确保我们不会妨碍其他所有事情:

$ mkdir sandbox
$ mv chmod sandbox/
$ cd sandbox
Run Code Online (Sandbox Code Playgroud)

现在让我们创建一个存储库并将其标记为我们可以返回的内容:

$ git init
$ git add chmod
$ git commit -m '1985'
Run Code Online (Sandbox Code Playgroud)

现在是时间旅行:

$ rm chmod
$ git-update-index --chmod=+x chmod
$ git checkout '1985'
Run Code Online (Sandbox Code Playgroud)

应该有一堆基于 git 的解决方案,但我应该警告你,你可能会遇到一个实际上试图使用系统的 git 脚本 chmod

9 - 以火灭火

如果我们可以与另一个操作系统对抗一个操作系统,那就太好了。也就是说,如果我们能够在机器内部启动操作系统并让它访问外部文件系统。不幸的是,您启动的几乎每个操作系统都将位于某种 Docker、容器、监狱等中。因此,遗憾的是,这是不可能的。

或者是吗?

这是 EMACs 解决方案:

Ctrl+x b > *scratch* 
(set-file-modes "/bin/chmod" (string-to-number "0755" 8))
Ctrl+j
Run Code Online (Sandbox Code Playgroud)

10 - Vim

EMACs 解决方案的唯一问题是我实际上是一个 Vim 类型的人。当我第一次深入研究这个话题时,Vim 没有办法做到这一点,但近年来有人对宇宙进行了修正,这意味着我们现在可以这样做:

vim -c "call setfperm('chmod', 'rwxrwxrwx') | quit"
Run Code Online (Sandbox Code Playgroud)