假设您无法访问互联网也无法重新启动计算机,我该如何恢复
chmod -x chmod
?
答案1
1 - 使用一种编程语言来实现chmod
红宝石:
ruby -e 'require "fileutils"; FileUtils.chmod 0755, “chmod"'
Python:
python -c "import os;os.chmod('/bin/chmod', 0755)”
珀尔:
perl -e 'chmod 0755, “chmod”'
节点.js:
require("fs").chmod("/bin/chmod", 0755);
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
2 - 使用 chmod 创建另一个可执行文件
通过创建可执行文件:
$ cat - > chmod.c
int main () { }
^D
$ cc chmod.c
$ cat /bin/chmod > a.out
通过复制可执行文件:
$ cp cat new_chmod
$ cat chmod > new_chmod
3 - 启动 BusyBox(里面有 chmod)
4 - 使用 Gnu Tar
创建具有特定权限的存档并使用它来恢复 chmod:
$ tar --mode 0755 -cf chmod.tar /bin/chmod
$ tar xvf chmod.tar
即时执行相同的操作,甚至不用创建文件:
tar --mode 755 -cvf - chmod | tar xvf -
打开到另一台机器的套接字,创建存档并在本地恢复它:
$ tar --preserve-permissions -cf chmod.tar chmod
$ tar xvf chmod.tar
另一种可能性是定期创建存档,然后对其进行编辑以更改权限。
5 -cpio
cpio
允许您操纵档案;当您运行时cpio file
,在前 21 个字节之后有 3 个字节表示文件权限;如果你编辑这些,你就可以开始了:
echo chmod |
cpio -o |
perl -pe 's/^(.{21}).../${1}755/' |
cpio -i -u
6 - 动态装载机
/bin/ld.so chmod +x chmod
(实际路径可能有所不同)
7 -/proc
魔法(未经测试)
一步步:
- 执行一些强制 inode 进入缓存的操作(
attrib
、ls -@
等) - 检查 kcore 的 VFS 结构
- 使用
sed
或类似的方法在内核没有意识到的情况下更改执行位 - 运行
chmod +x chmod
一次
8 - 时间旅行(git;尚未测试)
首先,我们要确保不会受到其他因素的影响:
$ mkdir sandbox
$ mv chmod sandbox/
$ cd sandbox
现在让我们创建一个存储库并将其标记为我们可以返回的内容:
$ git init
$ git add chmod
$ git commit -m '1985'
现在来说说时间旅行:
$ rm chmod
$ git-update-index --chmod=+x chmod
$ git checkout '1985'
应该有一堆基于 git 的解决方案,但我应该警告你,你可能会遇到一个实际上尝试使用系统的 git 脚本chmod
9 - 以毒攻毒
如果我们能够将一个操作系统与另一个操作系统进行对抗,那就太好了。也就是说,如果我们能够在机器内部启动操作系统并使其能够访问外部文件系统。不幸的是,几乎您启动的每个操作系统都将位于某种 Docker、容器、Jail 等中。因此,遗憾的是,这是不可能的。
或者是吗?
这是 EMAC 的解决方案:
Ctrl+x b > *scratch*
(set-file-modes "/bin/chmod" (string-to-number "0755" 8))
Ctrl+j
10 - 维姆
EMAC 解决方案的唯一问题是我实际上是 Vim 类型的人。当我第一次深入研究这个主题时,Vim 没有办法做到这一点,但近年来有人与宇宙做出了弥补,这意味着我们现在可以这样做:
vim -c "call setfperm('chmod', 'rwxrwxrwx') | quit"