Course overview + the shell
Shell Tools and Scripting
TLDR
TLDR可以代替man命令,查找命令说明书,TLDR可以给出详细的例子
find
ripgrep
可以代替grep查找文件内容符合条件的文件
Ctrl+R 可以进入用子串查找历史命令的模式
xargs 命令,它可以使用标准输入中的内容作为参数。 例如 ls | xargs rm 会删除当前目录中的所有文件。
Vim
略
Data Wrangling
数据处理常用工具有grep
另外还有一些常用的数据处理工具
- sed,文件(输入流)处理工具
- sort,排序工具
- awk,作用于文件的多功能编程语言
Command-line Enviroment
Job Control(作业控制)
结束一个正在执行的程序可以按ctrl+c,实质是终端向程序发送了一个SIGINT的signal
SIGINT可以在程序中捕获处理,因此ctrl+c也就是SIGINT信号有时候没用。
SIGQUIT信号可以结束程序并不会被捕获,按ctrl+\
SIGSTOP信号可以暂停程序到后台,按ctrl+z。命令行输入jobs查看所有程序运行状态,使用fg %程序id 或 bg %程序id 将程序从暂停状态转到前端执行或后端执行
尽管程序可以在后端执行,但是一旦终端关闭,作为子进程的程序会收到一个SIGHUP信号导致被挂起,可以使用nohup 程序 &来使得程序在后端执行并忽略SIGHUP信号
Terminal Multiplexers(终端复用器)
Aliases(别名)
直接在命令行定义别名,关闭终端后就没了,需要在.bashrc或者.zshrc这样的终端启动文件中做持久化
Dotfiles(点文件或者配置文件)
许多配置文件以’.‘开头,所以叫dotfile,默认情况下ls看不到dotfile
配置文件最好用版本控制统一管理,然后将原来的配置文件路径软链接到版本控制下的配置文件路径,github上有许多dotfile仓库
Remote Machines(远程机器)
使用ssh可以登录远程终端
foo是用户名,bar.mit.edu是域名,也可以直接是ip地址
也可以直接使用ssh执行命令,只要在上面的命令后面加上需要执行的命令即可
Version Control(Git)
略
Debugging and Profiling
Debugging
Printf debugging and Logging
“The most effective debugging tool is still careful thought, coupled with judiciously placed print statements” — Brian Kernighan, Unix for Beginners.
在程序中使用logging而不用printf的好处在于
- 日志可以输出到文件、sockets、甚至是远程服务器而不一定是标准输出
- 日志支持几种输出级别(例如INFO,DEBUG,WARN,ERROR)
- 对于新出现的问题,日志有足够多的信息来排查
tips:输出可以按级别用不同颜色表示,例如ERROR用红色
echo -e "\e[38;2;255;0;0mThis is red\e[0m"
会打印红色的“This is red”到终端上
Third Party logs
许多第三方程序会将日志写到系统的某一处,一般是/var/log. NGINX服务器会将日志放在/var/log/nginx下. 许多linux系统使用systemd, 一个系统守护进程来控制许多事情例如某些服务的开启和运行, systemd将日志放在/var/log/journal下, 可以使用journalctl查看
Debuggers
略
Specialized Tools
Linux下可以使用strace查看程序系统调用情况
tcpdump和Wireshark是网络包分析器
web开发中,Chrome和Firefox的开发者工具十分方便
Profiling(分析)
学习分析和检测工具可以帮助理解程序中那一部分花费最多时间或资源以便优化这部分
Timing
三种不同的运行时间
- 真实时间:程序开始到结束的时间,包括阻塞时间、等待IO、网络
- 用户态时间:CPU执行程序中用户态代码的时间
- 系统态时间:CPU执行程序中核心态代码的时间
正确的程序执行时间=用户态时间+系统态时间
time命令可以测试程序的三种时间
Metaprogramming
这节主要讲系统构建工具make、持续集成等
略
Security and Cryptography
Entropy(熵)
熵度量了不确定性并可以用于决定密码的强度
熵的单位是比特,对于一个均匀分布的离散随机变量,熵等于
扔一次硬币的熵是1比特。掷一次六面骰子的熵大约为2.58比特。一般我们认为攻击者了解密码的模型(最小长度,最大长度,可能包含的字符种类等),但是不了解某个密码是如何选择的
https://xkcd.com/936/ 例子里面,“correcthorsebatterystaple”这个密码比“Tr0ub4dor&3”更安全,因为前者熵更大,大约40比特的熵足以对抗在线穷举攻击(受限于网络速度和应用认证机制);而对于离线穷举攻击(主要受限于计算速度),一般需要更强的密码(比如80比特)
Potpourri
略