MIT-Missing-Semester
# 前言
MIT-Missing-Semester 课程介绍 (opens new window)
在传统的计算机科学课程中,从操作系统、编程语言到机器学习,这些高大上课程和主题已经非常多了。 然而有一个至关重要的主题却很少被专门讲授,而是留给学生们自己去探索。 这部分内容就是:精通工具。
正如课程名字所言:“计算机教学中消失的一个学期”,这门课将会教会你许多大学的课堂上不会涉及但却对每个 CSer 无比重要的工具或者知识点。例如 Shell 编程、命令行配置、Git、Vim、tmux、ssh 等等。如果你是一个计算机小白,那么我非常建议你学习一下这门课,因为它基本涉及了本书必学工具中的绝大部分内容。
课程中文字幕视频:
- Missing_Semi_中译组(未完结):https://space.bilibili.com/1010983811?spm_id_from=333.337.search-card.all.click
- 刘黑黑a(已完结):https://space.bilibili.com/518734451?spm_id_from=333.337.search-card.all.click
# 课程概览与 shell (opens new window)
# 步入shell
$ echo $SHELL
/bin/bash
# 打印环境变量
missing:~$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
pwd - print name of current/working directory
关于 shell,有件事我们必须要知道。|、>、和 < 是通过 shell 执行的,而不是被各个程序单独执行。 echo 等程序并不知道 | 的存在,它们只知道从自己的输入输出流中进行读写。 对于上面这种情况, shell (权限为您的当前用户) 在设置 sudo echo 前尝试打开 brightness 文件并写入,但是系统拒绝了 shell 的操作因为此时 shell 不是根用户。
明白这一点后,我们可以这样操作:
$ echo 3 | sudo tee brightness
因为打开 /sys 文件的是 tee 这个程序,并且该程序以 root 权限在运行,因此操作可以进行。 这样您就可以在 /sys 中愉快地玩耍了,例如修改系统中各种LED的状态(路径可能会有所不同):
$ echo 1 | sudo tee /sys/class/leds/input6::scrolllock/brightness
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
[root@v3w2exw1dceteq45 missing]# echo ' #!/bin/sh' > semester
[root@v3w2exw1dceteq45 missing]# echo 'curl --head --silent https://missing.csail.mit.edu' >> semester
[root@v3w2exw1dceteq45 missing]# cat semester
#!/bin/sh
curl --head --silent https://missing.csail.mit.edu
[root@v3w2exw1dceteq45 missing]#
2
3
4
5
6
chmod
是一个用于改变文件或目录权限的命令,常用于Unix和类Unix操作系统如Linux。它控制谁可以执行某个文件、读取文件、或者编辑文件。
chmod根据模式(mode)改变每个给定文件的文件模式位(file mode bits),这个模式可以是表示要进行的更改的符号表示法(symbolic representation),或者是表示新模式位的八进制数字(octal number)。
符号模式的格式是[ugoa...][[+-=][perms...]...],其中perms是从集合rwxXst中选取的零个或多个字母,或者是从集合ugo中选取的单个字母。可以给出多个符号模式,它们之间用逗号分隔。
字母组合ugoa控制将更改哪些用户对文件的访问权限:文件所有者(u)、文件组中的其他用户(g)、文件组外的其他用户(o)、或所有用户(a)。如果这些都没有给出,默认效果就好像给出了a,但是umask中设置的位不会受到影响。
操作符+使得所选文件模式位被添加到每个文件的现有文件模式位中;- 意味着它们将被移除;= 意味着它们将被添加,并且未提及的位将被移除,但目录的未提及的设置用户和组ID位不受影响。
字母rwxXst为受影响的用户选择文件模式位:读(r)、写(w)、执行(或对目录搜索)(x)、只有在文件是目录或已对某个用户授予执行权限时才执行/搜索(X)、执行时设置用户或组ID(s)、受限删除标志或粘滞位(sticky bit) (t)。除了这些字母之一或多个以外,你还可以指定ugo中的正好一个字母:授予文件所有者的权限(u)、授予文件组中其他用户的权限(g)、授予上述两类之外的用户的权限(o)。
数值模式是一到四位的八进制数字(0-7),通过把值4、2和1的位加起来得到。省略的数字假定为前导零。第一个数字选择设置用户ID(4)和设置组ID(2)以及受限删除或粘滞属性(1)。第二个数字选择文件所有者的权限:读(4)、写(2)和执行(1);第三个选择文件组中其他用户的权限,采用相同的值;第四个为文件组外的其他用户选择权限,也采用相同的值。
chmod永远不会改变符号链接(symbolic links)的权限;chmod系统调用不能改变它们的权限。这不是问题,因为符号链接的权限从不被使用。然而,对于命令行上列出的每个符号链接,chmod会更改指向的文件的权限。相比之下,在递归目录遍历过程中遇到的符号链接会被chmod忽略。
# Shebang (Unix)
尖锐感叹号 (#!)
The form of a shebang interpreter directive (opens new window) is as follows:[8] (opens new window) Shebang 解释器指令的形式如下: [8] (opens new window)
#!interpreter [optional-arg]
#!/bin/sh
– Execute the file using the Bourne shell (opens new window), or a compatible shell, assumed to be in the /bin directory#!/bin/sh
- 使用 Bourne shell 或兼容的 shell(假定在 /bin 目录中)执行文件#!/bin/bash
– Execute the file using the Bash shell (opens new window)#!/bin/bash
- 使用 Bash shell 执行文件#!/usr/bin/pwsh
– Execute the file using PowerShell (opens new window)#!/usr/bin/pwsh
- 使用 PowerShell 执行文件#!/usr/bin/env python3
– Execute with a Python (opens new window) interpreter, using the env (opens new window) program search path to find it#!/usr/bin/env python3
- 使用 Python 解释器执行,使用 env 程序搜索路径找到它
# SHELL工具和脚本
- https://tldr.sh/ (opens new window)
- https://unix.stackexchange.com/questions/60205/locate-vs-find-usage-pros-and-cons-of-each-other (opens new window)
在bash中为变量赋值的语法是foo=bar
,访问变量中存储的数值,其语法为 $foo
。 需要注意的是,foo = bar
(使用空格隔开)是不能正确工作的
convert image.{png,jpg}
# 会展开为
convert image.png image.jpg
diff <(ls /tmp) <(ls /usr)
2
3
4
5
编写 bash
脚本有时候会很别扭和反直觉。例如 shellcheck (opens new window) 这样的工具可以帮助你定位sh/bash脚本中的错误。
# 工具
常用的检索工具
- fasd
- localte
- https://unix.stackexchange.com/questions/60205/locate-vs-find-usage-pros-and-cons-of-each-other
- find
- autojump
# 查找所有名称为src的文件夹
find . -name src -type d
# 查找所有文件夹路径中包含test的python文件
find . -path '*/test/*.py' -type f
# 查找前一天修改的所有文件
find . -mtime -1
# 查找所有大小在500k至10M的tar.gz文件
find . -size +500k -size -10M -name '*.tar.gz'
2
3
4
5
6
7
8
# 作业
- 所有文件(包括隐藏文件) :
-a
- 文件打印以人类可以理解的格式输出 (例如,使用454M 而不是 454279954) :
-h
- 文件以最近访问顺序排序:
-t
- 以彩色文本显示输出结果
--color=auto
#!/usr/bin/env bash
n=$(( RANDOM % 100 ))
if [[ n -eq 42 ]]; then
echo "Something went wrong"
>&2 echo "The error was using magic numbers"
exit 1
fi
echo "Everything went according to plan"
2
3
4
5
6
7
8
9
10
11
#!/usr/bin/env bash
count=0
echo > out.log
while true
do
./buggy.sh &>> out.log
if [[ $? -ne 0 ]]; then
cat out.log
echo "failed after $count times"
break
fi
((count++))
done
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$count
&>>
标准输出流传到文件中
# Editor (Vim)
# vimtutor
特别提示:切记您要在使用中学习,而不是在记忆中学习。
# 拓展资料
vim小结
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
第一讲小结
1. 光标在屏幕文本中的移动既可以用箭头键,也可以使用 hjkl 字母键。
h (左移) j (下行) k (上行) l (右移)
2. 欲进入 Vim 编辑器(从命令行提示符),请输入:vim 文件名 <回车>
3. 欲退出 Vim 编辑器,请输入 <ESC> :q! <回车> 放弃所有改动。
或者输入 <ESC> :wq <回车> 保存改动。
4. 在正常模式下删除光标所在位置的字符,请按: x
5. 欲插入或添加文本,请输入:
i 输入欲插入文本 <ESC> 在光标前插入文本
A 输入欲添加文本 <ESC> 在一行后添加文本
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
第二讲小结
1. 欲从当前光标删除至下一个单词,请输入:dw
2. 欲从当前光标删除至当前行末尾,请输入:d$
3. 欲删除整行,请输入:dd
4. 欲重复一个动作,请在它前面加上一个数字:2w
5. 在正常模式下修改命令的格式是:
operator [number] motion
其中:
operator - 操作符,代表要做的事情,比如 d 代表删除
[number] - 可以附加的数字,代表动作重复的次数
motion - 动作,代表在所操作的文本上的移动,例如 w 代表单词(word),
$ 代表行末等等。
6. 欲移动光标到行首,请按数字0键:0
7. 欲撤消以前的操作,请输入:u (小写的u)
欲撤消在一行中所做的改动,请输入:U (大写的U)
欲撤消以前的撤消命令,恢复以前的操作结果,请输入:CTRL-R
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
第三讲小结
1. 要重新置入已经删除的文本内容,请按小写字母 p 键。该操作可以将已删除
的文本内容置于光标之后。如果最后一次删除的是一个整行,那么该行将置
于当前光标所在行的下一行。
2. 要替换光标所在位置的字符,请输入小写的 r 和要替换掉原位置字符的新字
符即可。
3. 更改类命令允许您改变从当前光标所在位置直到动作指示的位置中间的文本。
比如输入 ce 可以替换当前光标到单词的末尾的内容;输入 c$ 可以替换当
前光标到行末的内容。
4. 更改类命令的格式是:
c [number] motion
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
第四讲小结
1. CTRL-G 用于显示当前光标所在位置和文件状态信息。
G 用于将光标跳转至文件最后一行。
先敲入一个行号然后输入大写 G 则是将光标移动至该行号代表的行。
gg 用于将光标跳转至文件第一行。
2. 输入 / 然后紧随一个字符串是在当前所编辑的文档中正向查找该字符串。
输入 ? 然后紧随一个字符串则是在当前所编辑的文档中反向查找该字符串。
完成一次查找之后按 n 键是重复上一次的命令,可在同一方向上查
找下一个匹配字符串所在;或者按大写 N 向相反方向查找下一匹配字符串所在。
CTRL-O 带您跳转回较旧的位置,CTRL-I 则带您到较新的位置。
3. 如果光标当前位置是括号(、)、[、]、{、},按 % 会将光标移动到配对的括号上。
4. 在一行内替换头一个字符串 old 为新的字符串 new,请输入 :s/old/new
在一行内替换所有的字符串 old 为新的字符串 new,请输入 :s/old/new/g
在两行内替换所有的字符串 old 为新的字符串 new,请输入 :#,#s/old/new/g
在文件内替换所有的字符串 old 为新的字符串 new,请输入 :%s/old/new/g
进行全文替换时询问用户确认每个替换需添加 c 标志 :%s/old/new/gc
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
第五讲小结
1. :!command 用于执行一个外部命令 command。
请看一些实际例子:
(MS-DOS) (Unix)
:!dir :!ls - 用于显示当前目录的内容。
:!del FILENAME :!rm FILENAME - 用于删除名为 FILENAME 的文件。
2. :w FILENAME 可将当前 VIM 中正在编辑的文件保存到名为 FILENAME 的文
件中。
3. v motion :w FILENAME 可将当前编辑文件中可视模式下选中的内容保存到文件
FILENAME 中。
4. :r FILENAME 可提取磁盘文件 FILENAME 并将其插入到当前文件的光标位置
后面。
5. :r !dir 可以读取 dir 命令的输出并将其放置到当前文件的光标位置后面。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
第六讲小结
1. 输入小写的 o 可以在光标下方打开新的一行并进入插入模式。
输入大写的 O 可以在光标上方打开新的一行。
2. 输入小写的 a 可以在光标所在位置之后插入文本。
输入大写的 A 可以在光标所在行的行末之后插入文本。
3. e 命令可以使光标移动到单词末尾。
4. 操作符 y 复制文本,p 粘贴先前复制的文本。
5. 输入大写的 R 将进入替换模式,直至按 <ESC> 键回到正常模式。
6. 输入 :set xxx 可以设置 xxx 选项。一些有用的选项如下:
'ic' 'ignorecase' 查找时忽略字母大小写
'is' 'incsearch' 查找短语时显示部分匹配
'hls' 'hlsearch' 高亮显示所有的匹配短语
选项名可以用完整版本,也可以用缩略版本。
7. 在选项前加上 no 可以关闭选项: :set noic
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
第七讲小结
1. 输入 :help 或者按 <F1> 键或 <Help> 键可以打开帮助窗口。
2. 输入 :help cmd 可以找到关于 cmd 命令的帮助。
3. 输入 CTRL-W CTRL-W 可以使您在窗口之间跳转。
4. 输入 :q 以关闭帮助窗口
5. 您可以创建一个 vimrc 启动脚本文件用来保存您偏好的设置。
6. 当输入 : 命令时,按 CTRL-D 可以查看可能的补全结果。
按 <TAB> 可以使用一个补全。
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
vimtutor
是一个 Vim 安装时自带的教程- Vim Adventures (opens new window) 是一个学习使用 Vim 的游戏【玩的时候要关闭 chrome 浏览器的拓展,有些快捷键用不了】
- 推荐了一堆关于 vim的书籍https://iccf-holland.org/vim_books.html (opens new window)
# 进阶
- Vim Tips Wiki (opens new window)
- Vim Advent Calendar (opens new window) 有很多 Vim 小技巧
- Vim Golf (opens new window) 是用 Vim 的用户界面作为程序语言的 code golf (opens new window)
- Vi/Vim Stack Exchange (opens new window)
- Vim Screencasts (opens new window)
- Practical Vim (opens new window)(书籍)
# Data Wrangling-数据整理
- 学习一下这篇简短的 交互式正则表达式教程 (opens new window).
journalctl | grep sshd
也属于一种数据整理- 了解awk、sed等筛选工具
# tips
进行原地替换听上去很有诱惑力,例如: sed s/REGEX/SUBSTITUTION/ input.txt > input.txt
。但是这并不是一个明智的做法,为什么呢?
可能会存在数据丢失的风险
推荐使用
sed -i.bak s/REGEX/SUBSTITUTION/ input.txt
# 要是查看文件发现错误,还可以回滚
sudo cp -f a.txt.bak a.txt
2
3
4
# Command-line Environment
# job control
sleep 10000
bg
jobs
pkill # 指定关闭某个任务
jobs 用于列出当前正在后台运行的任务。
如果你在后台运行了一个任务,你可以使用'bg'命令来将其重新添加到后台继续运行。
2
3
4
5
6
7
# tmux
扩展阅读: 这里 (opens new window) 是一份
tmux
快速入门教程, 而这一篇 (opens new window) 文章则更加详细,它包含了screen
命令。您也许想要掌握screen
(opens new window) 命令,因为在大多数 UNIX 系统中都默认安装有该程序。
完成这个 tmux (opens new window) 教程,并参考这些步骤 (opens new window)来学习如何自定义 tmux。
是一个多窗口控制器,如果我们退出登录,重新登录,使用
tmux
工具能够很好恢复原来的状态。(在没有外部shell工具的时候才能大展身手,最好用的多终端窗口切换工具)
# 配置文件
github搜索dotfile
# 远程连接
# Version Control (git)~
# Debugging
使用 Linux 上的 journalctl
命令来获取最近一天中超级用户的登录信息及其所执行的指令。如果找不到相关信息,您可以执行一些无害的命令,例如sudo ls
然后再次查看。
# Security and Cryptography
熵 (opens new window)(Entropy) 度量了不确定性并可以用来决定密码的强度。
- 假设一个密码是由四个小写的单词拼接组成,每个单词都是从一个含有10万单词的字典中随机选择,且每个单词选中的概率相同。 一个符合这样构造的例子是
correcthorsebatterystaple
。这个密码有多少比特的熵? - 假设另一个密码是用八个随机的大小写字母或数字组成。一个符合这样构造的例子是
rg8Ql34g
。这个密码又有多少比特的熵?
1、 16.60964 * 4 = 约为66,不足以抵挡暴力攻击(80才满足要求)
2、 Entropy = log_2((26+26+10)^8) = 48 #rg8Ql34g
2