Shell 学习笔记 0x01

Shell 学习笔记 0x01

RayAlto OP

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 会对这些权限进行限制,比如:

1
2
$ umask
022

当前的 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 ,分别是 setuidsetgidstickysetuidsetgid 差不多,就是让一个可执行文件执行时(无论是被哪个用户执行)拥有创建这个可执行文件的用户/组的权限,比如以下代码:

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虚拟内存大小
RSSResident Set Size ,物理内存 (kB)
STATSTATus

各种 STAT

STAT意义
RRunning
SSleeping
D不可打断的睡眠,进程在等待例如磁盘之类的 I/O
TsTopped
ZZombie ,已被 terminated 但还没被父进程清理
<less nice ,高优先级进程,占用了更多 CPU 的进程
NNice ,低优先级进程

3.2. 信号

kill/killall 可以向属于你的进程发送指定信号(默认为 TERM ):

1
2
kill [-signal] PID ...
killall [-signal] process_name
编号名字意义
1HUPHangUP 早期终端机通过电话线和调制解调器连接到远程计算机,这个信号表示“挂断”,现在一般被守护进程监听,受到这个信号后重启自己并重新加载配置
2INTINTerrupt 中断,通常会终止一个程序, C-c 就是发送这个信号
3QUIT通过 C-\ 可以发送这个信号,会导致进程 core dumped ,一般用于调试
9KILL与其他信号不同,这个信号不会被发到目标进程,而是直接使内核立即终止这个进程
11SEGVSEGmentation Violation 段错误,一般由内核发给进程,进程可以捕获,但会不断收到这个信号,无法继续正常运行,所以捕获后忽略是没有意义的。也可以 kill -11 ,这样只会收到一次信号
15TERMTERMinate kill 的默认信号
18CONTCOuNTinue
19STOPC-z 发出的 TSTP (Terminal SToP) 一样会使当前进程 suspended ,不同点在于 TSTP 可以被程序捕获并忽略而 STOP 一般由内核发出(虽然 kill 也可以),进程一般无法捕获
20TSTPTerminal SToP 通过 C-z 发出,使当前进程 suspended ,通过 fg 使进程继续运行
28WINCHWINdow CHange 终端尺寸改变时进程回收到这个信号,比如 topless 就依赖这个信号刷新现实的内容

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 # ProceSs TREE
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 # Virtual Memory STATistics
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