基础
shell
- Shell 把我们输入的指令,传递给操作系统去执 行,所以 Shell 是一个命令行的用户界面。
- bash(Bourne Again Shell),它是用 Shell 组成的程序。这里的 Bourne 是一个人名,Steve Bourne 是 bash 的发明者。
Linux 对文件目录的抽象
Linux 对文件进行了一个树状的抽象。/代表根目录,每一节目录也用/分开,所以在上图所展示 的/usr/bin/rm中,第一级目录是/根目录,第二级目录是usr目录,第三级是bin目录。最后的rm 是一个文件。
路径
- 目标文件的绝对路径(Absolute path),也叫作完全路径(full path),是从/开始,接下来每一层 都是一级子目录,直到定位到目标文件为止。
- 相对路径(Relative path)是以工作目录为基点的路径
几种常见的文件类型
ls -F查看当前目录下的文件和他的类型:1. * 结尾的是可执行文件; 2. = 结尾的是 Socket 文件; 3. @ 结尾的是软链接; 4. | 结尾的管道文件; 5. 没有符号结尾的是普通文件; 6. / 结尾的是目录。pwd指令查看工作目录。cd指令切换工作目录。which指令查找一个执行文件所在的路径。 例如which rmls显示文件信息。(list)rm删除文件。(remove)rm hello删除目录hellotouch修改一个文件的时间戳,如果文件不存在会触发创建文件。vi和nano可以用来编辑文件。cat查看完成的文件的内容适合小型文件。 大文件可以搭配 | moremore | less查看一个文件但是只读取用户看到的内容到内存,因此消耗资源较少,适合在服务器上看日志。head|tail可以用来看文件的头和尾。grep指令搜索文件内容。g 就是 global,全局;re 就是- ,正则表达式; p 就是 pattern,模式。
find指令全局查找文件。find / -iname "*.txt"查找所有的txt文件,-iname这个参数是用来匹配查找的,i 字母代表忽略大小写,这里也可以 用-name替代。
进程
ps查看当前进程 p :processes 进程 s :snapshotps -ef查看所有进程-f可以带上更多的描述字段.
UID 指进程的所有者; PID 是进程的唯一标识; PPID 是进程的父进程 ID; C 是 CPU 的利用率(就是 CPU 占用); STIME 是开始时间; TTY 是进程所在的 TTY,如果没有 TTY 就是 ?号; TIME;执行的时间 CMD 是进程启动时的命令,如果不是一个 Shell 命令,而是用方括号括起来,那就是系统进程或者 内核过程。
-
TTY是指终端设备,是计算机系统中用于输入和输出数据的设备,如终端、控制台、串口等。在进程中,TTY指的是与该进程相关联的终端设备。当进程需要输入或输出数据时,它会通过TTY与终端设备进行交互。TTY也可以被用于控制进程的行为,如在TTY上发送信号或者中断进程。
-
输入输出流:
- 标准输入流(用 0 表示)可以作为进程执行的上下文(进程执行可以从输入流中获取数据)。
- 标准输出流(用 1 表示)中写入的结果会被打印到屏幕上。
- 进程在执行过程中发生异常,那么异常信息会被记录到标准错误流(用 2 表示)中。
-
>符号叫作覆盖重定向;>>叫作追加重定向。>每次 eg.ls -l > out- 假如
ls1是错误指令,输出错误流, 单纯使用 > 无法 写到文件out 需要ls1 &> out
- 假如
-
管道的作用和分类 : 管道和重定向很像,但是管道是一个连接一个进行计算,重定向是将一个文件的内容定向到另一个文 件,这二者经常会结合使用。
-
TIME;执行的时间 CMD 是进程启动时的命令,如果不是一个 Shell 命令,而是用方括号括起来,那就是系统进程或者 内核过程。
-
管道: 的作用是在命令和命令 之间,传递数据。
-
Linux 中的管道也是文件,有两种类型的管道:1. 匿名管道(Unnamed Pipeline)| ,在文件系统中,只是一个存储节点,不属于任何一个目录,没有路径。
- 命名管道(Named Pipeline),这种管道就是一个文件,有自己的路径。
- 管道具有 FIFO(First In First Out),FIFO 和排队场景一样,先排到的先获得。所以先流入管道文件的数据,也会先流出去传递给管道下游的进程。 从左向右执行
- 排序 sort -r倒序
- 去重 需要先sort 在 uniq eg.
sort a.txt| uniq - wc -l
cat xx.cpporls统计行数 xargs从标准数据流中构造并执行一行行的指令。- 命名管道文件:
mkfifo pipe1 - 先
cat pipe1 & 然后 echo "xx" > pipe1&符号代表指令在后台 执行,不会阻塞用户继续输入。
权限
-
group 组 里面的每个用户拥有一样的权限 。
-
root 超级管理员
-
1.读权限(r):控制读取文件。 2. 写权限(w):控制写入文件。 3. 执行权限(x):控制将文件执行,比如脚本、应用程序等。
-
问题一:初始权限问题。
文件被创建后的权限通常是: rw-rw-r-也就是用户、组维度不可以执行,所有用户可读
- 问题二:公共执行文件的权限
ls -l /usr/bin/ls组维度不可读写 所有用户可读写
- 问题三:执行文件
可以通过输入路径的方式执行文件 但是必须要在系统配置的路径下执行
echo $PATH查看系统配置路径
- 问题四:可不可以都 root
不行,看内核态的总结
权限架构思想
- 优秀的权限架构主要目标是让系统安全、稳定且用户、程序之间相互制约、相互隔离。这要求权限系统 中的权限划分足够清晰,分配权限的成本足够低。
- 优秀的架构,应该遵循最小权限原则(Least Privilege)。权限设计需要保证系统的安全和稳 定。 如果执行最小权限原则,那么黑客即便攻破我们的 MySQL 服务,他 也只能获得最小的权限。
- 如果使用root用户执行程序的时候,被黑客攻破, 那么后果是很严重的。
分级保护
Linux 提供了权限包围的能力。比如一个应用,临时需要高级权限,可以利用交互界面(比如让用户输 入 root 账户密码)验证身份,然后执行需要高级权限的操作,然后马上恢复到普通权限工作。这样做可 以减少应用在高级权限的时间,并做到专权专用,防止被恶意程序利用。
- 因为内核可以直接操作内存和 CPU,因此非常危险。
- 用户权限管理指令文章
网络 (待补)
-
远程登录的 ssh 指令;
-
远程拷贝文件的 scp 指令;
-
查看网络接口的 ifconfig 指令;
-
查看网络状态的 netstat 指令;
-
测试网络延迟的 ping 指令;
-
可以交互式调试和服务端的 telnet 指令;
-
两个 DNS 查询指令 host 和 dig;
-
可以发送各种请求包括 HTTPS 的 curl 指令。
软件的安装 (安装Nginx 待补充)
分析web 日志 (看pdf)
查看用 less 因为太多了 比如nginx的access_lo日志
左到右依次是: IP 地址;时间;HTTP 请求的方法、路径和协议版本、返回的状态码;User Agent
根据今天的 access_log 分析出有哪些终端访问了这个网站,并给出分组统计结果。
根据今天的 access_log 分析出访问量 Top 前三的网页
问题
rm / -rf 的作用是什么?
/是文件系统根目录; rm是删除指令; -r是 recursive(递归); -f是 force(强制),遇到只读文件也不提示,直接删除。 所以rm -rf /就是删除整个文件系统上的所有文件,而且不用给用户提示。
搜索文件系统中所有以包含std字符串且以.h扩展名结尾的文件。
sudo find / -name "*std*.h"sudo find / -name "*.h" |grep std
xargs指令的作用是什么?
xargs 将标准输入流中的字符串分割成一条条子字符串,然后再按照我们自己想要的方式构建 成一条条指令,大大拓展了 Linux 指令的能力。 比如我们可以用来按照某种特定的方式逐个处理一个目录下所有的文件;根据一个 IP 地址列表逐个 ping 这些 IP,收集到每个 IP 地址的延迟等
请问下面这段 Shell 程序的作用是什么?
mkfifo pipe1
mkfifo pipe2
echo -n run | cat - pipe1 > pipe2 &
cat <pipe2 > pipe1
请简述 Linux 权限划分的原则?
【解析】 Linux 遵循最小权限原则。 1.每个用户掌握的权限应该足够小,每个组掌握的权限也足够小。实际生产过程中,最好管理员权限 可以拆分,互相牵制防止问题。 2.每个应用应当尽可能小的使用权限。最理想的是每个应用单独占用一个容器(比如 Docker),这 样就不存在互相影响的问题。即便应用被攻破,也无法攻破 Docker 的保护层。 3.尽可能少的root。如果一个用户需要root能力,那么应当进行权限包围——马上提升权限(比如 sudo),处理后马上释放权限。 4.系统层面实现权限分级保护,将系统的权限分成一个个 Ring,外层 Ring 调用内层 Ring 时需要内 层 Ring 进行权限校验。
如果一个目录是只读权限,那么这个目录下面的文件还可写吗?
- 该权限 然后 换user1 echo >> 写和 cat读 分别进行测试
只读是指 r-- 还是 r-x,后者才能写目录下的文件.
如何查看一个域名有哪些 NS 记录了
host 指令提供了一个-t参数指定需要查找的记录类型。我们可以使用host -t ns {网址}。 另外 dig 也提供了同样的能力。如果你感兴趣,还可以使用man对系统进行操作。
【问题】 如何查看正在 TIME_WAIT 状态的连接数量?
【解析】 注意,这里有个小坑,就是 netstat 会有两行表头,这两行可以用 tail 过滤掉,下面tail -n +3就是告诉你 tail 从第 3 行开始显示。-a代表显示所有的 socket。 netstat -a | tail -n +3 | wc -l
根据今天的 access_log 分析出有哪些终端访问了这个网站,并给出分组统计结果。
编译安装和包管理安装有什么优势和劣势了吗?
包管理安装很方便,但是有两点劣势 第一点是需要提前将包编译好,因此有一个发布的过程,如果某个包没有发布版本,或者在某个平台上找不到对应的发布版本,就需要编译安装,第二点就是如果一个软件的定制程度很高,可能会在编译阶段传入参数,比如利用configure传入配置参数,这种时候就需要编译安装