今天手欠手滑在赋权的时候把 chmod
的权限改成了 000
,就在想怎么解决。
突然灵光乍现,没有 chmod
程序不是还有 chmod()
系统调用么,直接写个 C 代码改一下就完事了:
#include <sys/stat.h> int main(void) { chmod("/usr/bin/chmod", 0755); return 0; }
编译后直接执行就可以了。
gcc ./mian.c && ./a.out
参考此处。
NAME chmod, fchmod, fchmodat - change permissions of a file LIBRARY Standard C library (libc, -lc) SYNOPSIS #include <sys/stat.h> int chmod(const char *pathname, mode_t mode); int fchmod(int fd, mode_t mode); #include <fcntl.h> /* Definition of AT_* constants */ #include <sys/stat.h> int fchmodat(int dirfd, const char *pathname, mode_t mode, int flags);
那有大聪明问了,如果 gcc
也 000
了怎么办?
那直接用 cc1 + as + ld
组合就可以了。系统中仍然保留有 cc1
(GCC 的前端编译器)、as
(汇编器)和 ld
(链接器),仍可以手动完成编译流程。
gcc
在编译过程中(比如 gcc shit.c -o shit
)实际上隐式做了如下几步:
- 预处理(cpp):
shit.c
->shit.i
- 编译(cc1):
shit.i
->shit.s
- 汇编(as):
shit.s
->shit.o
- 链接(ld):
shit.o
->shit
当然,嫌麻烦 clang
也可以。
看样子想学好 Linux,得先学明白C。