Jos*_*tro 6 permissions chmod executable system-recovery
假设您无法访问 Internet 或重新启动机器,我该如何恢复
chmod -x chmod
Run Code Online (Sandbox Code Playgroud)
?
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巫术(未经测试)
一步步:
attrib,ls -@,等)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)