1. 快捷键
1.1. 移动
| 快捷键 | 行为 |
|---|
Ctrl+t | 互换光标处和光标前的字符并把光标向前移动一个字符 |
Alt+t | 互换光标处和光标前的单词 |
Alt+l | 把光标后面的字符换成小写 |
Alt+u | 把光标后面的字符换成大写 |
1.2. 剪切&粘贴
| 快捷键 | 行为 |
|---|
Ctrl+k | 剪切从光标到行尾的文本 |
Ctrl+u | 剪切从光标到行首的文本 |
Alt+d | 剪切从光标到词尾的文本 |
Alt+Backspace | 剪切从光标到词首的文本 |
Ctrl+y | 粘贴到光标位置 |
2. 权限
| 权限 | 作用于文件 | 作用于目录 |
|---|
r | 读取 | 如果有 x 则可以读取目录内容 |
w | 写入/截断(不可删除/重命名) | 如果有 x 则可以创建/删除/重命名目录内容 |
x | 执行 | 进入目录 |
2.1. umask
Unix 操作系统的文件系统规定新创建的文件的默认权限为 666 (rw-rw-rw-) 、新创建的目录的默认权限为 777 (rwxrwxrwx) , umask 会对这些权限进行限制,比如:
当前的 umask 为 022 (----w--w-) ,也就是 go-w :
1 2 3 4 5 6
| $ touch a $ ls -hl a -rw-r--r-- 1 user user 0 Jul 28 12:45 a $ mkdir b $ ls -hld b drwxr-xr-x 2 rayalto rayalto 4.0K Jul 28 12:47 b
|
整个活把所有权限都去掉:
1 2 3 4
| $ umask 777 $ touch c $ ls -hl c ---------- 1 rayalto rayalto 0 Jul 28 12:49 c
|
2.2. setuid, setgid and sticky
其实文件权限不止 9 个 bit ,在这前面还有 3 个 bit ,分别是 setuid , setgid 和 sticky 。 setuid 和 setgid 差不多,就是让一个可执行文件执行时(无论是被哪个用户执行)拥有创建这个可执行文件的用户/组的权限,比如以下代码:
1 2 3 4 5 6 7 8 9
| #include <fstream> #include <iostream>
int main(int argc, const char *argv[]) { std::ofstream f("/home/rayalto/test", std::ios::binary); std::cout << std::boolalpha << (f.good()) << '\n'; f.close(); return 0; }
|
尝试打开 ~rayalto/test 文件,编译运行:
1 2 3 4 5 6
| $ g++ test.cc -o test $ sudo mv ./test /usr/local/bin/ $ /usr/local/bin/test true $ ls -hl ~/test -rw-r--r-- 1 rayalto rayalto 0 Jul 29 12:48 /home/rayalto/test
|
这时切换到其他用户来运行:
1 2 3 4 5 6 7
| $ rm ~/test $ su test $ /usr/local/bin/test false $ su rayalto $ ls -hl ~/test ls: cannot access '/home/rayalto/foo': No such file or directory
|
这是正常的,因为 test 不应该有权限修改 rayalto 的文件,但如果加上 setuid 权限:
1 2 3 4 5 6 7
| $ sudo chmod u+s /usr/local/bin/test $ su test $ /usr/local/bin/test true $ su rayalto $ ls -hl ~/test -rw-r--r-- 1 rayalto rayalto 0 Jul 29 12:48 /home/rayalto/test
|
这样 test 可以使用 rayalto 提供的可执行文件来修改 rayalto 的文件。 setgid 也是差不多的作用,可以通过 g+s 设置。 sticky 位的应用场景是:有一个目录归 rayalto 管,但需要允许其他用户,所以目录的权限是 rwxrwxrwx ,这时 foo 用户创建了一个文件,权限是 rw-r--r-- ,其他用户不可以写入/截断这个文件,但由于目录有 wx 权限,所以 bar 用户可以删掉 foo 用户创建的文件:
1 2 3 4 5 6 7 8 9 10 11 12
| $ whoami foo $ ls -hld . drwxr-xrwx 8 rayalto rayalto 4.0K Jul 26 13:45 . $ touch foo.file $ ls -hl -rw-r--r-- 1 foo foo 42 Mar 20 12:12 foo.file $ su bar $ rm foo.file rm: remove write-protected regular empty file 'foo.file'? y $ ls -hl foo.file ls: cannot access 'foo.file': No such file or directory
|
这时给这个目录设置 sticky 就可以解决这个问题:
1 2 3 4 5 6 7 8 9 10 11 12 13
| $ whoami rayalto $ ls -hld . drwxr-xrwx 8 rayalto rayalto 4.0K Jul 26 13:45 . $ chmod +t . $ ls -hld . drwxr-xrwt 8 rayalto rayalto 4.0K Jul 26 13:45 . $ su foo $ touch foo.file $ su bar $ rm foo.file rm: remove write-protected regular empty file 'foo.file'? y rm: cannot remove 'foo.file': Permission denied
|
3. 进程
3.1. ps aux 中一些列的意义
| 列名 | 意义 |
|---|
| VSZ | 虚拟内存大小 |
| RSS | Resident Set Size ,物理内存 (kB) |
| STAT | STATus |
各种 STAT
| STAT | 意义 |
|---|
R | Running |
S | Sleeping |
D | 不可打断的睡眠,进程在等待例如磁盘之类的 I/O |
T | sTopped |
Z | Zombie ,已被 terminated 但还没被父进程清理 |
< | less nice ,高优先级进程,占用了更多 CPU 的进程 |
N | Nice ,低优先级进程 |
3.2. 信号
kill/killall 可以向属于你的进程发送指定信号(默认为 TERM ):
1 2
| kill [-signal] PID ... killall [-signal] process_name
|
| 编号 | 名字 | 意义 |
|---|
| 1 | HUP | HangUP 早期终端机通过电话线和调制解调器连接到远程计算机,这个信号表示“挂断”,现在一般被守护进程监听,受到这个信号后重启自己并重新加载配置 |
| 2 | INT | INTerrupt 中断,通常会终止一个程序, C-c 就是发送这个信号 |
| 3 | QUIT | 通过 C-\ 可以发送这个信号,会导致进程 core dumped ,一般用于调试 |
| 9 | KILL | 与其他信号不同,这个信号不会被发到目标进程,而是直接使内核立即终止这个进程 |
| 11 | SEGV | SEGmentation Violation 段错误,一般由内核发给进程,进程可以捕获,但会不断收到这个信号,无法继续正常运行,所以捕获后忽略是没有意义的。也可以 kill -11 ,这样只会收到一次信号 |
| 15 | TERM | TERMinate kill 的默认信号 |
| 18 | CONT | COuNTinue |
| 19 | STOP | 和 C-z 发出的 TSTP (Terminal SToP) 一样会使当前进程 suspended ,不同点在于 TSTP 可以被程序捕获并忽略而 STOP 一般由内核发出(虽然 kill 也可以),进程一般无法捕获 |
| 20 | TSTP | Terminal SToP 通过 C-z 发出,使当前进程 suspended ,通过 fg 使进程继续运行 |
| 28 | WINCH | WINdow CHange 终端尺寸改变时进程回收到这个信号,比如 top 和 less 就依赖这个信号刷新现实的内容 |
3.3. 其他进程相关工具
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| $ pstree systemd─┬─Xwayland───9*[{Xwayland}] ├─blueman-applet───4*[{blueman-applet}] ├─blueman-tray───4*[{blueman-tray}] ├─bluetoothd ├─dbus-daemon ├─fcitx5───3*[{fcitx5}] ├─kitty─┬─zsh───ssh │ └─10*[{kitty}] ├─kitty─┬─zsh───nvim───nvim─┬─clangd.main───7*[{clangd.main}] │ │ ├─python3 │ │ └─zsh │ └─10*[{kitty}] ├─2*[kitty─┬─zsh] │ └─10*[{kitty}]] ... $ vmstat 1 3 -SM procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu----- r b swpd free buff cache si so bi bo in cs us sy id wa st 4 0 0 26886 115 2268 0 0 286 51 1134 2 2 1 98 0 0 1 0 0 26879 115 2270 0 0 0 456 2389 5638 6 2 93 0 0 2 0 0 26879 115 2270 0 0 0 0 2923 6105 7 1 92 0 0
|