Linux命令积累
https://www.pdai.tech/md/devops/linux/linux.html
1、Linux文件管理
1、创建一个文本文件[i-进入编辑模式] vi filename2、统计文件的行数、单词数、字符数[支持多个文件统计] wc filename1 [filename2] [filename3] 每一列的含义如下: 第一列:文件的总行数 第二列:单词数目 第三列:文件的字节数,即文件的大小 第四列:文件名3、主目录[登录后,你所在位置就是你的主目录] cd ~[username] [进入其他用户的主目录]4、当前目录 cd -5、绝对路径和相对路径 5-1、一个路径以 / 开头,就称为绝对路径;它表示当前文件与根目录的关系。 5-2、不以 / 开头的路径称为相对路径,它表示文件与当前目录的关系。6、创建目录 6-1、mkdir dirname1[该目录路径可以为绝对和相对] [dirname2]。 6-2、mkdir -p dirname #一级一级创建所需要的目录,即使上级目录不存在也不会报错。7、删除目录 rmdir dirname1 dirname2 dirname3 #删除目录时请确保目录为空,不会包含其他文件或目录。
2、Linux文件权限和访问模式
1、查看文件的权限 ls -11-1、第一列的字符可以分为三组,每一组有三个,每个字符都代表不同的权限,分别为读取(r)、写入(w)和执行(x): 第一组字符(2-4)表示文件所有者的权限,-rwxr-xr-- 表示所有者拥有读取(r)、写入(w)和执行(x)的权限。 第二组字符(5-7)表示文件所属用户组的权限,-rwxr-xr-- 表示该组拥有读取(r)和执行(x)的权限,但没有写入权限。 第三组字符(8-10)表示所有其他用户的权限,rwxr-xr-- 表示其他用户只能读取(r)文件。2、权限改变 [chmod] 2-1、使用符号表示权限 + 为文件或目录增加权限 - 删除文件或目录的权限 = 设置指定的权限 2-2、使用数字表示权限 w[写入]=2、x[执行]=1、r[读取]=4、 ==>7[rwx][所有权限]=4+2+13、更改所有者和用户组 chown [用户名/用户id] filelist chgrp [群组名/群组id] filelist4、SUID和SGID位 Linux 通过给程序设置SUID(Set User ID)和SGID(Set Group ID)位来赋予普通用户特殊权限。当我们运行一个带有SUID位的程序时,就会继承该程序所有者的权限;如果程序不带SUID位,则会根据程序使用者的权限来运行。
3、Linux环境变量
1、变量赋值时前面不能加 $ 符号,变量输出时必须要加 $ 前缀。退出 Shell 时,变量将消失。 $TEST="Linux Programming" $echo $TEST2、登录系统后,Shell会有一个初始化的过程,用来设置环境变量。这个阶段,Shell会读取 /etc/profile 和 .profile 两个文件,过程如下: 2-1、Shell首先检查 /etc/profile 文件是否存在,如果存在,就读取内容,否则就跳过,但是不会报错。 2-2、然后检查你的主目录(登录目录)中是否存在 .profile 文件,如果存在,就读取内容,否则就跳过,也不会报错。 2-3、读取完文件[/etc/profile、.profile],Shell才会出现$命令提示符。 /etc/profile: 包含了通用的Shell初始化信息,由Linux管理员维护,一般用户无权修改。 .profile: 改主目录下的 .profile 文件,增加一些"私人定制"初始化信息,包括: 设置默认终端类型和外观样式; 设置 Shell 命令查找路径,即PATH变量; 设置命令提示符。
4、Linux打印文件和发送邮件
1、Linux打印文件:大部分的Linux自带了 nroff 和 troff 两个强大的文本格式化工具[落后了]。
4-1、Linux打印文件-pr命令
1、pr命令[用来将文本文件转换成适合打印的格式,它可以把较大的文件分割成多个页面进行打印,并为每个页面添加标题。][但并不会更改文件本身] pr命令语法[pr option(s) filename(s)] 1-2、lp 和 lpr 命令将文件传送到打印机进行打印。使用 pr 命令将文件格式化后就可以使用这两个命令来打印。命令成功执行会返回一个表示打印任务的ID,通过这个ID可以取消打印或者查看打印状态。 1-3、希望打印多份文件,可以使用 lp 的 -nNum 选项,或者 lpr 命令的 -Num 选项。Num 是一个数字,可以随意设置。系统连接了多台打印机,可以使用 lp 命令的 -dprinter 选项,或者 lpr 命令的 -Pprinter 选项来选择打印机。printer 为打印机名称。
4-1-1、pr 命令的几个选项:
| 选项 |
说明 |
| -k |
分成几列打印,默认为1。 |
| -d |
两倍行距(并不是所有版本的 pr 都有效)。 |
| -h “header” |
设置每个页面的标题。 |
| -t |
不打印标题和上下边距。 |
| -l PAGE_LENGTH |
每页显示多少行。默认是每个页面一共66行,文本占56行。 |
| -o MARGIN |
每行缩进的空格数。 |
| -w PAGE_WIDTH |
多列输出时,设置页面宽度,默认是72个字符。 |
4-2、Linux打印文件-lpstat 和 lpq 命令
1、lpstat 和 lpq 命令 1-1、lpstat 命令可以查看打印机的缓存队列(有多少个文件等待打印),包括任务ID、所有者、文件大小、请求时间和请求状态。 提示:等待打印的文件会被放到打印机的的缓存队列中。 1-2、lpstat -o 命令按照打印顺序输出队列中的文件。2、lpq 命令显示的信息与 lpstat -o 稍有差异:3、cancel 和 lprm 分别用来终止 lp 和 lpr 的打印请求。使用这两个命令,需要指定ID(由 lp 或 lpq 返回)或打印机名称。
4-3、Linux发送邮件-mail命令
1、mail命令发送和接收邮件 $mail [-s 邮件标题] [-c 发送的用户-多个用逗号分隔] [-b 密件发送用户-多个用逗号分隔] to-addr2、重定向操作符[<]发送文件 $mail -s "Report 05/06/07" admin@yahoo.com < demo.txt3、接收邮件 $mail
5、Linux管道和过滤器
1、管道:把两个命令连起来使用,一个命令的输出作为另一个命令的输入。2、管道是Linux进程之间的一种重要的通信机制。3、管道建立:需要在两个命令之间使用竖线(|)连接。竖线左边命令的输出就会作为竖线右边命令的输入,以此类推。4、过滤器:能够接受数据,过滤(处理或筛选)后再输出的工具。
5-1、Linux管道-grep命令
1、grep : 强大的文本搜索工具,可以使用正则表达式,并返回匹配的行. 语法:$grep pattern file(s)2、在管道中使用grep命令,只允许包含指定字符的行输出到显示器: $ls -l | grep "Ceshi"
5-1-1、Linux管道-grep命令-参数选项
| 选项 |
说明 |
| -v |
反转查询,输出不匹配的行。例如,grep -v “test” demo.txt 将输出不包含”test”的行。 |
| -n |
输出匹配的行以及行号。 |
| -l |
输出匹配的行所在的文件名。 |
| -c |
输出匹配的总行数。 |
| -i |
不区分大小写进行匹配。 |
5-2、Linux管道-sort命令
1、sort命令:将文件中的各行按字母或数进行排序。sort命令既可以从特定的文件,也可以从stdin获取输入。 $sort food #对foot文件的各行进行排序
5-2-1、Linux管道-sort命令-参数选项
| 选项 |
描述 |
| -n |
按照数字大小排序,例如,10会排在2后面;-n 选项会忽略空格或 tab缩进。 |
| -r |
降序排序。sort 默认是升序排序。 |
| -f |
不区分大小写。 |
| +x |
对第x列(从0开始)进行排序。 |
5-3、Linux管道-pg和more命令
1、pg和more命令:分页显示,每次只显示一屏[当前窗口屏幕]。 $ls -l | grep "Aug" | sort +4n | more -rw-rw-r-- 1 carol doc 1605 Aug 23 07:35 macros -rw-rw-r-- 1 john doc 2488 Aug 15 10:51 intro -rw-rw-rw- 1 john doc 8515 Aug 6 15:30 ch07 -rw-rw-r-- 1 john doc 14827 Aug 9 12:40 ch03 . . . -rw-rw-rw- 1 john doc 16867 Aug 6 15:56 ch05 --More--(74%) 一次只显示一屏文本,显示满后,停下来,并提示已显示全部内容的百分比,按空格键(space)可以查看下一屏,按 b 键可以查看上一屏。
6、Linux进程管理
1、进程就是程序的实例。2、系统通过一个五位数字跟踪程序的运行状态,这个数字称为 pid 或进程ID。每个进程都拥有唯一的 pid。3、两个pid一样的进程不能同时存在,因为Linux会使用 pid 来跟踪程序的运行状态。
6-1、Linux进程管理-创建进程
1、创建进程,有两种方式来创建进程:前台进程和后台进程。 1-1、前台进程[默认情况下,用户创建的进程都是前台进程;前台进程从键盘读取数据,并把处理结果输出到显示器。] 1-2、查看前台进程运行过程,比如: ls 命令来遍历当前目录下的文件。 $ls ch*.doc ch01-1.doc ch010.doc ch02.doc ch03-2.doc ch04-1.doc ch040.doc ch05.doc ch06-2.doc ch01-2.doc ch02-1.doc 1-3、它会直接把结果输出到显示器。如果 ls 命令需要数据(实际上不需要),那么它会等待用户从键盘输入。 当程序运行在前台时,由于命令提示符($)还未出现,用户不能输入其他命令;即使程序需要运行很长时间,也必须等待程序运行结束才能输入其他命令。 1-4、后台进程[不必等待程序运行结束就可以输入其他命令。] 1-5、创建后台进程最简单的方式就是在命令的末尾加 & $ls ch*.doc &
6-2、Linux-进程管理-查看正在运行的进程
1、 ps 命令查看进程的运行状态,包括后台进程 $ps PID TTY TIME CMD 18358 ttyp3 00:00:00 sh 18361 ttyp3 00:01:31 abiword 18789 ttyp3 00:00:00 ps2、结合 -f 选项查看更多信息,f 是 full 的缩写 $ps -f UID PID PPID C STIME TTY TIME CMD amrood 6738 3662 0 10:23:03 pts/6 0:00 first_one amrood 6739 3662 0 10:22:54 pts/6 0:00 second_one amrood 3662 3657 0 08:10:53 pts/6 0:00 -ksh amrood 6892 3662 4 10:51:50 pts/6 0:00 ps -f
6-2-1、使用Ps -f命令展示列的简介
| 列 |
描述 |
| UID |
进程所属用户的ID,即哪个用户创建了该进程。 |
| PID |
进程ID。 |
| PPID |
父进程ID,创建该进程的进程称为父进程。 |
| C |
CPU使用率。 |
| STIME |
进程被创建的时间。 |
| TTY |
与进程有关的终端类型。 |
| TIME |
进程所使用的CPU时间。 |
| CMD |
创建该进程的命令。 |
6-2-2、 ps 命令-参数选项简介
| 选项 |
说明 |
| -a |
显示所有用户的所有进程。 |
| -x |
显示无终端的进程。 |
| -u |
显示更多信息,类似于 -f 选项。 |
| -e |
显示所有进程。 |
6-3、Linux-进程管理-终止进程
1、当进程运行在前台时,可以通过 kill 命令或 Ctrl+C 组合键来结束进程。2、如果进程运行在后台,那么首先要通过 ps 命令来获取进程ID,然后使用 kill 命令"杀死"进程。 $ps -f UID PID PPID C STIME TTY TIME CMD amrood 6738 3662 0 10:23:03 pts/6 0:00 first_one amrood 6739 3662 0 10:22:54 pts/6 0:00 second_one amrood 3662 3657 0 08:10:53 pts/6 0:00 -ksh amrood 6892 3662 4 10:51:50 pts/6 0:00 ps -f $kill 67383、忽略kill命令,可通过kill -9结束进程 $kill -9 6738
6-4、Linux-进程管理-父进程/子进程
1、每个 Linux 进程会包含两个进程ID:当前进程ID(pid)和父进程ID(ppid)。可以暂时认为所有的进程都有父进程。2、使用ps -f命令可以查看当前进程ID和父进程ID。
6-5、Linux-进程管理-孤儿进程/僵尸进程
1、孤儿进程:子进程被终止时会通过 SIGCHLD 信号通知父进程,父进程可以做一些清理工作或者重新启动一个新的进程。但在某些情况下,父进程会在子进程之前被终止,那么这些子进程就没有了"父亲"。2、init 进程会成为所有孤儿进程的父进程。init 的 pid 为1,是Linux系统的第一个进程,也是所有进程的父进程。3、僵尸进程:如果一个进程被终止了,但是使用 ps 命令仍然可以查看该进程,并且状态为 Z。4、一般僵尸进程很难杀掉,你可以先杀死他们的父进程,让他们变成孤儿进程,init 进程会自动清理僵尸进程。
6-6、Linux-进程管理-常驻进程
1、常驻进程一般是系统级进程,以 root 权限运行在后台,可以处理其他进程的请求。2、常驻进程没有终端,不能访问 /dev/tty 文件,如果使用 ps -ef 查看该进程,tty 这一列会显示问号(?)。
6-7、Linux-进程管理-Top命令
1、Top命令:可以动态显示正在运行的进程,还可以按照指定条件对进程进行排序,与Windows的任务管理器类似。2、top 命令可以显示进程的很多信息,包括物理内存、虚拟内存、CPU使用率、平均负载以及繁忙的进程等。
6-8、Linux-进程管理-任务Vs进程
1、任务(task)是最抽象的,指的是一系列共同达到某一目的的操作。一个任务既可以是一个进程,也可以是多个进程。2、进程(process)常常被定义为程序的执行。3、jobs命令:可以用来查看系统中正在运行的任务,包括后台运行的任务。该命令可以显示任务号及其对应的进程ID。一个任务可以对应于一个或者多个进程号。4、jobs 命令的 -l 选项可以查看当前任务包含的进程ID: $jobs -l 任务号 任务对应进程ID 任务运行状态 启动任务的命令
6-9、Linux-进程管理-前后台任务切换
1、fg命令:可以将后台任务调到前台。[$fg %jobs命令获取的后台任务的的序号,不是PID]2、bg命令:可以将后台暂停的任务,调到前台继续运行。[$bg %jobs命令获取的后台任务的的序号,不是PID]
7、Linux-网络通信工具
7-1、Linux-网络通信工具-ftp工具[包括很多命令]
1、ftp[File Transfer Protocol],文件传输协议,能够将文件上传到远程服务器,也可以从远程服务器下载文件。2、ftp命令: $ftp hostname or ip-address3、所有的上传和下载都是针对本地主机和远程主机的当前目录,如果你希望上传指定目录下的文件,首先要 cd 到该目录,然后才能上传。
7-1-1、FTP工具-相关命令简介
| ftp命令 |
说明 |
| put filename |
将本地文件上传到远程主机。 |
| get filename |
将远程文件下载到本地。 |
| mput file list |
将多个本地文件上传到远程主机。 |
| mget file list |
将多个远程文件下载到本地。 |
| prompt off |
关闭提示。默认情况下,使用 mput 或 mget 命令会不断提示你确认文件的上传或下载。 |
| prompt on |
打开提示。 |
| dir |
列出远程主机当前目录下的所有文件。 |
| cd dirname |
改变远程主机目录。 |
| lcd dirname |
改变本地目录。 |
| quit |
退出登录。 |
7-2、Linux-网络通信工具-finger工具[包括很多命令]
1、finger工具:查看本地主机或远程主机上的用户信息。有些系统为了安全会禁用 finger 命令。
8、Linux-命令-vi编辑器-简介
1、Linux下的文本编辑器有很多种,vi 是最常用的,也是各版本Linux的标配。注意,vi 仅仅是一个文本编辑器,可以给字符着色,可以自动补全,但是不像 Windows 下的 word 有排版功能。2、与 ed、ex 等其他编辑器相比,vi 对用户更加友好。3、可以使用 vi 编辑器编辑现有的文件,也可以创建一个新文件,还能以只读模式打开文本文件。4、vi filename [如果filename存在,则打开;否则会创建一个新文件再打开。]
8-1、vi编辑器-退出vi编辑器命令
1、q [如果文件未被修改,会直接退回到Shell;否则提示保存文件。]2、q! [强行退出,不保存修改内容。]3、wq [w 命令保存文件,q 命令退出 vi,合起来就是保存并退出。]4、ZZ [保存并退出,相当于 wq,但是更加方便。]5、退出之前,你也可以在 w 命令后面指定一个文件名,将文件另存为新文件 $w filename2 #将当前文件另存为 filename2。6、vi 编辑文件时,用户的操作都是基于缓冲区中的副本进行的。如果退出时没有保存到磁盘,则缓冲区中的内容就会被丢失。
8-2、vi编辑器-移动光标
1、k [向上移动光标(移动一行)]2、j [向下移动光标(移动一行)]3、h [向左移动光标(移动一行)]4、i [向右移动光标(移动一行)]Tips: 1、vi 是区分大小写的,输入命令时注意不要锁定大写。 2、可以在命令前边添加一个数字作为前缀,例如,2j 将光标向下移动两行。 3、一定要在普通模式(按两次 Esc 键)下,为了不影响当前文件内容。
8-2-1、vi编辑器-移动光标-扩展简介
| 命令 |
说明 |
| 0 或 | |
将光标定位在一行的开头。 |
| $ |
将光标定位在一行的末尾。 |
| w |
定位到下一个单词。 |
| b |
定位到上一个单词。 |
| ( |
定位到一句话的开头,句子是以 ! . ? 三种符号来界定的。 |
| ) |
定位到一句话的结尾。 |
| { |
移动到段落开头。&&&&&& |
| } |
移动到段落结束。&&&&&&&&& |
| [[ |
回到段落的开头处。&&&&&&&&&& |
| ]] |
向前移到下一个段落的开头处。&&&&&&&&&& |
| n| |
移动到第 n 列(当前行)。 |
| 1G |
移动到文件第一行。 |
| G |
移动到文件最后一行。 |
| nG |
移动到文件第 n 行。 |
| :n |
移动到文件第 n 行。 |
| H |
移动到屏幕顶部。 |
| nH |
移动到距离屏幕顶部第 n 行的位置。 |
| M |
移动到屏幕中间。 |
| L |
移动到屏幕底部。 |
| nL |
移动到距离屏幕底部第 n 行的位置。 |
| :x |
x 是一个数字,表示移动到行号为 x 的行。 |
8-3、vi编辑器-控制命令
| 命令 |
描述 |
| CTRL+d |
向前滚动半屏 |
| CTRL+f |
向前滚动全屏 |
| CTRL+u |
向后滚动半屏 |
| CTRL+b |
向后滚动整屏 |
| CTRL+e |
向上滚动一行 |
| CTRL+y |
向下滚动一行 |
| CTRL+I |
刷新屏幕 |
8-4、vi编辑器-文件编辑命令
| 命令 |
描述 |
| i |
在当前光标位置之前插入文本 |
| I |
在当前行的开头插入文本 |
| a |
在当前光标位置之后插入文本 |
| A |
在当前行的末尾插入文本 |
| o |
在当前位置下面创建一行 |
| O |
在当前位置上面创建一行 |
8-5、vi编辑器-删除字符命令[命令前面添加一个数字前缀,表示重复操作的次数]
| 命令 |
说明 |
| x |
删除当前光标下的字符 |
| X |
删除光标前面的字符 |
| dw |
删除从当前光标到单词结尾的字符 |
| d^ |
删除从当前光标到行首的字符 |
| d$ |
删除从当前光标到行尾的字符 |
| D |
删除从当前光标到行尾的字符 |
| dd |
删除当前光标所在的行 |
8-6、vi编辑器-修改文本命令
| 命令 |
描述 |
| cc |
删除当前行,并进入编辑模式。 |
| cw |
删除当前字(单词),并进入编辑模式。 |
| r |
替换当前光标下的字符。 |
| R |
从当前光标开始替换字符,按 Esc 键退出。 |
| s |
用输入的字符替换当前字符,并进入编辑模式。 |
| S |
用输入的文本替换当前行,并进入编辑模式。 |
8-7、vi编辑器-复制粘贴命令
| 命令 |
描述 |
| yy |
复制当前行 |
| nyy |
复制n行 |
| yw |
复制一个字(单词) |
| nyw |
复制n行 |
| p |
将复制的文本粘贴到光标后面 |
| P |
将复制的文本粘贴到光标前面 |
8-8、vi编辑器-晋升命令
让你的工作更有效率。
8-1-1、vi编辑器-晋升命令-了解
| J |
将当前行和下一行连接为一行 |
| << |
将当前行左移一个单位(一个缩进宽度) |
| >> |
将当前行右移一个单位(一个缩进宽度) |
| ~ |
改变当前字符的大小写 |
| ^G |
Ctrl+G组合键可以显示当前文件名和状态 |
| U |
撤销对当前行所做的修改 |
| u |
撤销上次操作,再次按 ‘u’ 恢复该次操作 |
| :f |
以百分号(%)的形式显示当前光标在文件中的位置、文件名和文件的总行数 |
| :f filename |
将文件重命名为 filename |
| :w filename |
保存修改到 filename |
| :e filename |
打开另一个文件名为 filename 的文件 |
| :cd dirname |
改变当前工作目录到 dirname |
| :e # |
在两个打开的文件之间进行切换 |
| :n |
如果用 vi 打开了多个文件,可以使用 :n 切换到下一个文件 |
| :p |
如果用 vi 打开了多个文件,可以使用 :n 切换到上一个文件 |
| :N |
如果用 vi 打开了多个文件,可以使用 :n 切换到上一个文件 |
| :r file |
读取文件并在当前行的后边插入 |
| :nr file |
读取文件并在第 n 行后边插入 |
8-9、vi编辑器-查找命令
1、全文搜索:在普通模式(按两次 Esc 键)下输入 / 命令,这时状态栏(最后一行)出现"/"并提示输入要查找的字符串,回车即可。2、/ 命令是向下查找、? 命令是向上查找、n命令可以按相同的方向继续查找、 N 命令可以按相反的方向继续查找、3、希望搜索某行中的单个字符,可以使用 f 或 F 命令,f 向上搜索,F 向下搜索,并且会把光标定位到匹配的字符。4、使用 t 或 T 命令:t 命令向上搜索,并把光标定位到匹配字符的前面;T 命令向下搜索,并把光标定位到匹配字符的后面。5、搜索的字符串中可以包含一些有特殊含义的字符,如果希望搜索这些字符本身,需要在前面加反斜杠(\)。
8-9-1、vi编辑器-查找命令-特殊字符简介[部分]
| 字符 |
说明 |
| ^ |
匹配一行的开头 |
| . |
匹配一个字符 |
| * |
匹配0个或多个字符 |
| $ |
匹配一行的结尾 |
| [ ] |
匹配一组字符 |
8-10、vi编辑器-set命令
set 命令可以对 vi 编辑器进行一些设置。使用 set 命令需要进入命令模式。
8-10、vi编辑器-set命令-参数选项简介
| 命令 |
说明 |
| :set ic |
搜索时忽略大小写。 |
| :set ai |
设置自动缩进(自动对齐)。 |
| :set noai |
取消自动缩进(自动对齐)。 |
| :set nu |
显示行号。 |
| :set sw |
设置缩进的空格数,例如,将缩进空格数设置为4::set sw=4。 |
| :set ws |
循环搜索:如果直到文件末尾也没有查找到指定字符,那么会回到开头继续查找。 |
| :set wm |
设置自动换行,例如,设置距离边际2个字符时换行::set wm=2 。 |
| :set ro |
将文件类型改为只读。 |
| :set term |
输出终端类型。 |
| :set bf |
忽略输入的控制字符,如 BEL(响铃)、BS(退格)、CR(回车)等。 |
8-11、vi编辑器-命令运行
1、切换到命令模式,再输入 ! 命令即可运行 Linux 命令。 :! ls #保存文件前,如果希望查看该文件是否存在2、按任意键回到vi编辑器
8-12、vi编辑器-文件替换
1、切换到命令模式,再输入 s/ 命令即可对文本进行替换。2、语法::s/[检索的文本]/替换的文本/g[表示全局替换
8-13、vi编辑器-总结注意点[!!!]
1、输入冒号(:)进入命令模式,按两次 Esc 键进入普通模式。2、命令大小写的含义是不一样的。3、必须在编辑模式下才能输入内容。
9、Linux-文件系统
1、文件系统就是分区或磁盘上的所有文件的逻辑集合。
9-1、Linux-文件系统-常见目录-简介
| 目录 |
说明 |
| / |
根目录,只能包含目录,不能包含具体文件。 |
| /bin |
存放可执行文件。很多命令就对应/bin目录下的某个程序,例如 ls、cp、mkdir。/bin目录对所有用户有效。 |
| /dev |
硬件驱动程序。例如声卡、磁盘驱动等,还有如 /dev/null、/dev/console、/dev/zero、/dev/full 等文件。 |
| /etc |
主要包含系统配置文件和用户、用户组配置文件。 |
| /lib |
主要包含共享库文件,类似于Windows下的DLL;有时也会包含内核相关文件。 |
| /boot |
系统启动文件,例如Linux内核、引导程序等。 |
| /home |
用户工作目录(主目录),每个用户都会分配一个目录。 |
| /mnt |
临时挂载文件系统。这个目录一般是用于存放挂载储存设备的挂载目录的,例如挂载CD-ROM的cdrom目录。 |
| /proc |
操作系统运行时,进程(正在运行中的程序)信息及内核信息(比如cpu、硬盘分区、内存信息等)存放在这里。/proc目录伪装的文件系统proc的挂载目录,proc并不是真正的文件系统。 |
| /tmp |
临时文件目录,系统重启后不会被保存。 |
| /usr |
/user目下的文件比较混杂,包含了管理命令、共享文件、库文件等,可以被很多用户使用。 |
| /var |
主要包含一些可变长度的文件,会经常对数据进行读写,例如日志文件和打印队列里的文件。 |
| /sbin |
和 /bin 类似,主要包含可执行文件,不过一般是系统管理所需要的,不是所有用户都需要。 |
9-1、Linux-文件系统-常见文件管理命令
| Command |
Description |
| cat filename |
查看文件内容。 |
| cd dirname |
改变所在目录。 |
| cp file1 file2 |
复制文件或目录。 |
| file filename |
查看文件类型(binary, text, etc)。 |
| find filename dir |
搜索文件或目录。 |
| head filename |
显示文件的开头,与tail命令相对。 |
| less filename |
查看文件的全部内容,可以分页显示,比more命令要强大。 |
| ls dirname |
遍历目录下的文件或目录。 |
| mkdir dirname |
创建目录。 |
| more filename |
查看文件的全部内容,可以分页显示。 |
| mv file1 file2 |
移动文件或重命名。 |
| pwd |
显示用户当前所在目录。 |
| rm filename |
删除文件。 |
| rmdir dirname |
删除目录。 |
| tail filename |
显示文件的结尾,与head命令相对。 |
| touch filename |
文件不存在时创建一个空文件,存在时修改文件时间戳。 |
| whereis filename |
查看文件所在位置。 |
| which filename |
如果文件在环境变量PATH中有定义,那么显示文件位置。 |
9-1、Linux-文件系统-常见磁盘查看命令
1、df命令:[disk free],df -k 查看磁盘空间使用情况[以千字计] $df -k Filesystem 1K-blocks Used Available Use% Mounted on /dev/vzfs 10485760 7836644 2649116 75% / /devices 0 0 0 0% /devices2、各列展示字段介绍 2-1、Filesystem [代表文件系统对应的设备文件的路径名(一般是硬盘上的分区)。] 2-2、kbytes [分区包含的数据块(1024字节)的数目。] 2-3、used [已用空间。] 2-4、avail [可用空间。] 2-5、capacity [已用空间的百分比。] 2-6、Mounted on [文件系统挂载点。]3、可以结合 -h (human readable) 选项将输出信息格式化,让人更易阅读。 4、du命令:会显示每个目录所占用数据块。根据系统的不同,一个数据块可能是 512 字节或 1024 字节。 $du /etc 10 /etc/cron.d 126 /etc/default 6 /etc/dfs ...5、结合 -h 选项可以让信息显示的更加清晰: $du -h /etc 5k /etc/cron.d 63k /etc/default 3k /etc/dfs ...
9-2、Linux-文件系统-挂载文件系统
1、挂载是指将一个硬件设备(例如硬盘、U盘、光盘等)对应到一个已存在的目录上。 若要访问设备中的文件,必须将文件挂载到一个已存在的目录上, 然后通过访问这个目录来访问存储设备。2、Linux将所有的硬件设备看做文件,对硬件设备的操作等同于对文件的操作。3、挂载目录可以不为空,但挂载后这个目录下以前的内容将不可用。
9-2-1、Linux-文件系统-挂载文件系统-相关命令
1、mount命令:查看当前系统所在挂载的设备信息 $ mount /dev/vzfs on / type reiserfs (rw,usrquota,grpquota) proc on /proc type proc (rw,nodiratime) devpts on /dev/pts type devpts (rw)2、挂载文件系统,命令语法:[mount -t file_system_type[指定文件系统类型] device_to_mount directory_to_mount_to] $ mount -t iso9660 /dev/cdrom /mnt/cdrom #将 CD-ROM 挂载到 /mnt/cdrom 目录。3、卸载文件系统 $ umount
9-3、Linux-文件系统-用户和群组配额
1、用户和群组配额可以让管理员为每个用户或群组分配固定的磁盘空间。2、管理员有两种方式来分配磁盘空间: 2-1、软限制:如果用户超过指定的空间,会有一个宽限期,等待用户释放空间。 2-2、硬限制:没有宽限期,超出指定空间立即禁止操作。
9-3-1、Linux-文件系统-用户和群组配额-相关命令
| 命令 |
说明 |
| quota |
显示磁盘使用情况以及每个用户组的配额。 |
| edquota |
编辑用户和群组的配额。 |
| quotacheck |
查看文件系统的磁盘使用情况,创建、检查并修复配额文件。 |
| setquota |
设置配额。 |
| quotaon |
开启用户或群组的配额功能。 |
| quotaoff |
关闭用户或群组的配额功能。 |
| repquota |
打印指定文件系统的配额。 |
10、Linux文件存储结构
1、大部分的Linux文件系统(如ext2、ext3)规定,一个文件由目录项、inode和数据块组成: 1-1、目录项:包括文件名和inode节点 1-2、Inode: 文件索引节点,包含文件的基础信息以及数据块的指针 1-3、数据块:包含文件的具体内容
10-1、Linux文件存储结构-Inode
1、文件储存在硬盘上,硬盘的最小存储单位叫做"扇区"(Sector),每个扇区储存512字节(相当于0.5KB)。2、操作系统读取硬盘的时候,是一次性连续读取多个扇区,即一次性读取一个"块"(block)。这种由多个扇区组成的"块",是文件存取的最小单位。"块"的大小,最常见的是4KB,即连续八个 sector组成一个 block。3、文件数据都储存在"块"中,也就必须找到一个地方储存文件的元信息,比如文件的创建者、文件的创建日期、文件的大小等等。这种储存文件元信息的区域就叫做inode,中文译名为"索引节点"。4、inode包含文件的元信息,具体来说有以下内容: 4-1、文件的字节数。 4-2、文件拥有者的User ID。 4-3、文件的Group ID。 4-4、文件的读、写、执行权限。 4-5、文件的时间戳,共有三个:ctime指inode上一次变动的时间,mtime指文件内容上一次变动的时间,atime指文件上一次打开的时间。 4-6、链接数,即有多少文件名指向这个inode。 4-7、文件数据block的位置。5、查看某个文件的inode信息:[当查看某个文件时,会先从inode表中查出文件属性及数据存放点,再从数据块中读取数据。] stat命令:stat demo.txt6、inode也会消耗硬盘空间,所以硬盘格式化的时候,操作系统自动将硬盘分成两个区域。一个是数据区,存放文件数据;另一个是inode区(inode table),存放inode所包含的信息。7、每个inode节点的大小,一般是128字节或256字节。在格式化时就给定,一般是每1KB或每2KB就设置一个inode。
10-2、Linux文件存储结构-目录项
1、目录[directory]:也是一种文件。2、每个目录项,由两部分组成:所包含文件的文件名,以及该文件名对应的inode号码。3、ls命令只列出目录文件中的所有文件名。4、ls -i命令列出整个目录文件,即文件名和inode号码:
11、Linux-用户管理
1、Linux中,有三种用户: 1-1、Root 用户:也称为超级用户,对系统拥有完全的控制权限。超级用户可以不受限制的运行任何命令。Root 用户可以看做是系统管理员。 1-2、系统用户:系统用户是Linux运行某些程序所必须的用户,例如 mail 用户、sshd 用户等。系统用户通常为系统功能所必须的,不建议修改这些用户。 1-3、普通用户:一般用户都是普通用户,这些用户对系统文件的访问受限,不能执行全部Linux命令。2、Linux支持用户组,用户组就是具有相同特征的用户的集合。一个组可以包含多个用户,每个用户也可以属于不同的组。
11-1、Linux-用户管理-与用户和组有关的系统文件
1、与用户和组有关的系统文件: /etc/passwd [保存用户名和密码等信息,Linux系统中的每个用户都在/etc/passwd文件中有一个对应的记录行。这个文件对所有用户都是可读的。] /etc/shadow [/etc/shadow中的记录行和/etc/passwd中的相对应,他由pwconv命令根据/etc/passwd中的数据自动产生,它的格式和/etc/passwd类似,只是对密码进行了加密。并不是所有的系统都支持这个文件。] /etc/group [以记录行的形式保存了用户组的所有信息。]2、cat /etc/passwd文件字段介绍 用户名:密码:用户ID:组ID: 描述信息:用户主目录:用户Shell
11-1-1、Linux-用户管理-/etc/passwd文件字段介绍
| 字段 |
说明 |
| 用户名 |
用户名是惟一的,长度根据不同的linux系统而定,一般是8位。 |
| 密码 |
由于系统中还有一个/etc/shadow文件用于存放加密后的口令,所以在这里这一项是”x”来表示,如果用户没有设置口令,则该项为空。如果passwd字段中的第一个字符是”*”的话,那么,就表示该账号被查封了,系统不允许持有该账号的用户登录。 |
| 用户ID |
系统内部根据用户ID而不是用户名来识别不同的用户,用户ID有以下几种: - 0代表系统管理员,如果你想建立一个系统管理员的话,可以建立一个普通帐户,然后将该账户的用户ID改为0即可。 |
11-2、Linux-用户管理-管理用户和组
1、管理用户和组-常用命令 useradd [添加用户。] usermod [修改用户信息。] userdel [删除用户。] groupadd [添加用户组。] groupmod [修改用户组信息。] groupdel [删除用户组。]
11-2-1、管理用户和组-创建用户组命令
1、groupadd命令创建用户组的语法为:[不指定选项,系统将使用默认值] groupadd [-g gid [-o]] [-r] [-f] groupname2、参数选项含义 -g GID [以数字表示的用户组ID。] -o [可以使用重复的组ID。] -r [建立系统组,用来管理系统用户。] -f [强制创建。] groupname [用户组的名称.]
11-2-2、管理用户和组-修改用户组命令
$ groupmod -n new_modified_group_name old_group_name $ groupmod -n developer developer_2 #将用户组 developers_2 重命名为 developer$ groupmod -g 545 developer #将developer用户组的ID改为545:
11-2-3、管理用户和组-删除用户组命令
1、groupdel命令可以删除用户组[仅仅删除用户组,并不删除与之相关的文件,这些文件仍然可以被所有者访问] $ groupdel developer
11-2-4、管理用户和组-添加用户命令
1、添加用户,useradd命令,语法: useradd -d homedir -g groupname -m -s shell -u userid accountname2、选项含义: -d homedir [指定用户主目录。] -g groupname [指定用户组。] -m [如果主目录不存在,就创建。] -s shell [为用户指定默认Shell。] -u userid [指定用户ID。] accountname [用户名。]3、如果不指定任何选项,系统将使用默认值。useradd 命令将会修改 /etc/passwd、/etc/shadow、and /etc/group 三个文件,并创建用户主目录。4、添加用户前请确认 developers 用户组存在[!!!!!!]。
11-2-5、管理用户和组-修改用户命令
1、添加用户,useradd命令,语法: useradd -d homedir -g groupname -m -s shell -u -l userid accountname2、选项含义: -d homedir [指定用户主目录。] -g groupname [指定用户组。] -m [如果主目录不存在,就创建。] -s shell [为用户指定默认Shell。] -u userid [指定用户ID。] accountname [用户名。] -l [更改用户名]3、$ usermod -d /home/mcmohd20 -m -l mcmohd mcmohd20 #将用户 mcmohd 的用户名修改为 mcmohd20,主目录修改为 /home/mcmohd20
11-2-6、管理用户和组-删除用户命令
1、userdel 命令可以用来删除现有用户。userdel 是一个危险的命令,请谨慎使用。2、userdel 命令仅有一个选项 -r,用来删除用户主目录和本地邮件。
12、Linux-系统性能分析
1、一般使用一些性能分析工具(命令),来监控系统资源使用情况、2、Linux中需要监控的资源主要有 CPU、主存(内存)、硬盘空间、I/O时间、网络时间、应用程序等。3、一般认为用户态CPU和内核态CPU花费的时间小于70%时是良好状态。
12-1、Linux-系统性能分析-影响系统性能因素分析[主要]
| 因素 |
说明 |
| 用户态CPU |
CPU在用户态运行用户程序所花费的时间,包括库调用,但是不包括内核花费的时间。 |
| 内核态CPU |
CPU在内核态运行系统服务所花费的时间。所有的 I/O 操作都需要调用系统服务,程序员可以通过阻塞 I/O 传输来影响这部分的时间。 |
| I/O 时间和网络时间 |
响应 I/O 请求、处理网络连接所花费的时间。 |
| 内存 |
切换上下文和交换数据(虚拟内存页导入和导出)花费的时间。 |
| 应用程序 |
程序等待运行的时间——CPU正在运行其他程序,等待切换到当前程序。 |
12-2、Linux-系统性能分析-监控系统性能-命令
1、常用命令组合: 1-1、vmstat、sar、mpstat检测是否存在CPU瓶颈; 1-2、vmstat、free检测是否存在内存瓶颈; 1-3、iostat检测是否存在磁盘I/O瓶颈; 1-4、netstat检测是否存在网络I/O瓶颈。
| 命令 |
说明 |
| nice |
启动程序时指定进程优先级。 |
| renice |
调整现有进程的优先级。 |
| netstat |
显示各种网络相关信息,包括网络连接情况、路由表、接口状态(Interface Statistics)、masquerade 连接、多播成员 (Multicast Memberships)等。实际上,netstat 用于显示与IP、TCP、UDP和ICMP协议相关的统计数据,一般用于检验本机各端口的网络连接情况。 |
| time |
检测一个命令运行时间以及资源(CPU、内存、I/O等)使用情况。 |
| uptime |
查看系统负载情况。 |
| ps |
查看系统中进程的资源使用情况(瞬时状态,不是动态监控)。 |
| vmstat |
报告虚拟内存使用情况。 |
| gprof |
精确分析程序的性能,能给出函数调用时间、调用次数、调用关系等。 |
| top |
实时监控系统中各个进程资源的资源使用情况。 |
13、Linux-系统日志及日志分析
1、大部分Linux发行版默认的日志守护进程为 syslog,位于 /etc/syslog 或 /etc/syslogd,默认配置文件为 /etc/syslog.conf,任何希望生成日志的程序都可以向 syslog 发送信息。 2、默认配置下,日志文件通常都保存在"/var/log"目录下。
13-1、Linux-系统日志及日志分析-常见日志类型[有的版本可能不支持]
| 类型 |
说明 |
| auth |
用户认证时产生的日志,如login命令、su命令。 |
| authpriv |
与 auth 类似,但是只能被特定用户查看。 |
| console |
针对系统控制台的消息。 |
| cron |
系统定期执行计划任务时产生的日志。 |
| daemon |
某些守护进程产生的日志。 |
| ftp |
FTP服务。 |
| kern |
系统内核消息。 |
| local0.local7 |
由自定义程序使用。 |
| lpr |
与打印机活动有关。 |
| mail |
邮件日志。 |
| mark |
产生时间戳。系统每隔一段时间向日志文件中输出当前时间,每行的格式类似于 May 26 11:17:09 rs2 — MARK —,可以由此推断系统发生故障的大概时间。 |
| news |
网络新闻传输协议(nntp)产生的消息。 |
| ntp |
网络时间协议(ntp)产生的消息。 |
| user |
用户进程。 |
| uucp |
UUCP子系统。 |
13-2、Linux-系统日志及日志分析-常见日志优先级
| 优先级 |
说明 |
| emerg |
紧急情况,系统不可用(例如系统崩溃),一般会通知所有用户。 |
| alert |
需要立即修复,例如系统数据库损坏。 |
| crit |
危险情况,例如硬盘错误,可能会阻碍程序的部分功能。 |
| err |
一般错误消息。 |
| warning |
警告。 |
| notice |
不是错误,但是可能需要处理。 |
| info |
通用性消息,一般用来提供有用信息。 |
| debug |
调试程序产生的信息。 |
| none |
没有优先级,不记录任何日志消息。 |
13-3、Linux-系统日志及日志分析-常见日志文件
1、所有的系统应用都会在 /var/log 目录下创建日志文件,或创建子目录再创建日志文件。
| 文件/目录 |
说明 |
| /var/log/boot.log |
开启或重启日志。 |
| /var/log/cron |
计划任务日志 |
| /var/log/maillog |
邮件日志。 |
| /var/log/messages |
该日志文件是许多进程日志文件的汇总,从该文件可以看出任何入侵企图或成功的入侵。 |
| /var/log/httpd 目录 |
Apache HTTP 服务日志。 |
| /var/log/samba 目录 |
samba 软件日志 |
13-3-1、Linux-系统日志及日志分析-/etc/syslog.conf文件
1、/etc/syslog.conf 文件:是 syslog 的配置文件,会根据日志类型和优先级来决定将日志保存到何处。2、标准文件内容有: *.err;kern.debug;auth.notice /dev/console daemon,auth.notice /var/log/messages lpr.info /var/log/lpr.log mail.* /var/log/mail.log ftp.* /var/log/ftp.log auth.* @see.xidian.edu.cn auth.* root,amrood netinfo.err /var/log/netinfo.log install.* /var/log/install.log *.emerg * *.alert |program_name mark.* /dev/console3、标准文件内容简介:第一列为日志类型和日志优先级的组合,每个类型和优先级的组合称为一个选择器;后面一列为保存日志的文件、服务器,或输出日志的终端。4、配置文件内容说明: 4-1、日志类型和优先级由点号(.)分开,例如 kern.debug 表示由内核产生的调试信息。 4-2、kern.debug 的优先级大于 debug。 4-3、星号(*)表示所有,例如 *.debug 表示所有类型的调试信息,kern.* 表示由内核产生的所有消息。 4-4、可以使用逗号(,)分隔多个日志类型,使用分号(;)分隔多个选择器。5、对日志的操作包括: 5-1、将日志输出到文件,例如 /var/log/maillog 或 /dev/console。 5-2、将消息发送给用户,多个用户用逗号(,)分隔,例如 root, amrood。 5-3、通过管道将消息发送给用户程序,注意程序要放在管道符(|)后面。 5-4、将消息发送给其他主机上的 syslog 进程,这时 /etc/syslog.conf 文件后面一列为以@开头的主机名,例如@see.xidian.edu.cn。
13-3-2、Linux-系统日志及日志分析-logger命令
1、logger命令,可使用 syslog 的系统日志模块,还可以从命令行直接向系统日志文件写入一行信息。2、logger命令,语法为: logger [-i] [-f filename] [-p priority] [-t tag] [message...]3、语法参数简介: -f filename [将 filename 文件的内容作为日志。] -i [每行都记录 logger 进程的ID。] -p priority [指定优先级;优先级必须是形如 facility.priority 的完整的选择器,默认优先级为 user.notice。] -t tag [使用指定的标签标记每一个记录行。] message [要写入的日志内容,多条日志以空格为分隔;如果没有指定日志内容,并且 -f filename 选项为空,那么会把标准输入作为日志内容。]4、$ ping 192.168.0.1 | logger -it logger_test -p local3.notice& #将ping命令的输出到 /var/log/userlog 文件5、命令 logger -it logger_test -p local3.notice 各选项的含义: -i:在每行都记录进程ID; -t logger_test:每行记录都加上"logger_test"这个标签; -p local3.notice:设置日志类型和优先级。
13-4、Linux-系统日志及日志分析-日志转储
1、日志转储:日志回卷或日志轮转。2、syslog 只负责接收日志并保存到相应的文件,但不会对日志文件进行管理。3、大多数Linux发行版使用 logrotate 或 newsyslog 对日志进行管理。logrotate 程序不但可以压缩日志文件,减少存储空间,还可以将日志发送到指定 E-mail,方便管理员及时查看日志。4、每次转存都会创建一个新文件(如果不存在),命名格式为日志文件名加一个数字(从1开始自动增长),以保持当前日志文件和转存后的日志文件不超过指定大小。5、logrotate 的主要配置文件是 /etc/logrotate.conf,/etc/logrotate.d 目录是对 /etc/logrotate.conf 的补充,或者说为了不使 /etc/logrotate.conf 过大而设置。
13-4-1、Linux-系统日志及日志分析-日志转储-/etc/logrotate.conf文件
$cat /etc/logrotate.conf# see "man logrotate" for details //可以查看帮助文档# rotate log files weeklyweekly //设置每周转储一次# keep 4 weeks worth of backlogsrotate 4 //最多转储4次# create new (empty) log files after rotating old onescreate //当转储后文件不存储时创建它# uncomment this if you want your log files compressed#compress //以压缩方式转储# RPM packages drop log rotation information into this directoryinclude /etc/logrotate.d //其他日志文件的转储方式,包含在该目录下# no packages own wtmp -- we'll rotate them here/var/log/wtmp { //设置/var/log/wtmp日志文件的转储参数 monthly //每月转储 create 0664 root utmp //转储后文件不存在时创建它,文件所有者为root,所属组为utmp,对应的权限为0664 rotate 1 //最多转储一次}
14、Linux-信号机制与信号处理
1、信号(signal)是Linux进程间通信的一种机制,全称为软中断信号,也被称为软中断。2、信号本质上是在软件层次上对硬件中断机制的一种模拟。3、每种信号用一个整型常量宏表示,以SIG开头,比如SIGCHLD、SIGINT等,它们在系统头文件<signal.h>中定义。4、信号由内核(kernel)管理,产生方式多种多样:
14-1、Linux-信号机制与信号处理-常见信号种类
kill -l 命令可以查看系统支持的所有信号。
| 信号名称 |
数字表示 |
说明 |
| SIGHUP |
1 |
终端挂起或控制进程终止。当用户退出Shell时,由该进程启动的所有进程都会收到这个信号,默认动作为终止进程。 |
| SIGINT |
2 |
键盘中断。当用户按下组合键时,用户终端向正在运行中的由该终端启动的程序发出此信号。默认动作为终止进程。 |
| SIGQUIT |
3 |
键盘退出键被按下。当用户按下或组合键时,用户终端向正在运行中的由该终端启动的程序发出此信号。默认动作为退出程序。 |
| SIGFPE |
8 |
发生致命的运算错误时发出。不仅包括浮点运算错误,还包括溢出及除数为0等所有的算法错误。默认动作为终止进程并产生core文件。 |
| SIGKILL |
9 |
无条件终止进程。进程接收到该信号会立即终止,不进行清理和暂存工作。该信号不能被忽略、处理和阻塞,它向系统管理员提供了可以杀死任何进程的方法。 |
| SIGALRM |
14 |
定时器超时,默认动作为终止进程。 |
| SIGTERM |
15 |
程序结束信号,可以由 kill 命令产生。与SIGKILL不同的是,SIGTERM 信号可以被阻塞和终止,以便程序在退出前可以保存工作或清理临时文件等。 |
14-2、Linux-信号机制与信号处理-信号发送
1、有多种方式可以向程序或脚本发送信号。比如:按下<Ctrl+C>组合键会发送SIGINT信号,终止当前进程。2、kill 命令发送信号,语法:$ kill -[要发送的信号[信号名词/数组]] pid[接收信号的进程ID]
14-3、Linux-信号机制与信号处理-信号捕获
1、捕获ixnhao,可以先进行清场和保存处理,再退出程序。2、用户程序可以通过C/C++等代码捕获信号,也可以通过Linux命令捕获信号。 2-1、trap命令,语法:$trap [系统命令/用户自定义命令] [要捕获的信号[信号名称/数字]] 2-2、捕获到信号后,可以有三种处理: 执行一段脚本来做一些处理工作,例如清理临时文件; 接受(恢复)信号的默认操作; 忽略当前信号。 2-3、比如:清理临时文件,[exit 命令是必须的,否则脚本捕获到信号后会继续执行而不是退出。] $ trap "rm -f $WORKDIR/work1$$ $WORKDIR/dataout$$; exit" 2 #当用户按下<Ctrl+C>后,脚本先清理临时文件 work1和dataout,再退出。 2-4、几点注意: 2-4-1、如果执行多个命令,需要将命令用引号包围; 2-4-2、只有脚本执行到 trap 命令时才会捕获信号; 2-4-3、再次接收到信号时还会执行同样的操作。 2-4-4、exit 命令是必须的,否则脚本捕获到信号后会继续执行而不是退出。3、忽略信号:trap 命令的 commands 为空,将会忽略接收到的信号,即不做任何处理,也不执行默认动作。 3-1、忽略多个信号[必须被引号包围][!!!]:$ trap '' 1 2 3 15
Blog: https://blog.csdn.net/qq_41781322/article/details/79520181movis