Menu

  • Home
  • Work
    • Cloud
      • Virtualization
      • IaaS
      • PaaS
    • Java
    • Go
    • C
    • C++
    • JavaScript
    • PHP
    • Python
    • Architecture
    • Others
      • Assembly
      • Ruby
      • Perl
      • Lua
      • Rust
      • XML
      • Network
      • IoT
      • GIS
      • Algorithm
      • AI
      • Math
      • RE
      • Graphic
    • OS
      • Linux
      • Windows
      • Mac OS X
    • BigData
    • Database
      • MySQL
      • Oracle
    • Mobile
      • Android
      • IOS
    • Web
      • HTML
      • CSS
  • Life
    • Cooking
    • Travel
    • Gardening
  • Gallery
  • Video
  • Music
  • Essay
  • Home
  • Work
    • Cloud
      • Virtualization
      • IaaS
      • PaaS
    • Java
    • Go
    • C
    • C++
    • JavaScript
    • PHP
    • Python
    • Architecture
    • Others
      • Assembly
      • Ruby
      • Perl
      • Lua
      • Rust
      • XML
      • Network
      • IoT
      • GIS
      • Algorithm
      • AI
      • Math
      • RE
      • Graphic
    • OS
      • Linux
      • Windows
      • Mac OS X
    • BigData
    • Database
      • MySQL
      • Oracle
    • Mobile
      • Android
      • IOS
    • Web
      • HTML
      • CSS
  • Life
    • Cooking
    • Travel
    • Gardening
  • Gallery
  • Video
  • Music
  • Essay

Linux命令知识集锦

15
Apr
2008

Linux命令知识集锦

By Alex
/ in Linux
/ tags Command, Linux知识
0 Comments
Shell基本知识
Shell快捷键
 快捷键 用途
ctrl + z

暂停当前程序,回到shell,注意当前任务不会被终止,只是被挂起(在jobs命令的输出中显示为Stopped)。
例如,在执行vim编辑的时候,可以按Ctrl+Z挂起(stdout将显示jobnumber),回到Shell执行命令,然后输入fg继续vim编辑

注意:挂起的任务不再参与进程调度,要让一个任务在后台持续运行,可以使用 & 后缀调用一个任务的命令行,或者在挂起后对其作业号运行bg命令

ctrl + c 停止当前程序,回到shell
ctrl + d 发送EOF
ctrl + r 快速搜索命令历史,比上下箭头高效
ctrl + s 使快速刷屏的终端界面静止下来
ctrl + q 恢复ctrl + s的造成的效果
ctrl + a 光标移动到行首
ctrl + e 光标移动到行尾
ctrl + u 从光标位置删除到行首
ctrl + k 从光标位置删除到行尾
backspace 向前删除一个字符
ctrl + d 向后删除一个字符
alt + backspace 向前删除一个单词
alt + d 向后删除一个单词
后台运行命令
Shell
1
2
3
4
5
6
7
8
9
#下面的命令将在后台运行
./command.sh &
#下面的命令将不挂掉的在后台运行,标准输出被重定向到nohup.out,即使当前终端退出任然继续运行
 
#nohup命令可以忽略所有挂断(SIGHUP)信号
nohup ./command.sh &
 
#忽略标准输出、错误。 0 1 2 分别表示标准输入、输出、错误,2>&1表示把标准错误重定向到标准输出,而前者已经重定向到空设备
nohup ./command > /dev/null 2>&1 &
Tmux
子命令
Shell
1
2
3
4
5
6
7
8
9
10
# 列出当前Tmux服务中有哪些会话
tmux ls
# dev-120: 1 windows (created Fri Feb 23 19:57:35 2018) [180x49] (attached)
 
# 连接到会话
tmux a -t dev-120
 
# 命令
# 在当前位置插入新窗口
new-window -a
快捷键

所有快捷键必须在按下前缀键后才能使用,前缀键默认Ctrl + B

快捷键 说明
" 垂直方向拆分面板
% 水平方向拆分面板
o 切换到当前窗口的下一个面板
PgUp 启用Page Up/Down滚动,按Q退出滚动模式
$ 重命名当前会话
, 重命名当前窗口
. 修改窗口编号
s 列出所有会话,通过j,k,回车切换
c 创建新窗口
<N> 切换到第N-1个窗口
p 切换到上一个窗口
n 切换到下一个窗口
! 创建一个新窗口,并把当前面板置于其中
Space 切换面板布局
d 从当前会话断开,回到父Shell
D 选择一个会话以断开
Shift + Mouse1 选中文本,可以进行复制
:

输入命令,示例:set-option -g history-limit 100000

文件与目录命令
命令  说明
ls

列出目录中的文件

格式:
ls [OPTION]... [FILE]...

选项:
-a, --all 包含.号开始的文件
-A, --almost-all 包含除了.和..以外的任何文件
--author 与-l联用 打印文件的作者
-b, --escape 使用C-style转义来显示不可见字符
--block-size=SIZE 使用block size来显示尺寸
-B, --ignore-backups 忽略~结尾的备份文件
-c -lt:根据最后修改时间排序 -l: show 显示修改时间并按名称排序
-C 按列显示
--color[=always|never|auto] 输出语法高亮配置 
-d, --directory 显示目标,而不是其内容,不解引用符号链接
-f 禁止排序
-F, --classify 附加指示器(*/=>@|) 到所有条目
--file-type 类似上面,只是不附加*
--format=WORD 格式:across -x, commas -m, horizontal -x, long -l, single-column -1, verbose -l, vertical -C
--full-time 类似-l --time-style=full-iso
-g 类似-l, 但是不显示所有者
--group-directories-first 在文件前显示目录,与--sort一起使用
-G, --no-group 在long listing时不显示组名
-h, --human-readable 与-l联用,使用易于人类阅读的方式显示尺寸
--si 与上面类似,但是计算倍数时使用1000而非1024
-H, --dereference-command-line Follow符号链接
--dereference-command-line-symlink-to-dir Follow指向目录的符号链接链接
--hide=PATTERN 隐藏所有匹配PATTERN的条目(被-a或-A覆盖)
-i, --inode 显示文件的索引号
-I, --ignore=PATTERN 隐藏所有匹配PATTERN的条目
-k 类似--block-size=1K
-l 使用长格式
-L, --dereference 显示符号链接的信息时,显示目标文件,而不是符号链接本身的信息
-n, --numeric-uid-gid 类似-l,但是列出用户和组标识符
-N, --literal 打印原始文件名
-o 类似-l,但是不列出组信息
-p, --indicator-style=slash 附加斜线到目录
-q, --hide-control-chars 打印?来代替控制字符
--show-control-chars 显示控制字符
-Q, --quote-name 在双引号中包含条目
-r, --reverse 排序时反转顺序(由降序改为升序)
-R, --recursive 递归的列出目录
-s, --size 打印文件实际分配尺寸,以块为单位
-S 根据文件尺寸排序
--sort=WORD 根据指定方式排序。无:-U, 扩展名:-X, 尺寸:-S,时间:-t,版本:-v
-t 根据修改时间排序
-T, --tabsize=COLS TAB的尺寸,默认8
-U 不进行排序
-w, --width=COLS 假设屏幕宽度
-x 按行列出条目
-X 根据扩展名排序 

举例:

Shell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 设置时间格式
ls -l --time-style '+%Y-%m-%d %H:%M:%S'
# 可以修改文件vim ~/.bashrc,添加以下内容:
# alias ll='ls -alF --time-style "+%Y-%m-%d %H:%M:%S"'
# 对所有以后登陆的Terminal均生效
 
# 根据修改时间降序排列
ll -t
# 根据修改时间升序排列
ll -tr
# 根据文件尺寸升序排列
ll -Sr
 
# 需要注意文件尺寸和实际分配空间可能不一致
# 下面生成的文件,尺寸是10G,但是实际分配空间仅4K
dd if=/dev/zero of=/tmp/data.img bs=1K count=1 seek=10M
ls -lsh /tmp
# 4.0K -rw-r--r-- 1 root root 11G Jun 3 15:04 data.img
vdir

显示详细的目录列表, 与 ls -l 的效果类似

cp

拷贝文件到目标文件,或者拷贝若干文件到目录
格式:
cp [OPTION]... [-T] SOURCE DEST
cp [OPTION]... SOURCE... DIRECTORY
cp [OPTION]... -t DIRECTORY SOURCE...

选项:
-a, --archive 等价于 -dR --preserve=all
--attributes-only 不拷贝文件内容,只拷贝其属性
-b, --backup 对每个DEST文件进行备份
-d 等价于 --no-dereference --preserve=links
-f, --force 如果DEST文件不能打开,移除其并重试,使用-n时无效
-i, --interactive 在覆盖DEST文件前进行提示
-H 仅跟随(解引用)命令行指定的SOURCE本身的符号连接,递归(-R)的子文件不跟随
-l, --link 硬链接而不是拷贝文件
-L, --dereference 总是跟随(解引用)SOURCE 的符号连接
-n, --no-clobber 不覆盖已经存在的DEST文件,覆盖-i
-P, --no-dereference 绝不跟随(解引用)SOURCE 的符号连接
-p 等价于 --preserve=mode,ownership,timestamps
--preserve[=ATTR_LIST] 维持指定的文件属性
--no-preserve=[ATTR_LIST] 清除指定的属性
-R, -r, --recursive 递归的拷贝目录
--remove-destination 尝试打开目标文件前,删除它,与-f对比
-s, --symbolic-link 创建符号连接,而不是拷贝
-S, --suffix=SUFFIX 指定备份文件的后缀,默认~
-t, --target-directory=DIRECTORY 拷贝所有源文件到目标目录
-T, --no-target-directory 将DEST作为普通文件看待,可用于覆盖目标目录
-u, --update 如果目标文件不存在,或者源文件时间更新,才执行拷贝

举例:

Shell
1
2
3
4
5
6
7
8
9
10
11
12
13
cd ~/Test
mkdir src && mkdir src/sub && mkdir dest
echo FILE1_SRC > src/file1 && echo SUBFILE1_SRC > src/sub/subfile1
touch dest/file1
 
cp src/file1 dest/               #dest/file1被覆盖,但是inode维持不变
cp src/file1 dest/file1_src      #直接指定DEST为文件
 
#复制src目录及其所有内容到dest目录,如果src本身是一个指向目录的符号链接
#则进行解引用,如果src的子目录是符号链接,则仅仅在dest下创建相同的符号链接
cp -R -H src/ dest/
#与上一个类似,但是所有src子目录的符号链接也被解引用
cp -R -H src/ dest/
mv

文件移动命令,移动文件的位置,移动多个文件到目录中,或者将目录重命名

该命令的行为:

  1. 如果目标位置是当前文件系统,则执行rename系统调用,将inode关联到新的目录项,文件本身(inode,文件系统级别概念)没有任何变化
  2. 如果目标位置是其它文件系统,则实际上是拷贝数据并在目标文件系统创建inode。然后,旧文件被unlink(解除和目录项的关联),如果没有打开的文件描述符则删除inode

进程打开文件后,系统会返回文件描述符给它。不管何种情况下,mv都不会导致这些已经打开的文件描述符失效。也就是mv不影响已经打开文件的进程使用文件

格式:
mv [OPTION]... [-T] SOURCE DEST
mv [OPTION]... SOURCE... DIRECTORY
mv [OPTION]... -t DIRECTORY SOURCE...

选项:
--backup[=CONTROL] 对每一个DEST文件进行备份
-b 与上面类似,但是不支持指定参数
-f, --force 覆盖DEST前不进行提示
-i, --interactive 覆盖DEST前进行提示
-n, --no-clobber 不覆盖已经存在的文件
-S, --suffix=SUFFIX 备份文件的后缀
-t, --target-directory=DIRECTORY 移动所有文件到目标目录
-T, --no-target-directory 将DEST作为文件看待
-u, --update 只有当目标不存在,或者源比较新的时候,才移动

Shell
1
2
3
4
5
6
7
8
9
cd ~/Test
mkdir src && mkdir src/sub && mkdir dest
echo FILE1_SRC > src/file1 && echo SUBFILE1_SRC > src/sub/subfile1
 
mv src/file1 dest      #把单个文件移动到目标目录
mv src/file1 destfile  #把单个文件移动到目标文件,如果目标文件已存在,则覆盖
 
mv src   dest          #把src目录移动作为dest的子目录
mv src/* dest          #把src目录下所有内容移动到dest目录下
rm

删除文件或者目录。默认情况下,该命令不会执行目录删除

格式:
rm [OPTION]... FILE...

选项:
-f, --force 忽视不存在的文件或者参数,不进行提示
-i 删除每个文件前提示
-I 删除超过3个文件时,提示一次
--one-file-system  递归删除时,遇到不再同一文件系统上目录时跳过
-r, -R, --recursive 递归的移除目录及其内容
-d, --dir 移除空目录

举例:

Shell
1
2
3
4
5
6
7
8
9
cd ~/Test
touch file1 && touch file2 && touch file3
mkdir subdir && touch subdir/file4
 
rm file1 file2     #删除两个文件
rm -r subdir       #删除子目录及其内容
rm -r *            #清空当前目录
rm -r /*           #尝试删除Linux目录树下所有文件
rm -- -foo         #移除 -开头的文件
rmdir

删除空目录

格式:
rmdir [OPTION]... DIRECTORY...

选项:
--ignore-fail-on-non-empty 不提示非空目录的失败
-p, --parents 删除祖先目录
-v, --verbose 打印冗余信息

举例:

Shell
1
2
3
4
5
6
7
8
cd ~/Test
mkdir -p ed1/ed2/ed3
 
rmdir -p ed1            #失败,目录非空
rmdir -p ed1/ed2/ed3    #OK
 
mkdir ed1 && mkdir ed2 && mkdir ed3
rmdir ed1 ed2 ed3
mkdir

创建目录或者目录树

格式:
 mkdir [OPTION]... DIRECTORY...

选项:
-m, --mode=MODE 设置文件的模式,类似于chmod中的模式
-p, --parents 创建必要的父目录
-v, --verbose 打印冗余信息

举例:

Shell
1
2
3
4
cd ~/Test
mkdir -m 777 tmp         #创建一个权限大开的目录
#在Ubuntu14上,新创建的目录权限为775
mkdir -p dir/sub         #自动创建缺少的父目录
chmod 修改文件权限,参见:Linux文件和权限
namei

显示指定路径上,所有节点的权限:

Shell
1
2
3
4
5
6
7
namei -om ~/Scripts/apache-init.sh
# f: /home/alex/Scripts/apache-init.sh
#  drwxr-xr-x root root /
#  drwxr-xr-x root root home
#  drwxr-xr-x alex alex alex
#  drwxrwxr-x alex alex Scripts
#  -rwxrwxr-x alex alex apache-init.sh 
umask 设定创建文件时权限的缺省权限
chown 修改一个或多个文件的所有权
chgrp 修改一个或多个文件的所属组
chattr

修改Linux文件系统上的文件属性

格式:
chattr [ -RVf ] [ -v version ] [ mode ] files...

选项:
-R 递归的修改目录及其内容的属性
-f 忽略大部分错误信息
-v 设置文件的版本号

模式:

mode:+-=效果类似于chmod,后面可以附加以下标记位:

a:文件只能被附加内容
c:文件被压缩
d:no dump
e:扩展格式
i:文件不可变,即使ROOT也不能改变其内容
j:数据日志
s:安全删除(删除后以0填充)
t:no ail-merging
u:禁止删除
A:禁止atime更新
D:同步目录更新
S:同步更新
T:目录层次的顶端
下面的属性为只读,不能被chattr修改
h:巨大文件
E:压缩错误
I:被索引的目录
X:压缩原始访问
Z:被压缩的脏文件

举例:

Shell
1
2
3
4
5
6
7
cd ~/Test
touch  file.tar.gz
 
#添加一个压缩属性
chattr +c file.tar.gz
#lsattr显示:
#--------c----e-- ./file.tar.gz
lsattr

列出Linux文件系统上文件的属性

格式:
lsattr [ -RVadv ] [ files... ]

选项:
-R 递归的列出目录及其内容的属性
-a 列出目录中所有文件
-d 列出目录,而不是其中的文件
-v 显示文件版本

举例:

Shell
1
2
3
4
5
cd ~
ls Test        #列出Test下文件的属性
#输出--------c----e-- Test/file.tar.gz
ls -d Test     #列出目录Test本身的属性
#输出-------------e-- Test
ln

创建文件链接,TARGET为已经存在的被链接的文件

格式:
ln [OPTION]... [-T] TARGET LINK_NAME 
ln [OPTION]... TARGET 
ln [OPTION]... TARGET... DIRECTORY
ln [OPTION]... -t DIRECTORY TARGET...

选项:
--backup[=CONTROL] 创建目标文件的备份
-b 与上面类似
-d, -F, --directory 允许超级用户硬链接目录
-f, --force 移除已经存在的DEST文件
-i, --interactive 提示用户是否删除目标
-L, --logical 为符号链接引用创建硬链接
-n, --no-dereference 按照普通文件的方式对待是符号链接的目标
-P, --physical 创建硬链接
s, --symbolic 创建符号链接
-S, --suffix=SUFFIX 备份文件后缀
-T, --no-target-directory 将链接名称作为普通文件看待
举例:

Shell
1
2
3
4
5
6
7
8
9
cd ~/Test
mkdir target && mkdir target/tgtsub  && touch target/tgtfile
 
ln -s target target.ln                #创建target目录的符号链接
ln -s target.ln target.ln.ln          #创建符号链接的符号链接
 
ln -P target/tgtfile  tgtfile.pln     #创建文件的硬链接
rm target/tgtfile                     #文件tgtfile.pln仍然有效
ln -P target target.pln               #出错,不得对目录进行硬链接
readlink

显示符号连接所指向的文件

find

在目录层次中搜索匹配的文件

格式:
find [-H] [-L] [-P] [-D debugopts] [-Olevel] [path...] [expression]

基本选项:
-H -L -P 三个选项用于处理符号链接。
-P 从不跟随(解引用)符号链接,这是默认行为。当检查符号链接的属性或者打印其信息时,针对符号链接本身而不是其链接目标
-L 跟随(解引用)符号链接
-H 不跟随(解引用)符号链接,除了命令行参数指定的符号链接文件
-D debugoptions 打印诊断信息,调试选项使用逗号分隔
-Olevel 启用查询优化,启用后测试表达式的顺序将会被调整,以提高执行速度
  0 与级别1相同
  1 默认优化级别,表达式被重新排序,使与文件名称相关的表达式(-name、-regex)优先执行
  2 任何-type、-xtype测试在-name、-regex后执行,但是被提前到需要从inode获取信息的表达式之前
  3 完全的基于成本的优化器,低成本的测试被优先执行

表达式由选项、测试、动作三部分组成

表达式选项:
所有选项的返回值都是true,除了-daystart、-follow、-regextype,这些选项影响所有测试,选项最好放在表达式的最前面
-daystart 以自然日的开始点,而不是24小时前来度量时间(-amin, -atime, -cmin, -ctime, -mmin, -mtime)
-depth -d 在处理目录本身之前,先处理其内容
-ignore_readdir_race 正常情况下,如果find命令stat文件失败时(比如在find期间目标文件被删除)将发出一个错误信息,指定该选项择不会提示
-maxdepth levels 向下搜索子目录的最大深度
-mindepth levels 对于小于该选项的文件不执行任何测试或者动作,指定为1,表示处理除了命令行参数以外的所有文件
-mount 不去向下搜索位于其它文件系统上的文件
-noignore_readdir_race
-noleaf 禁止在非UNUX文件系统,MS-DOS系统,CD-ROM文件系统中进行最优化查找
-regextype type 改变-regex、-iregex 测试所使用的正则式类型,默认emacs,其它可以是posix-awk、posix-basic、posix-egrep、posix-extended
-warn, -nowarn 打开或者关闭警告信息

表达式测试:
数字参数可以设置为以下形式:+n 多于n;-n 少于n, n 等于n
-amin n 当前文件在n分钟前被访问过
-anewer file 当前文件的访问时间比file的修改时间更晚
-atime n 文件在n*24小时前被访问过,-atime +1表示多于1个24小时之前被最后访问过,即2天前被最后访问过
-cmin n 文件的状态在n分钟前改变过
-cnewer file 当前文件状态的改变时间比file的修改时间更晚
-ctime n 文件的状态在n*24小时前改变过
-empty 文件是空白的,或者是空目录
-executable 文件时刻执行的、或者命令是可搜索的
-false 总返回false
-fstype type 文件处于type文件系统上
-gid n 文件的组ID(数字表示)是n
-group gname 文件的组名称是gname
-ilname pattern 与-lname类似,但是大小写不敏感
-iname pattern 与-name类似,但是大小写不敏感
-inum n 文件的inode为n
-iregex pattern 与-regex类似,但是大小写不敏感
-iwholename pattern 与wholename类似,但是大小写不敏感
-links n 文件有n个链接
-lname pattern 文件是一个符号链接,并且其内容匹配pattern
-mmin n 当前文件在n分钟前被修改过
-mtime n 文件在n*24小时前被修改过
-name pattern 文件的基本名称(去除目录部分)匹配pattern
-newer file 当前文件的修改时间比file的修改时间更晚
-newerXY reference 比较当前文件与reference的时间戳,reference是一个文件名或者绝对时间,XY为其它字母的占位符,这些占位符用于表示reference的什么字段被用于比较:
  a 访问时间
  B 创建时间
  c inode状态改变时间
  m 修改时间
  t reference被解释为绝对时间
-nogroup 没有组与文件的数字GID对应
-nouser 没有用户与文件的数字UID对应
-path pattern 文件名称匹配pattern
-perm mode 文件权限比特位精确匹配
-perm -mode 所有权限比特位被设置给当前文件
-perm /mode 任一权限比特位被设置给当前文件
-readable 匹配可读的文件
-regex pattern 文件名匹配正则式
-samefile name 当前文件与name指定的文件具有相同的inode
-size n[cwbkMG] 文件的尺寸为n。b表示512字节块;c表示字节;w表示双字节;k表示KB;M表示MB;G表示GB
-true 总是真
-type c 文件类型匹配。 b块;c字符;d目录;p命名管道;f普通文件;l符号链接;s套接字文件
-uid n 文件的数字UID是n
-used n 文件在其状态改变后n天被访问过
-user uname 文件的所有者用户名为uname
-wholename pattern 同-path
-writable 文件是可写入的
-xtype c 与-type类似,除了对于符号链接,如果-H -P被指定,与目标文件进行比较;如果-L被指定,则c为l是返回true

表达式动作:
-delete
删除匹配的文件,如果删除成功,返回true,否者打印错误信息,如果删除失败,find的退出状态为非0
-exec command ;
执行一个命令,如果命令的退出状态为0,返回true。在此动作之后的所有命令行参数被认为是command的参数,直到遇到分号(;),{}被替换为当前文件的名称
-exec command {} +
与上面类似,但是匹配的文件名将作为command的尾部参数,command执行的次数要远小于匹配文件数
-execdir command ; -execdir command {} +
与上面类似,但是命令将在找到文件的子目录中执行
-fls file
返回true。类似于ls,但是使用-fprint格式输出到目标文件
-fprint file
返回true。打印完整的文件名到文件,如果file不存在,会自动创建(即使测试不匹配),否则会被截断,文件/dev/stdout、/dev/stderr被作为标准输出、标准错误特别处理
-fprint0 file
返回true。类似 -print0,但是使用-fprint格式输出到目标文件
-fprintf file format
返回true。类似-fprint和-printf的组合
-ls
返回true; 以ls -dils形式打印到标准输出,块的单位为1KB,如果环境变量POSIXLY_CORRECT被设置,块单位为512B
-ok command ;
类似于-exec,但是会提示用户是否执行,如果用户同意,则执行之,否则返回false,如果命令运行,其标准输入重定向到/dev/null
-okdir command ;
类似-execdir和-ok组合
-print
返回true。打印完整的文件名到标准输出并换行
-print0
返回true。打印完整的文件名到标准输出并附加null字符,便于处理文件名中包含换行符或者其他空白字符的情况
-printf format 返回true。在标准输出上打印format,支持\转义和%指令,列宽度和精度可以使用C语言printf函数风格指定,详见man手册
-prune
返回true; 如果文件是目录,不向下处理其内容
-quit
立即退出

表达式组合操作符:
  ( expr ) 强制优先级,由于括号在shell中是特殊字符,可能需要进行转义处理
  ! expr 取反
  expr1 expr2 并且
  expr1 -a expr2 并且
  expr1 -o expr2 或者
  expr1 , expr2 两个表达式都被计算,但是返回第二个表达式的值

举例:

Shell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
find ~/ -name '*.txt' #查找txt文件
#在/tmp目录下寻找名为core的文件,并删除之
find /tmp -name core -type f -print | xargs /bin/rm -f
#在/tmp目录下寻找名为core的文件,并删除之,能正确处理文件名中的特殊字符
find /tmp -name core -type f -print0 | xargs -0 /bin/rm -f
#对当前目录下所有普通文件执行file命令,以获取其类型,注意;被转义,{}被括号保护
find . -type f -exec file '{}' \;
#遍历整个文件系统一次,输出setuid文件到suid.txt,输出大文件到big.txt
find / \
\( -perm -4000 -fprintf /root/suid.txt %#m %u %p\n \) , \
\( -size +100M -fprintf /root/big.txt %-10s %p\n \)
#在当前用户家目录中查找最近24小时内被修改过的文件
find $HOME -mtime 0
#搜索可执行却不可读的文件
find /sbin /usr/sbin -executable \! -readable -print
#搜索当前目录下权限模式为664的文件并打印
find . -perm 664 -print
#搜索当前目录下权限模式包含了664所指定的权限位的文件
find . -perm -664
#搜索可以被某个人写入的文件
 
#删除core开头的文件,{}表示用匹配的文件路径名替换
find ~/ -name 'core*' -exec rm '{}' \;
 
# 显示当前目录下包含的文件总数
find . -type f | wc -l
 
# 显示当前目录的所有直接子目录或文件
find . -maxdepth 1
touch 更新文件被存取或修改的时间,如果不存在文件则创建
basename 从文件名中去掉路径信息,只打印出文件名
dirname 从带路径的文件名中去掉文件名,只打印出路径信息
cksum sum, cksum, md5sum, sha1sum等均可用来生成校验和,验证文件的完整性
shred 用随机字符填充文件,使得文件无法恢复
mktemp 使用一个唯一的文件名来创建一个临时文件
file

确定文件类型的工具

格式:
file[OPTIONS...] [FILE...]

选项:
-b,--brief 不显示文件名字
-f,--files 读取待测试的文件
-F,--seperator 设置分隔符,默认:
-i,--mime 显示文件的MIME类型
-L,--dereference 显示符号链接所指向文件信息
-h,--no-dereference

示例:

Shell
1
2
3
4
5
6
#显示当前目录下所有文件的类型
file *
#仅显示类型,不显示名称
file --brief 1.txt
#显示文件的MIME类型
file --mime 1.txt
时间与日期相关命令
命令  说明
date

打印日期和时间到 stdout

格式:
date [OPTION]... [+FORMAT]
date [-u|--utc|--universal] [MMDDhhmm[[CC]YY][.ss]]

选项:
-d, --date=STRING 显示字符串所代表的日期,而非当前日期
-r, --reference=FILE 显示文件的最后修改日期时间
-R, --rfc-2822 使用RFC 2822格式输出时间,例如:Mon, 07 Aug 2006 12:34:56 -0600
--rfc-3339=TIMESPEC 使用RFC 3339格式输出日期时间
-s, --set=STRING 根据字符串所代表的时间来设置
-u, --utc, --universal 打印标准时间

日期时间格式:
%% 转义%
%a 本地化的周几简称,例如Sun
%A 本地化的周几完整名称,例如Sunday
%b 本地化的月份简称,例如Jan
%B 本地化月份完整名称,例如January
%c 本地化日期时间,例如Thu Mar 3 23:05:25 2005
%C 世纪
%d 月中的第几天,例如01
%D 日期,即%m/%d/%y
%e 月中的第几天,空格补白,即%_d
%F 日期,即%Y-%m-%d
%h 即%b
%H 小时(00..23)
%I 小时(01..12)
%j 年中的第几天(001..366)
%k 小时( 0..23)
%l 小时( 1..12)
%m 月份(01..12)
%M 分钟(00..59)
%n 新行
%N 纳秒(000000000..999999999)
%p 本地化的AM/PM,如果没有留空
%P 类似%p,小写
%r 本地化的12小时制时间(11:11:04 PM)
%R 24小时时间 %H:%M
%s 从1970-01-01 00:00:00 UTC开始的秒数
%S 秒(00..60)
%t 制表
%T 时间,即%H:%M:%S
%u 周中的第几天,周一为1(1..7)
%U 年中的第几周,周日为第一天(00..53)
%V ISO年中的第几周,周一为第一天 (01..53)
%W 年中的第几周,周一为第一天(00..53)
%x 本地化日期展示形式(12/31/99)
%X 本地化时间展示形式(23:13:48)
%y 年度最后2位(00..99)
%Y 年度
下面的符号可以紧随%后
- 不要补白字段
_ 使用空格补白
0 使用0补白
^ 如果可能,使用大写
# 如果可能,使反转大小写

举例:
Shell
1
2
3
4
5
6
7
8
9
10
11
#注意格式的+号
date "+%Y%m%d%H%M%S"
#输出20150510165155
 
date '+%s'
#输出1970-01-01到当前时间点消逝的秒数
 
date -R
#输出Fri, 15 May 2015 09:30:05 -0400
#当地时间9点30分,比世界时晚4小时(西四区)
#北京比世界时早8小时(东八区)
zdump

查看特定时区的当前时间

举例:

Shell
1
2
#显示中国标准时间
zdump PRC
time

输出统计出来的命令执行的时间

举例:

Shell
1
2
3
4
5
time ls  > /dev/null
#输出内容:
#real    0m0.002s  真实世界的时间
#user    0m0.001s  用户态时间
#sys     0m0.002s  内核态时间
cal 从 stdout 中输出一个格式比较整齐的日历
sleep 指定需要暂停的秒数并休眠当前进程
usleep Microsleep 睡眠微秒
未分类的基本命令
命令  说明
xargs

从标准输入解析并执行命令行

xargs从标准输入读取数据,使用空白符或者换行符分隔成多个条目(标准输入的空白行被忽略),并执行命令
如果不指定命令,则默认使用/bin/echo。读取到的条目作为参数附加在命令初始参数(initial-arguments)后面
由于UNIX文件名可以包含空白符甚至换行符,因此默认选项往往导致错误,最好使用-0选项
如果命令调用的退出状态是25,则xargs立即中止读入任何标准输入并在stderr显示错误信息

格式:
xargs
  [-0prtx] [-E eof-str] [-e[eof-str]] [--eof[=eof-str]] [--null]
  [-d delimiter] [--delimiter delimiter] [-I replace-str] [-i[replace-str]]
  [--replace[=replace-str]] [-l[max-lines]] [-L max-lines]
  [--max-lines[=max-lines]] [-n max-args] [--max-args=max-args]
  [-s max-chars] [--max-chars=max-chars] [-P max-procs] [--max-procs=max-procs]
  [--interactive] [--verbose] [--exit] [--no-run-if-empty] [--arg-file=file]
  [--show-limits] [--version] [--help] [command [initial-arguments]]

选项:
-a --arg-file 从文件而不是stdin读取条目
-0 --null 使用null字符而不是空白符分隔条目,并且所有字符(包括引号和反斜杠)作为字面值看待
-d --delimiter 指定条目的分隔符为指定的字符,不支持多字节字符
-E eof-str 设置EOF字符串,如果该字符串作为输入的一行出现,则剩余的输入被忽略
-I replace-str 替换initial-arguments中的replace-str为从stdin读取到的名称
-L max-lines 每一个命令行最多使用的非空白行数
-n --max-args 每一个命令行最多使用的参数个数
-r --no-run-if-empty 如果输入没有非空白行,则不执行命令
-s --max-chars 每个命令行最多使用的字符数
-t --verbose 在执行命令前打印之
-x --exit 如果字符数超过设定(-s)则退出s
-P --max-procs 同时最多运行的进程数,默认1,如果设置为0,则尽可能运行更多地进程,须与-n联用,否则只会有开启一个进程

退出状态:
  0 执行成功
  123 如果任何命令返回1-125之间的状态码
  124 如果命令返回255状态码
  125 如果命令被信号杀死
  126 如果命令无法执行
  127 如果命令不存在
  1 发生其它错误

举例:

Shell
1
2
3
4
5
6
7
#查找目录/tmp中的core文件,并且删除之,能够正确处理带有空白符的文件名
find /tmp -name core -type f -print0 | xargs -0 /bin/rm -f
#输出系统中所有的用户名
cut -d: -f1 < /etc/passwd | sort | xargs echo
 
# 此命令可以用来去除(trim)首尾空白
echo "   hello  " | xargs

env

在修改的环境下(即一系列修改后的环境变量)运行一个程序

格式:
env [OPTION]... [-] [NAME=VALUE]... [COMMAND [ARG]...]

选项:
-i 从空白环境开始
-u 取消环境变量的值

printenv 显示出所有的环境变量
which 给出命令的完整路径
locate

给出指定文件的完整位置,示例:

Shell
1
2
locate nginx.conf
# /usr/conf/nginx.conf
whereis 给出命令的完整路径、man页的完整路径
chroot 改变根目录来运行某个命令
pivot_root

改变根文件系统,将当前进程的根文件系统移动到其它目录,并将另外一个目录作为新的根文件系统

格式:

Shell
1
pivot_root new_root put_old

示例:

Shell
1
2
3
cd new_root
pivot_root . put_old
exec chroot . command

 需要注意,chroot必须在新、旧根目录都可用。pivot_root可能不会自动为当前Shell chroot

man

查看系统手册,可以查看陈故乡、工具、编程函数等各类对象的手册。

格式:

Shell
1
2
3
man [section] page
# 示例
man  2 clone

手册是分为多个段(Section)的,各个段中可以具有名字相同的page。当你在网络上看到namespaces(7)这样的Man Page链接时,就知道目标是在段7的namespaces页面。

段的定义如下:

  1. 可执行程序或Shell命令
  2. 系统调用(内核提供的函数)
  3. 库调用(编程库中提供的函数)
  4. 特殊文件,主要在/dev/...这些页面
  5. 文件格式和约定,例如/etc/passwd
  6. 游戏
  7. 杂项
  8. 系统管理命令,通常仅供root使用
  9. 内核例程(非标准)
作业控制命令
命令  说明
at 作业控制命令, 用来在指定时间执行给定的命令集合
crontab

维护某个用户的CRON守护程序列表。
crontab可以用来添加、删除、列出CRON守护程序,每个用户有自己的crontab定义,一律位于目录/var/spool/cron/crontabs中,通常不需要直接编辑这些文件
如果配置文件/etc/cron.allow存在,那么只有其中列出的用户才能使用crontab
如果配置文件/etc/cron.deny存在,那么其中列出的用户不能使用crontab

格式:
crontab [ -u user ] file
crontab [ -u user ] [ -i ] { -e | -l | -r }

选项:
-u 指定crontab所属的用户,每个用户都有独立的crontab,里面的条目都以该用户为身份执行
-l 列出crontab的内容
-r 移除当前crontab
-e 使用默认编辑器编辑crontab

桌面应用支持:

守护程序脚本中需要添加: export DISPLAY=:0.0

模拟执行:

如果你的脚本在命令行中运行正常,但是在crontab中不能运行,可能是两种环境下的环境变量有差异。参考下面的方法立即模拟crontab的执行:

首先导出crontab的环境变量:

Shell
1
* * * * *  /usr/bin/env > /root/cron-env

然后模拟执行:

Shell
1
/usr/bin/env -i $(cat /root/cron-env) /my/crontab/item.sh
cron

计划任务调度器

jobs 查看所有后台运行的作业,可以看到jobnumber
batch 在系统平均载量降到0.8 以下时执行一次性的任务
nice 使用修改后的优先级来运行一个后台作业。 优先级从19(最低)到-20(最高)。 只有root 用户可以设置负的优先级
nohup 保持一个命令的运行,即使用户退出Terminal也不会中断其执行(不会收到SIGHUP信号)
pidof 取得一个正在运行的作业的PID
cron 任务调度程序
watch

以指定的时间间隔来重复运行一个命令,可以查看程序输出的变化

格式: watch [options] command

选项:

-d 高亮显示两次运行的结果变化
-n 运行间隔,单位秒
-t 不显示头信息,包括运行间隔,运行的命令等

示例:

Shell
1
2
# 持续监控软中断
watch -d -n 1 'cat /proc/softirqs'
fg 将后台中的命令调至前台继续运行。如果后台中有多个命令,可以用 fg %jobnumber将选中的作业调到前台
bg 将作业调度到后台执行,如果有多个后台作业处于暂停(ctrl + z将导致暂停)状态,可以用bg %jobnumber将选中的作业调度执行
文本处理命令
简单命令
命令  说明 
sort

将文件的每一行作为一个单位,按ASCII顺序进行比较,并按升序输出

格式:
sort [OPTION]... [FILE]...
sort [OPTION]... --files0-from=F

选项:
-u 在输出中去除重复行
-r 按降序排列
-o 将结果输出到目标文件,输出到原文件时用于替代重定向
-n 按照数值来排序
-t 按列排序,列的分隔符
-k 按列排序,第几列,例如: -k 3r -k 2 按第3列降序排列,按第2行作次要升序排列
-f 忽略大小写排序
-c 检查文件是否排好序,如果不是,输出第一行乱序的信息,退出码1
-C 检查文件是否排好序,如果不是,退出码1
-M 按月份进行排序(例如:JAN小于FEB)
-b 忽略前导空白符

举例:

Shell
1
2
#使用第二列排序,分隔符为冒号
sort -n -k 2 -t : readme.txt
cat,tac

输出文件的完整内容
-n 在目标文件中的所有行前边插入行号
-b 与 -n 选项类似,但不对空行进行编号
-v 可以使用 ^ 标记法来显示出不可打印字符
-s 把多个空行压缩成一个空行

tac从文件的结尾列出文件

tee

读取标准输入,并将内容输出到文件和标准输出

格式: tee [OPTION]... [FILE]...

选项:

-a, --append 附加内容到输出文件尾部,而不是覆盖它的内容
-i, --ignore-interrupts 忽视中断信号

more, less

分页显示文本文件或stdout

more命令逐页的显示文本的内容,它在启动时读取整个文件的全部内容,按Space键可以向后翻页

less更加强大,它和more一样支持份也显示,但是支持PageUp、PageDown进行前后翻页,并且支持搜索。在提示符(:)后输入:

  1. /searchText,向下搜索指定的文本
  2. ?searchText,向上搜索指定的文本
  3. n,向后继续查找搜索结果
  4. N,向前继续查找搜索结果
  5. d,向后翻半页
  6. u,向前翻半页
  7. Enter,向后滚动一行
  8. y,向前滚动一行
  9. Q,退出less命令
rev 把每一行中的内容反转,并且输出到 stdout 上
uniq

过滤器,将会删除一个已排序文件中的重复行.这个命令经常出现在 sort 命令的管道后

选项:

-c 在输出行前面加上每行在输入文件中出现的次数

举例

Shell
1
2
#输出3文件的内容,排序、去重、输出到final.list
cat list-1 list-2 list-3 | sort | uniq > final.list  
expand, unexpand expand 将会把每个tab 转化为一个空格;unexpand功能相反
dos2unix 转换换行符的格式
cut

从文件中提取特定字段(列)
格式:
cut OPTION... [FILE]...

选项:
-d 字段定界符
-f 选定字段列表

举例:

Shell
1
2
#按空格分隔字段,提取第1、3、11、12个字段
uname -a | cut -d" " -f1,3,11,12
paste 将多个文件,以每个文件一列的形式合并到一个文件
join

能够操作2个文件,它可以将那些具有特定标记域的行合并起来,并且将结果输出到stdout

head 将一个文件的头( 默认为10 行)打印到 stdout 上 
tail

将一个文件的尾( 默认为10 行)打印到 stdout 上

选项:

-f 继续显示添加到文件中的行
-s N 和-f配合使用时,每次获取更多数据后休眠N秒
-c N 显示文件的最后N字节
-n N 显示文件的最后N行

grep

使用正则表达式的多用途文本搜索工具

格式:
grep [OPTIONS] PATTERN [FILE...]
grep [OPTIONS] [-e PATTERN | -f FILE] [FILE...]

选项:
-E, --extended-regexp 将PATTERN解释为扩展正则式(extended regular expression),等价于egrep
-F, --fixed-strings 将PATTERN解释为固定字符串的列表,以换行分隔,等价于fgrep
-G, --basic-regexp 将PATTERN解释为基本正则式(basic regular expression)
-P, --perl-regexp 将PATTERN解释为Perl正则式(basic regular expression),可以使用前向捕获等高级功能,例如 grep -P -o '[0-9]+(?=,)'要求匹配类似123,这样的子串,但是不消耗掉逗号

-e PATTERN, --regexp=PATTERN 指定匹配的PATTERN
-f FILE, --file=FILE 从文件读取PATTERN,空文件不匹配任何目标
-i,-y, --ignore-case 忽略PATTERN和输入文件中的大小写
-v, --invert-match 反转匹配,即选择不匹配的行
-w, --word-regexp 仅选择匹配项组成完整单词的行
-x, --line-regexp 仅选择匹配完整行的

-c, --count 取消正常输出,仅显示输入文件中匹配的行总数
-L, --files-without-match 取消正常输出,打印出第一个不匹配的文件名
-l, --files-with-matches 取消正常输出,打印出第一个匹配的文件名
-m NUM, --max-count=NUM 在到达NUM行后停止读入输入文件
-o, --only-matching 仅仅打印行的匹配部分
-q, --quiet, --silent 不打印,仅仅输出退出码
-s, --no-messages 取消对不存在或者不可见文件的错误信息

-b, --byte-offset 在每行前打印基于文件的行首的偏移量,如果指定-o则打印匹配部分的偏移量
-H, --with-filename 为每个匹配在行首打印文件名称,如果有多个输入文件,这是默认选项
-h, --no-filename 取消打印行首的文件名称,如果只有一个输入文件,这是默认选项
-n, --line-number 为每一行输出打印其相对于所在文件的行号

-a, --text 将二进制文件作为文本处理
-D ACTION, --devices=ACTION 如果输入文件时设备、FIFO或者Socket,使用ACTION来处理之,默认的ACTION是read
-d ACTION, --directories=ACTION 输入输入文件时目录,使用ACTION来处理之,默认的ACTION是read,即作为普通文件读入;recurse读入其中的所有子文件
--exclude=GLOB 排除匹配通配符的文件
--exclude-from=FILE 排除匹配从FILE中读取的通配符的文件
--exclude-dir=DIR 在递归搜索中,排除匹配DIR的目录
-I 等价于--binary-files=without-match
--include=GLOB 仅搜索匹配通配符的文件
-r, --recursive 递归搜索子文件与文件夹
-R, --dereference-recursive 递归搜索子文件与文件夹,并且Follow所有符号链接

--line-buffered 使用输出缓冲
--mmap 如果可能,使用系统调用mmap来读取输入,而不是read
-U, --binary 以二进制方式处理文件
-z, --null-data 把输入作为一系列行,每行以ASCII NUL(\0)分隔,而不是换行符

上下文行控制:

-A NUM,  --after-context=NUM 打印匹配行后面的NUM行
-B NUM, --before-context=NUM  打印匹配行前面的NUM行
-C NUM,  打印匹配行前面、后面的NUM行

举例:

Shell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
grep root /etc/passwd        # 搜索文件,并把包含roog的行打印出来
cat /etc/passwd | grep root  # 同上
 
# 在当前目录下递归搜索包含oo且oo前面没有g的文件,打印文件名而不显示行内容
grep -l -r '[^g]oo' *
# 搜索全部日志
grep -r 'hello' /var/log
 
# 寻找名为java或者mysql的进程
ps -A | egrep '(java|mysql)'
 
# 显示文件名、行号
cat */*.php | grep "wp-content" --color=auto -iRnH
 
# 不打印匹配的部分
 
# 使用向后肯定预查
grep -oP "(?<=image:\s).*" /tmp/cronjobs/*
# 对于 images: docker.gmem.cc/busybox-amd64:1.31
# 前面的images: 引起匹配,但是不包含在匹配结果中
# 匹配结果是:docker.gmem.cc/busybox-amd64:1.31
 
# 使用向前肯定预查
grep -m1 -oP '(?<=template:\s).*(?=not\s+defined)'
# 对于 statefulset.yaml:49: function "MongoVersion" not defined
# 用于向后肯定预查、向前肯定预查,template、not defined引起匹配,但是结果是
# statefulset.yaml:49: function "MongoVersion"
egrep

基于正则式的grep

举例:

Shell
1
2
# 搜索,并且仅仅输出匹配的部分
echo 1.1.1 | egrep -oh '[0-9]+.[0-9]+.[0-9]+' 
wc

可以统计文件或 I/O 流中的单词数量
格式:
wc [OPTION]... [FILE]...
wc [OPTION]... --files0-from=F

选项:
-w 统计单词数量
-l 统计行数量
-c 统计字节数量
-m 统计字符数量
-L 给出文件中最长行的长度

tr

读取标准输入,转换或者删除字符,并打印到标准输出

格式:
tr [OPTION]... SET1 [SET2]

选项:
-c 使用SET1的补集
-d 删除SET1指定的字符,不进行转换
-s 删除重复出现的SET1指定的字符

举例:

Shell
1
2
3
4
5
6
7
8
9
10
#把花括号替换为圆括号
tr '{}' '()'
#删除全部空格
tr -d ' '
#把小写转换为大写
tr 'a-z' 'A-Z'
#使用问号替换所有显示字符,*表示让SET2长度自动扩充到与SET1一致
tr -c '[:print:][:cntrl:]' '[?*]'
#使用#代替空白符,连续出现的空白符被合并为1个
tr -s '[:space:]' '[#*]'
fold 将输入按照指定宽度进行折行
fmt 简单的文件格式化器,通常用在管道中,将一个比较长的文本行输出进行折行
col 来滤除标准输入的反向换行符号
column

将“列类型”的文本转化为“易于打印”的表格式进行输出

可以用来按列对齐,例如:

Shell
1
sudo iptables -L -nv -t filter | column -t -s " "
colrm 列删除过滤器。 这个工具将会从文件中删除指定的列并且写到文件中
nl 计算行号过滤器,在输出中添加前缀的行号
pr 格式化打印过滤器. 这个命令会将文件(或stdout)分页
gettext 将程序的输出翻译或者本地化为不同国家语言
iconv 将文件转化为不同编码格式(字符集)
strings 在二进制或数据文件中找出可打印字符
diff

以一行接一行的形式来比较目标文件

格式:
diff [OPTION]... FILES

参数:
--side-by-side 以左右方式显示,并把不同的行标记出来

退出码:
0 如果文件完全一样

jq

命令行JSON处理器,能够选取、迭代、reduce、修改JSON文档

格式:jq [options...] filter [files...]

选项:

--seq 使用MIME类型application/json-seq来分隔jq输入输出的JSON文档,这意味着JSON记录前后分别有ASCII字符RS、LF。无法解析的输入JSON被忽略,同时忽略所有后续输入,直到RS出现
--stream 流式的解析输入,输出路径数组和叶子值
--slurp/-s 读取整个输入,然后一次运行Filter,而非逐个读取JSON对象,逐个运行Filter
--raw-input/-R 不要将输入读取为JSON,而是每行均以字符串形式传递给Filter
-c 紧凑输出,不格式化
--tab 使用Tab而非空格进行格式化
--indent 缩进对应空格数量
-C 彩色化输出
-S 按键排序字段
-r 原始输出,如果结果是字符串,直接输出内容,不要引号
-f  从文件而非命令行读取过滤器
-L 指定模块搜索目录
--arg name value 定义变量$name为value
--argjson name JSON-text 以JSON文档的形式定义变量

过滤器:

每个jq程序都称为过滤器,它将输入转换为输出,大量内置过滤器可以实现字段抽取、类型转换等标准化工作

过滤器可以用管道的形式连接起来,你还可以把过滤器的输出收集到数组中。某些过滤器会产生多个输出,通过管道连接在其后的过滤器会对每个输出执行处理

需要注意,任何过滤器都具有输入输出,哪怕是18这样的字面值也可以是过滤器——不管输入是什么,都输出18

基本过滤器:

. 直接输出输入,不处理

.foo.bar属性点号导航,路径有null值则返回null,如果JSON键有特殊字符,需要双引号 ."foo$",注意.foo.bar 和 .foo|.bar这种管道形式是等价的

.foo?,类似于.foo,但是当.不是对象或数组时不会报错,例如 echo '{"name":"alex"}' | jq '[.age?]'返回 [null]

.[<string>]这种形式放为属性也可以

.[2]访问数组元素

.[10:15] 切片,获得子数组

.[] 迭代数组的所有元素,每个元素产生一个输出

filter1,filter2分别执行两个过滤器,然后先输出filter1的全部输出,后输出filter2的全部输出

filter1|filter2 filter1的输出作为filter2的输入

类型和值:

[]用于构造数组,[.user, .projects[]]表示读取user属性、projects的所有元素,合并为一个数组

{} 用于构造对象,{user: .user, title: .title}可以简写为 {user, title},用括号包围key,表示解析它的值,例如 {(.user): .titles}可以产生{"alex": [1,2]}

内置操作符和函数:

+ 数字加、数组连接、字符串连接
- 数字减、数组对象差集
* / %
length 获得长度
keys, keys_unsorted 获得键的数组
has(key) 返回是否存在键,true/false
del(path_expression) 删除指定的键值

格式化和转义:

@text 调用tostring
@json 串行化输入为JSON
@html 执行HTML转义
@base64 执行Base64编码

awk

AWK编程语言的GNU实现。

命令格式
Shell
1
2
3
4
5
6
7
8
9
10
# GNU的Awk实现
gawk [ POSIX or GNU style options ] -f program-file [ -- ] file ...
gawk [ POSIX or GNU style options ] [ -- ] program-text file ...
 
# pgawk是剖析版本的Awk,速度比较慢
pgawk [ POSIX or GNU style options ] -f program-file [ -- ] file ...
pgawk [ POSIX or GNU style options ] [ -- ] program-text file ...
 
# dgawk是Awk的调试器
dgawk [ POSIX or GNU style options ] -f program-file [ -- ] file ...
命令示例
Shell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
# 读取文件的第1、4列
awk '{print $1, $4}' filename
 
# 列出最近5个登陆记录,逐行处理。以空格作为字段分隔符,打印第一个字段
# $0表示所有字段,$1表示第一个字段,类推
last -n 5 | awk '{print $1}'
 
# 行过滤,仅仅显示第一列为tcp6且第六列为SYN_SENT的行
netstat -tn | awk '$1=="tcp6" && $6=="SYN_SENT"'
# 同上,但是包含表头(第一行)
netstat -tn | awk '$1=="tcp6" && $6=="SYN_SENT" || NR==1'
 
 
# 使用 : 作为分隔符,取第1、2个字段,之间用制表符分隔
cat /etc/passwd | awk -F ':' '{print $1 "\t" $2 }'
 
# 使用正则表达式作为分隔符
echo 'Hello darkness my old friend' | awk -F'\\s+' '{print "["$5"]"}'
# [friend]
 
# 使用正则式进行行过滤
# 如果第六列匹配正则式FIN,或者是第一行,则打印4、5、6列,表头总是打印,输出字段使用制表符分隔
awk '$6 ~ /FIN/ || NR==1 {print NR,$4,$5,$6}' OFS="\t" netstat.txt
# 正则式取反
netstat | awk '!/WAIT/'
 
# BEGIN 在处理输入之前执行
# END   在处理完所有输入行之后执行
cat /etc/passwd | head -5 | awk -F':' 'BEGIN {print "用户名"} {print $1} END {print "结束"}'
# 用户名
# root
# daemon
# bin
# sys
# sync
# 结束
 
# 格式化输出,C语言风格
netstat -nlt4 | awk '{printf "%-8s %-8s %-8s %-18s %-22s %-15s\n",$1,$2,$3,$4,$5,$6}'
 
# 拆分输出:仅仅输出指定的列
netstat -nt | awk 'NR!=1{print > $6}'
 
 
# 统计数量
# 在映射a中存放每个网络状态的计数,默认计数为0,每次自动增加计数
# 处理完所有行后,遍历映射并打印
netstat -t | awk 'NR!=1{a[$6]++;} END {for (i in a) print i ", " a[i];}'
# LAST_ACK, 4
# CLOSE_WAIT, 1
# ESTABLISHED, 22
# Foreign, 1
# CLOSING, 1
# TIME_WAIT, 1
 
# 寻找log中长度大于80的行
awk 'length>80' log
内置变量
变量 说明
$0 当前记录,即整个行的内容
$1~$n 当前记录的第n个字段,字段间由FS分隔
FS 输入字段分隔符 默认是空格或Tab
NF 当前记录中的字段个数,就是有多少列
NR

已经读出的记录数,就是行号,从1开始,如果有多个文件话,这个值也是不断累加中

FNR 已经读出的记录数,就是行号,从1开始,如果有多个文件话,每个文件分别计数
RS 输入的记录分隔符, 默认为换行符
OFS 输出字段分隔符, 默认也是空格
ORS 输出的记录分隔符,默认为换行符
FILENAME 当前输入文件的名字
ENVIRON 环境变量的Map
内置函数
函数 说明
数学函数
atan2( y, x ) 返回 y/x 的反正切
cos( x ) 返回 x 的余弦;x 是弧度
sin( x ) 返回 x 的正弦;x 是弧度
exp( x ) 返回 x 幂函数
log( x ) 返回 x 的自然对数
sqrt( x ) 返回 x 平方根
int( x ) 返回 x 的截断至整数的值
rand( ) 返回随机数字 n,其中 0 <= n < 1
srand( [Expr] ) 将 rand 函数的种子值设置为 Expr 参数的值,或如果省略 Expr 参数则使用时间。返回先前的种子值
字符串函数
length [(String)] 计算字符串中的字符数量
blength [(String)] 计算字符串的字节数
sub( Ere, Repl, [ In ] )

用Repl替换In中第一个匹配正则式Ere的子串。如果不指定In则使用$0

注意:In直接被修改,返回值是替换的子串数量

示例:

Shell
1
df | awk 'NR>1{sub("%","",$5);print $1 " usage " $5/100 }'
 gsub( Ere, Repl, [ In ] ) 用Repl替换In中全部的匹配正则式Ere的子串。如果不指定In则使用$0
index( Str, Sub ) 返回Sub第一次出现在Str中的位置,索引以1为基准,如果不存在Sub子串返回0
substr( Str, M, [ N ] ) 提取Str从索引M开始,N结束的子串,不指定N则到结尾
match( Str, Ere ) 返回Str匹配Ere的子串的出现位置,如果没有匹配返回0
split( Str, A, [Ere] ) 分割字符串Str,将子串存放到数组A中。分隔符默认等于-F参数指定的字符,或者Ere正则式
tolower( Str )
toupper( Str )
大小写转换
sprintf(Format, Expr, . . . ) 格式化打印:
%d   十进制有符号整数
%u  十进制无符号整数
%f   浮点数
%s   字符串
%c   单个字符
%p   指针的值
%e   指数形式的浮点数
%x %X  无符号以十六进制表示的整数
%o   无符号以八进制表示的整数
%g   自动选择合适的表示法
时间函数
mktime( YYYY MM DD HH MM SS[ DST])   解析字符串为时间 
strftime([format [, timestamp]])

格式化时间:

%a 星期几的缩写(Sun)
%A 星期几的完整写法(Sunday)
%b 月名的缩写(Oct)
%B 月名的完整写法(October)
%c 本地日期和时间
%d 十进制日期
%D 日期 08/20/99
%e 日期,如果只有一位会补上一个空格
%H 用十进制表示24小时格式的小时
%I 用十进制表示12小时格式的小时
%j 从1月1日起一年中的第几天
%m 十进制表示的月份
%M 十进制表示的分钟
%p 12小时表示法(AM/PM)
%S 十进制表示的秒
%U 十进制表示的一年中的第几个星期(星期天作为一个星期的开始)
%w 十进制表示的星期几(星期天是0)
%W 十进制表示的一年中的第几个星期(星期一作为一个星期的开始)
%x 重新设置本地日期(08/20/99)
%X 重新设置本地时间(12:00:00)
%y 两位数字表示的年(99)
%Y 当前月份
%Z 时区(PDT)
%% 百分号(%)

systime() 返回UNIX纪元到现在的秒数
其它函数
close(expr)

关闭由print、printf、getline打开的文件或管道,关闭成功返回0

如果打算写一个文件,并稍后在同一个程序中读取文件,则 close 语句是必需的

system(cmd)

执行cmd参数给出的系统命令,返回退出状态。示例:

Shell
1
jcmd -l | awk '{system("ps  --no-headers -p "$1 " -o command " ) }'
getline

逐行读取外部文件的内容。示例:

Shell
1
2
{ while( "cat /etc/passwd" | getline ){ print $0; }; close("/etc/passwd"); }
# 或者   getline < "/etc/passwd"
exit 提前结束处理,不再处理后续的记录。如果awk位于管道中间,后续命令获得处理机会
语言入门

Awk程序通常是读取一个个记录(默认每行是一个记录),并寻找到其中匹配pattern的行,执行指定的动作:

Shell
1
2
3
4
5
6
7
8
9
10
pattern { action }
 
# 示例
$3 == 0 { print $1 }
# 可以不指定pattern,这样就匹配所有记录
{ print }  # 不带参数的print等价于print $0
 
# 起始和结束块,分别在处理任何记录之前、处理所有记录之后执行
BEGIN { action }
END   { action }

Pattern分为:BEGIN、END、 表达式、/正则表达式/ 、Pattern的逻辑组合,范围模式几类。

范围模式: pattern1,pattern2 { 语句 },匹配从匹配pattern1的行、到匹配pattern2的行之间的所有行,包括匹配pattern1、pattern2的那两个首尾行。

你可以对记录中的字段,进行各种运算:

Shell
1
2
{ print $1, $2 * $3 }
$2 * $3 > 50 { printf("$%.2f for %s\n", $2 * $3, $1) }

pattern可以通过逻辑操作符进行组合,包括: &&、 ||和 !,支持使用括号:

Shell
1
!($2 < 4 && $3 < 20)

字符串拼接语法 —— 直接连续写多个字符串(或变量)即可,不需要操作符,空格被忽略:

Shell
1
2
3
4
5
netstat -nlt4 | awk 'NR > 2 {print $4}' | awk -F':' '{print $1}' | sort -u | \
    #         赋值语法
    #           字符串拼接语法
    awk '{ips = ips $1 "|"} END{print ips}'
# 0.0.0.0|10.0.0.1|127.0.0.1|172.17.0.1|172.18.0.1|172.21.0.1|192.168.142.140|
控制结构 

if-else分支结构: 

Shell
1
2
3
4
echo -e "0\n-1\n1" | awk '{ if($1>0) print "TRUE"; else if($1<0) print "N/A"; else print "FALSE" }'
# FALSE
# N/A
# TRUE

while循环结构: 

Shell
1
while (i <= $3) { i = i + 1 }

for循环结构:

Shell
1
2
3
4
{
for (i = 1; i <= $3; i = i + 1)
    printf("\t%.2f\n", $1 * (1 + $2) ^ i)
}
数组支持
Shell
1
2
3
4
5
6
7
8
9
10
{ line[NR] = $0 }  # 记录每个输入行,将其存为数组元素
 
# 逆序打印
END {
  i = NR
  while (i > 0) {
    print line[i]
    i = i - 1
  }
}
sed

sed是流式文本编辑器,该命令用于在输入流(文件或者管道输入)上执行基本的文本转换,该命令只会对输入进行一次逐行的顺序的处理,因而效率较高。

命令格式
Shell
1
sed [OPTION]... {script-only-if-no-other-script} [input-file]...
命令选项
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
-n, --quiet, --silent
       #不自动打印当前要处理的行
-e script, --expression=script
       #指定需要执行的命令(脚本),可以指定多个-e
-f script-file, --file=script-file
       #指定文件中的脚本
--follow-symlinks
       #跟随符号链接到目标文件
-i[SUFFIX], --in-place[=SUFFIX]
       #指定备份文件,修改直接应用到原始文件
-l N, --line-length=N
       #对于l类型的命令,指定期望的换行的行长度阈值
--posix
       #禁用所有GNU扩展
-r, --regexp-extended
       #在此脚本中使用正则式
-s, --separate
       #把输入文件看作若干单个文件,而不是一个连续的流
-u, --unbuffered
       #使用尽量少的缓冲区,尽量读入较少的文件内容,并把输出刷空
-z, --null-data
       #使用NUL字符来划分行
脚本语法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
[address][!] cmd [cmd-args]
 
# address 指定后面的命令的作用范围,有以下几种方式:
# 不指定:作用于输入的所用行
# n,m:从第n到第m行,$表示最后一行
# n,+m:从第n行开始,到n+m行为止
# n~m:从第n行开始,每隔m行执行一次命令
# /pattern/:基于正则式匹配,所有匹配的行均执行命令
# /pattern1/,/pattern2/:基于正则式匹配,从pattern1匹配的行开始,到pattern2匹配的行为止
 
#命令,包括添加、插入、替换、删除、打印等
#                 p                           打印
#                 =                           打印行号
# [addr1[,addr2]] i text                      在指定的行的前面插入文本
# [addr1[,addr2]] a text                      在指定的行的后面添加文本
# [addr1[,addr2]] d                           删除指定的行
# [addr1[,addr2]] s/pattern/replace/[opts]    把指定的行内的pattern替换为replace,
#                                               默认只会替换第一个匹配pattern的文本
#                                               选项:
#                                                 n 替换第n个匹配
#                                                 g 替换所有匹配
#                                                 p 如果替换成功打印该行
#                                                 w 存储改变的行到文件
#                                                 i 匹配时忽略大小写
#                 s;pattern;replace;          如果replace中有/,可以用;代替/
应用举例
Shell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
# 替换文本中每行的所有WangZhen为Alex
sed "s/WangZhen/Alex/g" greetings.txt > result.txt
# 同上,直接写回到原文件
 
sed -i "s/WangZhen/Alex/g" greetings.txt
# 只替换每行的第2个匹配
sed -i "s/WangZhen/Alex/2" greetings.txt
# 只替换每行的第3个以后的匹配
sed -i "s/WangZhen/Alex/3g" greetings.txt
# 只替换3-10行的内容
sed -i "3,10s/WangZhen/Alex/g" greetings.txt
 
# 在每一行的开始处添加一个#
sed 's/^/#/g' greetings.txt
# 在每行的结尾添加一个#
sed 's/$/#/g' greetings.txt
 
 
# 同时执行多个脚本(两种等价方式)
sed '1,3s/WangZhen/Alex/g; 3,$s/Is/Are/g' greetings.txt
sed -e '1,3s/WangZhen/Alex/g' -e '3,$s/Is/Are/g'  greetings.txt
 
# 正则式匹配引用,使用\1、\2依次引用第1、2个括号内的匹配内容
# 正则式([^,]*).*says(.*)
#替换为:\1:\2
sed 's/\([^,]*\).*says\(.*\)/\1:\2/g' greetings.txt
 
# 在输入的每一行首部,加上  docker.gmem.cc/
sed "s;^;docker.gmem.cc/;"
# 常用正则式关键字
# ^ 开头
# $ 结尾
# \< 词首,例如 \<abc 表示abc开头的词
# \> 词尾
# . 任意单词
# * 重复
# [] 字符集
归档与压缩命令
命令   说明
tar

打包和解压文件。该命令支持使用短横线(-)来代替标准输入/输出,以代替输入/输出tar文件名

格式:
tar [options] [pathname ...]

选项:
-c 创建一个新的归档文件
-x 从归档文件中解压文件
-z 用gzip压缩归档文件(压缩还是解压, 依赖于是否组合了-c或-x)
--delete 从存在的归档文件中删除文件
-r 将文件添加到现存的归档文件的尾部
-A 将tar文件添加到现存的归档文件的尾部
-t 列出现存的归档文件中包含的内容
-u 更新归档文件
-d 使用指定的文件系统比较归档文件
-j 用bzip2压缩归档文件
-d, --diff, --compare 查找文件系统和归档文件的不同
-a, --auto-compress 根据后缀名自动确认压缩算法
-C, --directory DIR 修改输出目录为DIR
--exclude=PATTERN 根据指定的PATTERN排除文件
-f, --file ARCHIVE 使用归档文件(后面要直接连接归档文件名)
-h, --dereference 压缩时使用符号连接指向的真实文件
-H, --format FORMAT 创建指定格式的文件
-k, --keep-old-files 解压时,不覆盖已经存在的旧文件
-p :使用原文件的原来属性
-P :使用绝对路径来压缩
-N :比日期(yyyy/mm/dd)更新的文件才会被打包进去

举例:

Shell
1
2
3
4
5
6
7
8
9
10
11
12
# 将/etc下的文件全部打包
tar -cvf /tmp/etc.tar /etc
# 同上,使用gzip压缩
tar -zcvf /tmp/etc.tar.gz /etc
# 同上,使用bzip2压缩
tar -jcvf /tmp/etc.tar.bz2 /etc
# 查阅归档文件内有哪些文件
tar -ztvf /tmp/etc.tar.gz
# 将/tmp/etc.tar.gz解压缩在/usr/local/src下
tar -zxvf /tmp/etc.tar.gz -C /usr/local/src
# 递归搜索当前目录下的日志文件,解符号引用,打包
tar czfh logs.tgz $(find . -name *.log)
 7za

高压缩比压缩工具。支持7z, ZIP, CAB, ARJ, GZIP, BZIP2, TAR, CPIO, RPM, DEB等格式

格式:
7za [adeltux] [-] [SWITCH] [ARCHIVE_NAME] [ARGUMENTS]...

子命令:
a 添加
d 删除
e 解压
l 列出明细
t 测试
u 更新
x 解压,保留路径

选项:
-bd 禁用百分比指示器
-l 跟踪符号链接
-m{Parameters} 参数
-mhe=on|off 启用或者禁用归档文件头加密,仅用于7z
-o{Directory} 输出目录
-p{Password} 设置密码
-si 从标准输入读取数据
-so 写出数据到标准输出
-sfx[{name}] 创建自解压文档
-t{Type} 归档文件的类型 7z, zip, gzip, bzip2, tar,默认7z
-u[-][p#][q#][r#][x#][y#][z#][!newArchiveName] 更新选项
-w[path] 设置工作目录
-y 对所有提问默认选择是

举例:

Shell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#把dir目录中所有文件加入到archive.7z中
#-m0=lzma 使用lzma方式
#-mx=9 使用最高压缩级别
#-mfb=64 设置LZMA快速比特
#-md=32m 字典大小设置为32MB
#-ms=on 启用固化归档,所有文件被作为一个大数据块看待
7za a -t7z -m0=lzma -mx=9 -mfb=64 -md=32m -ms=on archive.7z dir
 
#把dir目录中所有文件加入到自解压文件archive.exe中
7za a -sfx archive.exe dir
#压缩单个文件
7za a -t7z /tmp/gmem.sql.7z /tmp/gmem.sql
 
#压缩并加密
7za a -mhe=on -ppswd archive.7z dir
 
#解压到当前文件夹,保持目录结构
7za x archive.zip
#解压到指定/tmp目录
7za x /tmp/gmem.sql.7z -o/tmp
 
 
#Linux/Unix备份,注意不能直接使用7za,因为文件所有权信息无法保存
#备份并压缩为7z格式
tar cvf  - dir | 7za a -si archive.tar.7z
#解压缩并展开备份文件
7za x -so archive.tar.7z | tar xf -
shar 标准的 GNU/UNIX 压缩工具
bzip2 用来压缩的一个可选的工具, 通常比 gzip 命令压缩率更高
zip, unzip 跨平台的文件归档和压缩工具
gzip,gunzip

跨平台的文件归档和压缩工具

举例:

Shell
1
2
3
4
5
# 从标准输入读取数据并压缩
docker save busybox:1.30.1 | gzip -c > busybox.tar.gz
 
# 解压缩到标准输出
gunzip -c busybox.tar.gz
cpio

从归档文件拷贝出、拷贝到归档文件

拷出模式:

将文件拷贝到归档文件中,从stdin读取一系列文件名(每个一行),然后将归档文件写出到标准输出

拷入模式:

从归档文件拷贝文件,或者列出归档文件的内容

选项:

-d 如果必要,创建需要的目录
-i  以拷入模式运行
-m 保持文件的修改时间不变

数学与计算命令
 命令 说明 
factor 分解质因数,空格分隔结果
bc 支持浮点运算
expr

通用求值表达式:通过给定的操作(参数必须以空格分开)连接参数进行算术操作、比较操作、字符串操作或者是逻辑操作

举例:

Shell
1
2
expr 5 + 3
a=`expr 5 + 3` #等价于 $((5+3))
seq

打印一系列连续的数字

格式:

Shell
1
2
3
4
5
6
# 从1开始,LAST结束
seq [OPTION]... LAST
# 从FIRST开始,LAST结束
seq [OPTION]... FIRST LAST
# 从FIRST开始,LAST结束,步长INCREMENT
seq [OPTION]... FIRST INCREMENT LAST 
通信与网络命令
命令 说明 
host

DNS查找工具,用于进行域名和IP地址的双向转换

格式:
host [-aCdlriTwv] [-c class] [-N ndots] [-t type] [-W time]
   [-R number] [-m flag] hostname [server]

选项:
-a 等价于 -v -t ANY
-R 指定重试次数(发送UDP包的个数)
-c 查询类,一般不用指定,默认IN表示互联网地址查询
-t 指定查询类型,支持A,NS,CNAME,PTR,MX,ANY等,
-v -d 启用冗长输出
-w 一直等待不超时
-W 指定最多等待多久,单位秒
-4 强制基于IPv4发送查询
-6 强制基于IPv6发送查询

举例:

Shell
1
2
3
4
5
6
7
8
9
10
#查询域名gmem.cc的所有类型的记录
host -v -t ANY gmem.cc 8.8.4.4
#输出内容:
#Trying "gmem.cc"
#Using domain server:
#Name: 8.8.4.4
#Address: 8.8.4.4#53
#Aliases:
#
#;; ->>HEADER<>HEADER<
nslookup

和DNS服务器交互。如果不指定任何参数,进入交互模式

格式:

nslookup [-option] [name | -] [server]

选项:

[no]debug 调试模式
port=value  DNS服务器端口
querytype=value ,type=value 查询类型,默认A
[no]recurse,提示DNS服务器,是否递归的请求上游DNS
[no]fail,如果一个DNS服务器应答SERVFAIL,是否尝试下一个
[no]vc,发送请求时是否总是使用虚拟环路(virtual circuit)

示例:

Shell
1
2
3
4
5
# 通过TCP 5353端口进行查询
nslookup -vc kubernetes.default.svc.k8s.gmem.cc localhost -port=5353
 
# 发起AAAA查询
nslookup -q=AAAA tredis-keydb-0.tredis-keydb 10.96.0.10
arp

操控系统的ARP缓存

格式:
arp [-vn] [-H type] [-i if] [-a] [hostname]
arp [-v] [-i if] -d hostname [pub]
arp [-v] [-H type] [-i if] -s hostname hw_addr [temp]
arp [-v] [-H type] [-i if] -s hostname hw_addr [netmask nm] pub
arp [-v] [-H type] [-i if] -Ds hostname ifname [netmask nm] pub
arp [-vnD] [-H type] [-i if] -f [filename]

选项:
-v, --verbose 显示冗余信息
-d 删除 ARP表中对应IP的条目条目:arp -d address
-s 新增一条ARP表条目:arp  -s address hw_addr
-n, --numeric 显示数字地址,而不是尝试解析主机名、端口
-H type, --hw-type type 在读取ARP缓存时,该参数指明那种条目需要被检查,默认值是以太网ether
-a 使用备选的BSD风格的输出格式 (不固定列宽)
-D, --use-device 使用网络接口的名称,而不是硬件地址
-i If, --device If 选择一个网络接口

举例:

Shell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#eth1将应答针对192.168.3.90的ARP请求,并将该IP地址关联到eth0的MAC地址
arp -i eth1 -Ds 192.168.3.90 eth0 pub
 
#删除eth1上关于192.168.3.90的ARP条目
arp -i eth1 -d 192.168.3.90
 
#查询eth1上的ARP条目
arp -i eth1
#Address        HWtype  HWaddress           Flags Mask            Iface
#192.168.0.89   ether   0c:82:68:52:76:3e   C                     eth1
#192.168.0.243  ether   00:d0:23:82:ba:12   C                     eth1
#192.168.0.61   ether   e0:db:55:ad:29:3c   C                     eth1
 
 
 
# 根据Mac地址查询IP地址
ip neighbor | grep "00:e0:4c:68:7e:45" | cut -d" " -f1
arp-scan

ARP扫描器
该命令向本地网络上的主机发送ARP数据报,并打印任何响应信息
可以使用--I指定使用的网络接口,如果不指定,该命令会使用所有的配置好的网卡(loopback除外)
默认情况下,数据报被发送到以太网广播地址ff:ff:ff:ff:ff:ff

选项:
-f 从文件而不是命令行读取目标主机名称或者地址
-l 从网络接口的配置(IP和子网掩码)中生成目标主机的地址,包含广播地址
-r 每个目标主机的总计重试次数,默认2
-t 初始的每个主机的超时时间,默认100
-i 最小的数据报发送间隔
-v 显示冗余进度信息
-R 随机打乱目标主机列表的顺序
-N 仅使用IP地址,不使用主机名,使用该选项后,所有目标主机必须以IP地址的方式指定
-I 使用的本机网络接口的名称,该接口必须支持ARP协议
-q 仅显示最小化的输出
-g 不显示重复的数据报,默认的会显示并添加(DUP: n)后缀

举例:

Shell
1
2
3
#通过eth1网卡执行扫描,并显示其中IP地址为192.168.0.232的条目
#该命令可以用于IP查重
sudo arp-scan -I eth1 -l | grep 192.168.0.232
traceroute

跟踪到目的主机的路由信息

格式:

Shell
1
2
3
4
5
6
7
8
9
10
traceroute [-46dFITUnreAV] [-f first_ttl] [-g gate,...]
           [-i device] [-m max_ttl] [-p port] [-s src_addr]
           [-q nqueries] [-N squeries] [-t tos]
           [-l flow_label] [-w waittime] [-z sendwait] [-UL] [-D]
           [-P proto] [--sport=port] [-M method] [-O mod_options]
           [--mtu] [--back]
           host [packet_len]
traceroute6  [options]
tcptraceroute  [options]
lft  [options]

选项:
-4, -6 明确强制使用IPv4或者IPv6,默认会根据制定的host名自动解析,根据结果来判断使用IPv6还是IPv4,如果同时支持,则默认使用IPv4
-I, --icmp 使用ICMP回应作为探针
-T, --tcp 使用TCP SYN作为探针
-d, --debug 启用Socket级别的调试信息
Enable socket level debugging (when the Linux kernel supports it)
-f first_ttl, --first=first_ttl 第一次使用的TTL,默认1
-g gateway, --gateway=gateway 指定一个IP源路由选项
-i interface, --interface=interface 发送数据报使用的网络接口,默认根据路由表选择
-m max_ttl, --max-hops=max_ttl 最大跃点数(TTL),默认30
-n 显示结果时不把IP映射为主机名
-w waittime, --wait=waittime 等待响应的时间,默认5秒
-q 发送探针的数量
-s source_addr, --source=source_addr 手工指定源IP地址,默认根据网络接口的IP地址确定
-z sendwait, --sendwait=sendwait 发送探针报文的最小间隔,默认0
--mtu 沿着追踪路径检测最大传输单元(MTU)

举例:

Shell
1
2
3
4
5
6
7
1  * * *
2  119.57.167.17  21.994 ms  21.737 ms  22.433 ms
3  * * *
21  * * *
22  103.3.62.198  336.846 ms *  342.442 ms
#从第一跳一直检测到目标主机,或者超过最大跃点数限制
# 默认发送三个探针,出现星号表示超时前,当没有收到前跳对应的节点的回应报文
mtr

mtr是一个包含traceroute和ping功能的单一网络诊断工具,mtr命令启动后,会诊断当前主机和目标主机之间的网络状况,它会特意利用较低TTL发送封包,突然增加的数据报丢失率或者响应时间通常提示较差的网络状况或者网络负载过高。支持IP ECHO、UDP、TCP三种类型的封包

格式:

Shell
1
2
3
4
5
6
mtr  [-hvrctglspeniuTP46]   [--help]   [--version]  
     [--report]   [--report-wide]   [--report-cycles COUNT]  
     [--curses]   [--split]   [--raw]  [--mpls]  [--no-dns]  
     [--show-ips]  [--gtk] [--address IP.ADD.RE.SS]
     [--interval SECONDS] [--psize BYTES | -s BYTES] [--tcp]
     [--port PORT] [--timeout SECONDS] HOSTNAME [PACKETSIZE]

选项:

-r --report 以报告模式运行,将运行-c指定的次数,然后打印统计信息并退出
-w --report-wide 宽格式,不会截断主机名
-c --report-cycles COUNT ping包的数量,每个ping的周期为1秒
-s --psize BYTES 发送数据报的字节数,包含IP和ICMP头
-n --no-dns 显示数字的IP地址,不去查DNS
-b --show-ips 同时显示主机名和IP地址
-o --order FIELDORDER 设置输出列的顺序,例如 -o "LSD NBAW" 字符含义如下:L丢失率;D丢弃包数;R接收包数;S发送包数;N最新RTT;B最小RTT;W最大RTT;V标准偏差;G几何平均数;J当前抖动;M平均抖动;X最差抖动;I到达间隔抖动
-l --raw 使用原始输出格式
-a --address IP.ADD.RE.SS 绑定输出数据包到某个网络接口
-i SECONDS --interval SECONDS ICMP ECHO请求的发送间隔
-u 使用UDP数据报代替ICMP ECHO
-T --tcp 使用TCP SYN 包代替ICMP ECHO
-P PORT --port PORT 目标TCP端口
--timeout SECONDS 放弃连接之前保持TCP套接字打开的秒数
-4 -6 仅仅使用 IPv4或者 IPv6

ping

发送因特网控制报文协议(ICMP)的ECHO_REQUEST数据报到网络上的主机
格式:
ping 
  [-aAbBdDfhLnOqrRUvV] [-c count] [-F flowlabel] [-i interval] [-I interface] 
  [-l preload] [-m mark] [-M pmtudisc_option] [-N nodeinfo_option] [-w deadline] 
  [-W timeout] [-p pattern] [-Q tos] [-s packetsize] [-S sndbuf] [-t ttl] 
  [-T timestamp option] [hop ...] destination

选项:
-c count 发送count个数据报后,停止发送,如果指定-w,会等待所有应答返回,直到超时
-D 在每一行的开始打印时间戳 Print timestamp (unix time + microseconds as in gettimeofday) before each line.
-f 只显示点号,当发送一个数据报时,打印一个点,收到一个响应时,打印一个退格键,如果不指定-i,则尽可能快的发送数据报
-i interval 两次发送数据报时的间隔,默认1秒
-I interface 指定地址或者网络接口的名称,数据报从该接口发出
-n 在输出中使用数字,不解析为主机名
-O 打印未到达的响应,一般与-D联用
-q 安静模式,只在开始和结束时打印统计信息
-r 跳过默认的路由表,直接往目标主机发送报文 
-s packetsize 发送的数据字节数,默认56,加上8字节的ICMP头,共计64字节
-w deadline 指定超时的秒数,ping在退出前会等待

举例:

Shell
1
ping -f blog.gmem.cc
whois 执行DNS注册信息查询
curl

向服务器传输、从服务器读取数据。支持DICT, FILE, FTP, FTPS, GOPHER, HTTP, HTTPS, IMAP, IMAPS, LDAP, LDAPS, POP3,
POP3S, RTMP, RTSP, SCP, SFTP, SMTP, SMTPS, TELNET和TFTP等协议

格式: curl [options] [URL...]

选项:

# 显示进度条
-0 使用HTTP1.0
--http1.1 使用HTTP1.1
--http2.0 使用HTTP2.0
-1 使用TLSv1
-2 使用SSLv2
-3 使用SSLv3
-4 使用IPv4
-6 使用IPv6
-a 在用于FTP/SFTP上传时,附加到目标文件,而非替换它
-A 设置UserAgent
--anyauth 自动识别身份验证方式
-b 发送Cookie信息
-c 保存Cookie信息
-d 指定请求体参数
-D 输出Header
-e 设置Referer
-G 强制以GET方法提交
-H 设置请求头
-L 自动处理重定向
-X 指定使用的HTTP方法
--resolve host:port:ip 覆盖系统默认DNS解析
-w 指定输出的内容,可以用%{variable_name}格式指定输出变量。支持的变量包括:

content_type  MIME类型
http_code  响应状态码
time_namelookup 到解析域名成功所消耗的时间
time_connect 到建立TCP连接所消耗的时间
time_total  总计消耗时间

-s  安静模式,不显示进度和错误信息
-v  显示冗长的调试性信息

示例:

Shell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
# 输出响应到控制台
curl https://blog.gmem.cc
# 输出响应到文件
curl -o index.html https://blog.gmem.cc
 
# 设置HTTP头
curl -H "Host: ci.gmem.cc"  https://localhost
 
# HTTPS覆盖服务器DNS名
curl -sv --resolve git.pacloud.io:443:127.0.0.1 https://git.pacloud.io
 
# 下载文件到当前目录
curl -O https://www.gmem.cc/100.bin
 
# 通过SFTP下载
curl -u alex sftp://bj.gmem.cc/path/to/file
 
# 通过HTTP上传
curl --insecure -u "USER:PSWD" --data-binary "@/path/to/file" http://gmem.cc
 
# 获取HTTP头
curl -I http://www.gmem.cc
 
# 访问FTP服务器,列出文件和目录
curl ftp://ftp.gmem.cc --user username:password
# 上传文件到FTP服务器
curl -T file.zip ftp://ftp.gmem.cc/ --user username:password
 
# 设置Referer
curl -e "https://blog.gmem.cc/" https://gmem.cc
 
# POST
curl -d "name=alex&password=111" http://blog.gmem.cc/login
 
# 保存Cookie
curl -c cookie.txt https://gmem.cc
# 发送Cookie
curl -b "key=value"  https://gmem.cc
curl -b cookie.txt https://gmem.cc
 
# 保存头
curl -D header.txt url
 
# 获取状态码
 
# 指定HTTP方法
curl -X PUT -d arg=val -d arg2=val2 localhost:8080
 
# 覆盖DNS解析
curl --resolve httpbin.k8s.gmem.cc:443:10.102.172.91 https://httpbin.k8s.gmem.cc/status/418
 
# 指定客户端证书
curl --cacert /home/alex/Documents/puTTY/ca.crt --cert alex.cert --key alex.key ...
 
# 仅仅输出响应状态码
curl -s -o /dev/null -I -w "%{http_code}" http://10.0.11.11
 
# 设置UA
curl -A "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_2) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.52 Safari/537.17" url
curl -H "User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.89 Safari/537.36" url
wget

非交互的从web或ftp站点上取得或下载文件

格式:
wget [option]... [URL]...

基本选项:
-b --background 启动后转入后台运行
日志选项:
-d --debug 打印调试输出
-q --quiet 安静模式,没有任何输出
-v --verbose 冗长模式,输出更多信息
-nv --non-verbose 关掉冗长模式,但不是安静模式
-o --output-file=LOG 把日志写到LOG文件中
-a --append-output=LOG 把日志追加到FILE文件中
输入选项:
-i --input-file=FILE 读取输入文件,并下载其中的URL
-F --force-html 把输入文件当作HTML格式文件对待
-B --base=URL 基地址,用于解析输入文件中的相对地址
下载选项:
--bind-address=a 指定本地使用地址或主机名
-t --tries=NUMBER 设定最大尝试连接次数,0表示无限制
-O --output-document=F 把下载内容写到文件F中
-nc --no-clobber 不要覆盖存在的文件
--backups=backups 备份被覆盖的文件,backups指定最大备份数量
-c --continue 接着下载没下载完的文件,断点续传
--progress=dot/bar 设定进度条标记
-N --timestamping 不要重新下载文件除非比本地文件更新
-S --server-response 打印服务器的响应头
-T --timeout=SECONDS 设定响应超时的秒数
-w --wait=SECONDS 两次尝试之间间隔SECONDS秒
-Y --proxy=on/off 打开或关闭代理
-Q --quota=NUMBER 设置下载的容量限制,可以附带K/M/G单位
--limit-rate=RATE 限定每秒下载输率,可以附带K/M/G单位
-4 --inet4-only 只使用IPv4
-6 --inet6-only 只使用IPv6
--user=user
--password=password 使用FTP或者HTTP用户名及密码
--ask-password 手工输入密码
--no-iri 禁用国际化的URL,默认禁用
目录选项:
-nd --no-directories 当递归的下载时不创建目录层次,将导致所有文件存放在当前目录
-x --force-directories 与-nd相反,强制创建相应的目录层次
-nH --no-host-directories 禁止生成主机前缀目录,默认的http://gmem.cc会创建gmem.cc/目录
--cut-dirs=number 忽略number层递归的远程目录的创建
-P --directory-prefix=p 下载文件保存到p/目录下
HTTP选项:
--default-page=name URL目录默认地址,用于代替index.html
-E --adjust-extension 根据Mime类型来调整文件扩展名
--http-user=user
--http-password=pswd 覆盖user/password,提供HTTP验证用户密码
--no-http-keep-alive 关闭HTTP的keep-alive特性,默认的,连续下载多个文件会使用同一TCP连接
--no-cache 禁用服务器端缓存,将发送no-cache请求头
--no-cookies 禁用cookies
--load-cookies file 从文件载入cookies
--save-cookies file 保存cookiles
--keep-session-cookies 让--save-cookies同时保存会话级cookies,默认会话级cookie在会话结束即失效
--ignore-length 忽略响应头Content-Length
--header=header-line 设置请求头,可以指定该选项多次
--max-redirect=number 最大重定向次数
--proxy-user=user
--proxy-password=pswd 代理服务器验证使用
--referer=url 设置请求头Referer: url
--save-headers 保存服务器发送的请求头道文件
-U --user-agent=agent 指定请求头User-Agent
--post-data=string
--post-file=file 使用POST发送所有请求,并把请求体设置为参数指定的内容
--method=HTTP-Method 指定使用的HTTP方法,例如POST或者GET
HTTPS选项:
--secure-protocol=p 使用的安全协议,例如auto, SSLv2, SSLv3, TLSv1, PFS
--https-only 递归下载时,仅下载HTTPS链接
When in recursive mode, only HTTPS links are followed.
--no-check-certificate 不验证服务器证书,也不要去URL的主机名与证书匹配
--certificate=file 指定客户端证书所在的文件
--certificate-type=type 客户端证书的类型,例如PEM,DER
--private-key=file 指定私钥文件,允许私钥与证书存放在不同文件
--private-key-type=type 私钥类型,例如PEM,DER
--ca-certificate=file 指定CA证书文件
--ca-directory=directory 指定CA证书的目录(PEM格式)
--random-file=file
递归下载:
-r, --recursive 递归下载
-l, --level=NUMBER 最大递归深度
--delete-after 在下载完毕后局部删除文件
-k, --convert-links 转换非相对链接为相对链接
-K, --backup-converted 在转换文件X之前,将之备份为 X.orig
-m, --mirror 等价于 -r -N -l inf -nr.
-p, --page-requisites 下载为了展示HTML页面所必须的所有文件,例如图片
-A, --accept=LIST 分号分隔的被接受扩展名的列表
-R, --reject=LIST 分号分隔的不被接受的扩展名的列表
-D, --domains=LIST 分号分隔的被接受域的列表
--exclude-domains=LIST 分号分隔的不被接受的域的列表
--follow-ftp 跟踪HTML文档中的FTP链接
--follow-tags=LIST 分号分隔的被跟踪的HTML标签的列表
-G, --ignore-tags=LIST 分号分隔的被忽略的HTML标签的列表
-H, --span-hosts 当递归时转到外部主机
-L, --relative 仅仅跟踪相对链接
-I, --include-directories=LIST 允许目录的列表
-X, --exclude-directories=LIST 不被包含目录的列表
-np, --no-parent 不要追溯到父目录

举例:

Shell
1
2
3
4
5
6
7
8
9
10
11
#下载JDK7
wget
  --no-cookies
  --no-check-certificate
  --header "Cookie: gpw_e24=http%3A%2F%2Fwww.oracle.com%2F; oraclelicense=accept-securebackup-cookie"
   "http://download.oracle.com/otn-pub/java/jdk/7u67-b01/jdk-7u67-linux-x64.tar.gz"
   -O jdk-7u67-linux-x64.tar.gz
#下载Tomcat7
wget
   "http://mirrors.hust.edu.cn/apache/tomcat/tomcat-7/v7.0.61/bin/apache-tomcat-7.0.61.tar.gz"
   -O apache-tomcat-7.0.61.tar.gz
route

显示或修改内核路由表信息

格式:
route [-CFvnee]
route [-v] [-A family] add [-net|-host] target [netmask Nm] [gw Gw] [metric N] [mss M] [window W] [irtt I] [reject] [mod] [dyn] [reinstate] [[dev] If]
route [-v] [-A family] del [-net|-host] target [gw Gw] [netmask Nm] [metric N] [[dev] If]
route [-V] [--version] [-h] [--help]

选项:
-A family 使用指定的地址组,例如inet
-F 在内核的FIB路由表上操作,默认值
-C 在内核的路由表缓存上操作
-n 显示基于数字的地址,而不是尝试将其解析为符号主机名
-e 使用netstat(8)格式显示路由表
-ee 显示所有输出列
del 删除一条路由
add 添加一条路由
target 路由的目标网络或者主机,支持IP和主机名
-net 指定目标类型是网络
-host 指定目标类型是主机
netmask NM 添加网络的路由时使用,子网掩码
gw GW 通过网关(路由器)来路由,路由器必须直接可达
metric M 设置路由表的metric字段
mss M 设置通过此路由的TCP连接的最大段大小(Maximum Segment Size,MSS),单位字节,默认为设备的MTU减去头部
window W 设置通过此路由的TCP连接的TCP窗口大小(TCP window size),单位字节,一般仅在AX.25 网络使用
irtt I 设置通过此路由的TCP连接的初始往返时间(initial round trip time,irtt),单位毫秒,一般仅在AX.25 网络使用
reject 安装一个阻断路由,用于强制一个路由查找失败
mod, dyn, reinstate 安装一个动态或者修改的路由,主要用于诊断用途
dev If 强制路由域指定的网络接口关联。否则内核会自己尝试判断使用哪个网络接口,如果该选项位于命令行尾部,dev字样可以省略

举例:

Shell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#添加一个普通的环回条目,使用子网掩码255.0.0.0,关联到网卡lo
route add -net 127.0.0.0 netmask 255.0.0.0 dev lo
#添加一个路由,使本地网络192.56.76.0通过网卡eth0访问
route add -net 192.56.76.0 netmask 255.255.255.0 dev eth0
#添加一条默认路由(默认路由在其它路由不匹配时生效)
#通过此路由的数据报都发往路由器mango-gw
#通往mango-gw的静态路由必须被事先设置
route add default gw mango-gw
#添加一条针对网络10.x.x.x的拒绝路由
route add -net 10.0.0.0 netmask 255.0.0.0 reject
 
#删除当前默认路由,默认路由的目的显示为 "default" 或者 0.0.0.0
route del default
#删除经有网关docker通向网络172.27.0.0/16的路由
route del -net 172.27.0.0 netmask 255.255.0.0 gw docker

输出:
包含以下列:
Destination 目标网络或者主机
Gateway 网关地址,如果没有设置,则为*(0.0.0.0)
Genmask 目的(即路由到的)网络的子网掩码。目标是H显示255.255.255.255,默认路由显示0.0.0.0。之所以叫Genmask使因为此字段显示了此路由的覆盖性(Generality)
Flags 标记,包括
  U (该路由可用)
  H (目标是主机)
  G (使用网关,该标记非常重要,用于区分是直接还是间接路由,前者不需要G)
  R (动态路由的复原路由)
  D (该路由由重定向报文创建)
  M (该路由已被重定向报文修改)
  A (通过addrconf添加的路由)
  C (缓存条目)
  ! (拒绝路由)

Metric 到目标的“距离”,使用hops计数表示
Ref 正在使用路由的活动进程个数
Use 显示的是通过该路由发送的分组数
Iface 数据报发往的网络接口
MSS 通过此路由的TCP连接的最大段大小
Window 通过此路由的TCP连接的TCP窗口大小
irtt 通过此路由的TCP连接的初始往返时间,内核使用该值猜测理想TCP协议参数

netcat
nc

通过TCP和UDP在网络中读写数据

示例:

Shell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 端口扫描:扫描172.31.100.7的21-25之间的端口
# -z 连接成功后立即关闭
# -v 输出详细信息
# -n 不要进行DNS反查
nc -z -v -n 172.31.100.7 21-25
 
# 开启服务器
nc -l 1567
# 开启客户端
nc 172.31.100.7 1567
 
# 文件传输
nc -l 1567 < file.txt
nc -n 172.31.100.7 1567 > file.txt
 
# 磁盘克隆
dd if=/dev/sda | nc -l 1567
nc -n 172.31.100.7 1567 | dd of=/dev/sda
socat

多用途的套接字转发器,能够建立两个双向套接字,并在其间中继数据

socat命令实例的生命周期分为以下阶段:

  1. init阶段:解析选项、初始化日志
  2. open阶段:打开第一个地址,然后打开第二个地址。该步骤通常是非阻塞的
  3. transfer阶段:通过select()监控两个流的文件描述符上的读写,并进行中继
  4. closing阶段:当某一个流到达EOF,该阶段启动,传输EOF到另外一个流

格式:

Shell
1
socat [options] <address> <address>

-d 打印更多信息,指定-d多次,则信息更详细,最多4个
-D 进入transfer模式之前,打印文件描述符信息
-lf 打印日志到文件而非stderr
-x 同时将中继的数据写入到stderr
-u 非双向模式,从第一个地址读,写入第二个
-U 非双向模式,从第二个地址读,写入第一个

地址规格:

地址类型关键字:[地址参数1:地址参数...][,地址选项1,地址选项2...]

地址类型关键字大小写不敏感,对于某些地址类型,关键字可以省略

如果地址规格以数字开头,则被假设为FD(原始文件描述符)地址,如果在第一个:或,之前出现 /,则假设关键字为GOPEN(一般性文件打开)

地址类型:

CREATE:<filename>  以create()打开指定的路径,并使用FD进行写(以create打开的不支持读)操作
EXEC:<command-line>  创建子进程,通过execvp()调用一个程序
FD:<fdnum>  打开文件描述符
GOPEN:<filename> 打开文件
OPEN:<filename>  使用open()调用打开文件,针对UDS会出错
IP-SENDTO:<host>:<protocol>  打开原始IP套接字,进行发送
IP4-SENDTO:<host>:<protocol>
IP6-SENDTO:<host>:<protocol>
IP-RECVFROM:<protocol>  打开原始IP套接字,进行接收
IP4-RECVFROM:<protocol>
INTERFACE:<interface>  连接到网卡,使用链路层通信
STDIN:打开标准输入
STDOUT:打开标准输出
TCP:<host>:<port> 连接到TCP服务器
TCP-LISTEN:<port> 打开TCNP端口并监听
UDP:<host>:<port> 发送到UDP服务器
UDP-LISTEN:<port> 打开UDP端口并监听
UNIX-CONNECT:<filename>  连接到UDS套接字
UNIX-LISTEN:<filename> 监听UDS套接字
ABSTRACT-CONNECT:<string>  和UNIX类似,仅仅针对抽象命名空间
ABSTRACT-LISTEN:<string>
ABSTRACT-SENDTO:<string>
ABSTRACT-RECVFROM:<string>
ABSTRACT-RECV:<string>
ABSTRACT-CLIENT:<string>

示例:

Shell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 从文件读取信息
socat - /tmp/hello
# 写入信息到文件
echo hello | socat - /tmp/hello
 
# 连接到远程端口
socat - TCP:192.168.1.252:3306
# 监听端口
socat TCP-LISTEN:7000 -
 
# 监听抽象UDS
socat ABSTRACT-LISTEN:xtables -
 
# 端口转发
socat -d -d -lf /var/log/socat.log
  # 监听端口         绑定地址          
  TCP4-LISTEN:15672,bind=192.168.1.252,reuseaddr,fork
  # 转发到的地址
  TCP4:172.17.0.15:15672
netstat

显示当前网络的统计和信息, 比如网络连接、路由表、网卡统计、组播关系

格式:

Shell
1
2
3
4
5
6
7
8
netstat [address_family_options] [--tcp|-t] [--udp|-u] [--raw|-w] [--listening|-l] [--all|-a] [--numeric|-n] [--numeric-hosts] [--numeric-ports] [--numeric-users] [--symbolic|-N] [--extend|-e[--extend|-e]] [--timers|-o] [--program|-p] [--verbose|-v] [--continuous|-c]
netstat {-route|-r} [address_family_options] [--extend|-e[--extend|-e]] [--verbose|-v] [--numeric|-n] [--numeric-hosts] [--numeric-ports] [--numeric-users] [--continuous|-c]
netstat {-interfaces|-i} [--all|-a] [--extend|-e[--extend|-e]] [--verbose|-v] [--program|-p] [--numeric|-n] [--numeric-hosts] [--numeric-ports] [--numeric-users] [--continuous|-c]
netstat {-groups|-g} [--numeric|-n] [--numeric-hosts] [--numeric-ports] [--numeric-users] [--continuous|-c]
netstat {-masquerade|-M} [--extend|-e] [--numeric|-n] [--numeric-hosts] [--numeric-ports] [--numeric-users] [--continuous|-c]
netstat {-statistics|-s} [--tcp|-t] [--udp|-u] [--raw|-w]
netstat {-version|-V}
netstat {-help|-h} address_family_options: [-4] [-6] [--protocol={inet,unix,ipx,ax25,netrom,ddp}[,...]] [--unix|-x] [--inet|--ip] [--ax25] [--ipx] [--netrom] [--ddp]

子命令描述:
本命令打印Linux网络系统的信息,信息的类型由第一个参数控制:
(none) 默认的,显示开启的Socket的信息,如果不指定任何地址族(address families)则所有配置的地址族均显示
--route , -r 显示内核路由表
--groups , -g 显示IPv4、IPv6组播关系
--interfaces, -i 显示网卡的表格
--masquerade , -M 显示masqueraded connections(Linux下类似于one-to-many的NAT的功能,允许内网机器通过单台连接到互联网机器上网)
--statistics , -s 显示各协议的统计信息

选项:
-A, --protocol=family 只显示选定的地址族(Socket种类),逗号分隔,包括inet, unix, ipx, ax25, netrom, ddp
--wide , -W 不截断IP地址
-n ,--numeric 显示数字的地址、端口、用户名,不指定可能显示主机名、知名端口名称
--numeric-hosts 显示数值的地址,不影响端口和用户名的解析
--numeric-ports 显示数值的端口,不影响主机和用户名的解析
--numeric-users 显示数值的用户ID,不影响主机和用户名的解析
--protocol=family , -A 指定地址族,逗号分隔
-c, --continuous 每秒刷新一次
-e, --extend 显示额外的信息,使用两次显示最大化信息
-o, --timers 包含和网络计时器相关的信息
-p, --program 显示每个Socket归属的PID和程序名
-l, --listening 仅显示监听Socket
-a, --all 显示监听和非监听Socket
-F 打印来自FIB的路由信息
--verbose , -v 显示冗长信息
-C 打印来自路由缓存的路由信息

输出:

--- 默认输出 ---

Shell
1
2
3
4
5
6
7
8
9
10
11
12
13
root@gmem:~# netstat
Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State
tcp        0      0 li759-7.members.l:59042 74.125.23.1:xmpp-client ESTABLISHED
tcp        0      0 localhost:48305         localhost:64001         TIME_WAIT
tcp        0    268 li759-7.members.lin:ssh 119.57.167.18:2065      ESTABLISHED
tcp        0      0 li759-7.members.li:http 119.57.167.18:5058      FIN_WAIT2
 
Active UNIX domain sockets (w/o servers)
Proto RefCnt Flags       Type       State         I-Node   Path
unix  11     [ ]         DGRAM                    8076     /dev/log
unix  2      [ ]         DGRAM                    8344
unix  3      [ ]         STREAM     CONNECTED     7974     @/com/ubuntu/upstart

Active Internet connections (TCP, UDP, raw)
Proto Socket使用的协议(tcp, udp, raw)
Recv-Q 通过该Socket接收到的,未被用户程序拷贝的字节数
Send-Q 通过该Socket接收到的,未被远程主机确认的字节数
Local Address 本地通信地址、端口
Foreign Address 远程通信地址、端口
State Socket的状态:
  ESTABLISHED Socket包含一个建立的连接
  SYN_SENT 正在尝试建立连接
  SYN_RECV 已经从网络接收到连接请求
  FIN_WAIT1 Socket被关闭,并且连接正在关闭
  FIN_WAIT2 连接被关闭,Socket正在等待远端(remote end )的关闭动作
  TIME_WAIT Socket正在等待接收(于关闭后)仍然在网络上的数据包
  CLOSE Socket没有被使用
  CLOSE_WAIT 远端(remote end )已经关闭,等待Socket的关闭
  LAST_ACK 远端(remote end )已经关闭,Socket被关闭,等待确认
  LISTEN Socket正在监听传入连接
  CLOSING 双方Socket都在关闭,但是本端仍有数据没发送
  UNKNOWN 状态未知
User Socket所有者的用户名或者UID
PID/Program 斜线分隔Socket所有者的PID和程序名

Active UNIX domain Sockets
Proto Socket使用的协议(通常unix)
RefCnt 引用计数(附着到该Socket的进程数)
Flags 包括: SO_ACCEPTON (ACC), SO_WAITDATA (W), SO_NOSPACE (N)
Type Socket类型
  SOCK_DGRAM Socket以数据报(无连接)模式使用
  SOCK_STREAM Socket以数据流(有连接)模式使用
  SOCK_RAW  原始Socket
  SOCK_RDM 仅可靠传输消息
  SOCK_SEQPACKET 顺序数据包
  UNKNOWN
Path 附着到该Socket的进程路径

--- --route输出 ---

Shell
1
2
3
4
5
root@gmem:~# netstat -r
Kernel IP routing table
Destination     Gateway         Genmask         Flags   MSS Window  irtt Iface
default         gw-li759.linode 0.0.0.0         UG        0 0          0 eth0
106.185.46.0    *               255.255.255.0   U         0 0          0 eth0

Destination 目标网络或者主机
Gateway  网关地址
Genmask  目标网络的子网掩码
Flags 标记
MSS  通过此路由的TCP连接的最大段大小
Window  通过此路由的TCP连接的TCP窗口大小
irtt  通过此路由的TCP连接的初始往返时间
Iface 所使用的网络接口

--- --groups输出 ---

Shell
1
2
3
4
5
6
7
root@gmem:~# netstat --groups
IPv6/IPv4 Group Memberships
Interface       RefCnt Group
--------------- ------ ---------------------
lo              1      all-systems.mcast.net
eth0            1      all-systems.mcast.net
lo              1      ip6-allnodes

Interface 参与组播的网络接口
RefCnt 参与到此多播组的进程数量
Group 多播组的名称或地址

举例:

Shell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#列出所有处于监听状态的TCP端口,使用数字来显示地址与端口
#如果不指定n参数,可能会以“知名端口”名来显示端口,不利于直观的查看
#例如8080端口可能显示为sunrpc
netstat -ltn
netstat -a  #列出所有端口
netstat -at #列出所有tcp端口
netstat -au #列出所有udp端口
netstat -l  #列出所有处于监听状态的 Sockets
netstat -s  #显示所有端口的统计信息
netstat -st # 显示TCP端口的统计信息
netstat -p  #在输出中显示PID和进程名称
netstat -antp -4 #显示所有IPv4的监听、非监听Socket,并且不显示主机名
netstat -r  #显示核心路由信息
netstat -ap | grep ssh   #搜索程序运行的端口
netstat -an | grep ':80' #搜索占用端口的进程
netstat -i  #显示网络接口列表
tcpdump

网络包嗅探器。把匹配指定expression的包头都显示出来。在tcpdump运行结束后,会报告以下内容:
捕获的包个数(tcpdump接收被处理的包个数)
内核丢弃的包个数(由于缺少缓冲区)

格式:

tcpdump
  [ -AbdDefhHIJKlLnNOpqRStuUvxX ] [ -B buffer_size ] [ -c count ]
  [ -C file_size ] [ -G rotate_seconds ] [ -F file ]
  [ -i interface ] [ -j tstamp_type ] [ -m module ] [ -M secret ]
  [ -P in|out|inout ]
  [ -r file ] [ -V file ] [ -s snaplen ] [ -T type ] [ -w file ]
  [ -W filecount ]
  [ -E spi@ipaddr algo:secret,... ]
  [ -y datalinktype ] [ -z postrotate-command ] [ -Z user ]
  [ expression ]

选项:

-A 以ASCII形式打印每个包(除去连接层头部)
-B 设值操作系统捕获缓冲区大小,单位KB
-c 接收到指定数量的包后退出
-C 在把原始包写入文件前,检查当前文件是否大于file_size,如果是,关闭并打开新文件。后续文件的名称依据-w选项确定,后缀以1开始的序号,file_size的单位是100万字节
-D 打印可捕获包的网络接口的列表,对于每个接口,打印一个数字、接口名称,可能附加一个文字描述
-e 在dump的每一行打印链路层头部,可以用于为以太网、IEEE 802.x等协议打印MAC地址
-F 使用文件作为过滤表达式(filter expression)的输入。如果指定该参数,命令行提供的表达式被忽略
-h 打印tcpdump、libpcap版本和用法,并退出
-i 指定需要监听的网络接口
-j 设置时间戳类型为tstamp_type
-J 列出网络接口支持的时间戳类型并退出
-K 不去尝试验证IP、TCP、UDP的校验和
-L 列出网卡已知的数据链路类型,并退出
-n 不把地址(主机地址、端口等)转换为名称
-N 不去打印主机名所属域部分
-P 选择需要捕捉的包的类型(发送还是接收),有效的值包括in、out、inout
-p 不要把网卡改为混杂模式
-q 快速模式,打印较少的协议信息
-r 从文件中读取包(文件是通过-w选项创建的)
-S 打印绝对(而不是相对)的TCP序列号
-t 不在每一行上打印时间戳
-tt 在每一行打印未格式化的时间戳
-ttt 打印与前一行的时间偏移量,以微秒为单位
-tttt 使用默认格式打印时间戳
-ttttt 打印与第一行的时间偏移量,以微秒为单位
-u 打印未编码的NFS句柄
-v 冗余输出IP包的选项字段被打印,同时启用额外的包完整性检查,例如验证IP、ICMP头的校验和。使用-w时每10秒打印捕获的包个数
-vv 更冗余的输出
-vvv 更更冗余的输出
-w 打印原始包到文件,而不是解析、打印到标准输出
-W 与-C联用,限制文件的数量,如果超过了,循环覆盖第一个文件
-x 当解析并打印时,除了打印包的头部,还以HEX形式打印包除去链路层头的数据部分
-xx 当解析并打印时,除了打印包的头部,还以HEX形式打印包的数据部分
-X 当解析并打印时,除了打印包的头部,还以HEX、ASCII形式打印包除去链路层头的数据部分
-XX 当解析并打印时,除了打印包的头部,还以HEX、ASCII形式打印包的数据部分
-y 在捕获包到datalinktype时设置datalinktype

关于表达式
表达式用于过滤哪些包需要被输出,如果不指定表达式,则所有包被输出,表达式语法参考pcap-filter

关于iptables:

对于出站流量来说,tcpdump是最后一个看见流量的软件,也就是说,只要tcpdump看到流量,就说明本机没有软件层次上的防火墙措施。如果iptables DROP掉了包,则tcpdump不会抓到包

iptables ⇨ tcpdump ⇨ 网络接口 ⇨网线

对于入站流量来说,tcpdump是第一个看见流量的软件

网线  ⇨ 网络接口 ⇨ tcpdump ⇨ netfilter/iptables

举例:

Shell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# 要在Vmware Guest上使用tcpdump,需要在Host上设置网卡的权限
sudo chmod a+rw /dev/vmnet8
 
# 打印来自、发往主机:zircon的包
tcpdump host zircon
# 打印 zircon与vm1或者vm2之间的包,注意花括号需要转义
tcpdump host zircon and \( vm1 or vm2 \)
# 打印zircon与除vm3以外所有主机的IP包
tcpdump ip host zircon and not vm3
# 打印所有通过网关snup的FTP流量
tcpdump 'gateway snup and (port ftp or ftp-data)'
# 打印既不是来源于、也不是发送到本地网络的IP数据报
tcpdump ip and not net 192.168.0.0/16
# 打印主机192.168.0.201与本机端口7777的IP数据报
tcpdump ip host 192.168.0.201 and port 7777 -n -p
# 对于每一个非本地主机参与的TCP连接,打印起始(SYN)与结束(FIN)包
tcpdump 'tcp[tcpflags] & (tcp-syn|tcp-fin) != 0 and not src and dst net 192.168.0.0/16'
# 打印来自或者去往80端口的IPv4的HTTP包
tcpdump 'tcp port 80 and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)'
# 打印通过网关snup,且大于576字节的IP数据报
tcpdump 'gateway snup and ip[2:2] > 576'
# 打印不是通过以太网广播、多播的IP广多播包
tcpdump 'ether[0] & 1 = 0 and ip[16] >= 224'
# 打印非echo请求应答(ping)的ICMP包
tcpdump 'icmp[icmptype] != icmp-echo and icmp[icmptype] != icmp-echoreply'
 
# 监听所有网络接口
tcpdump -i any port 2379
ssh

OpenSSH客户端

格式:
ssh
  [-1246AaCfgKkMNnqsTtVvXxYy]
  [-b bind_address] [-c cipher_spec] [-D [bind_address:]port]
  [-E log_file] [-e escape_char] [-F configfile] [-I pkcs11] [-i identity_file]
  [-L  [bind_address:]port:host:hostport] [-l login_name] [-m mac_spec]
  [-O ctl_cmd] [-o option] [-p port] [-Q cipher | cipher-auth | mac | kex | key]
        [-R [bind_address:]port:host:hostport] [-S ctl_path] [-W host:port]
        [-w local_tun[:remote_tun]]
        [user@]hostname [command]

描述:
SSH客户端用于登陆到远程机器,并在远程机器上执行命令。支持在两个不相互信任的机器之间,通过不安全网络建立安全连接。
如果提供command选项,那么会在远程机器上执行命令而不是登陆为Shell
SSH客户端亦可充当SOCKS代理服务器,进行端口转发,或者实现反向连接(到内网机器)

选项:
-1 强制ssh使用协议1
-2 强制ssh使用协议2
-4 强制ssh仅使用IPv4
-6 强制ssh仅使用IPv6
-q 安静模式,服务器的Banner不会显示
-b 仅在多IP机器上使用,指定连接的源地址
-C 要求对所有数据进行压缩。压缩算法于gzip一致
-c 指定连接的加密算法
-D 指定本地应用级的端口转发,发往本地bind_address:port的套接字连接一律通过SSH隧道转发。应用协议用来确定在远程机器上连接到何处,支持的协议是SOCKS4、SOCKS5,SSH充当SOCKS服务器
-E 将调试日至转发到文件而不是stderr
-F 指定备选的用户级别的配置文件,会导致全局配置文件 /etc/ssh/ssh_config 被忽略,默认用户级别配置文件为 ~/.ssh/config 
-f 让ssh在执行命令前转到后台运行。如果配置项ExitOnForwardFailure=true,则启用此选项的ssh客户端会在所有远程端口转发成功建立后才传入后台
-g 允许远程主机连接到本地已转发(forwarded)端口
-I 指定ssh使用的PKCS#11共享库
-i 指定用于公钥身份验证的私钥文件。对于协议1,默认文件 ~/.ssh/identity ,对于协议2,默认文件 ~/.ssh/id_dsa 、 ~/.ssh/id_ecdsa 、 ~/.ssh/id_ed25519 、 ~/.ssh/id_rsa 。可以在配置文件中针对每个主机设置私钥文件
-L 将本机[bind_address:]port转发到远程host:hostport
-l 登陆到远程机器时使用的用户名
-N 不执行远程命令,在仅仅用ssh进行端口转发时指定
-n 重定向标准输入到/dev/null,当ssh在后台运行时,必须指定,指定-f时自动指定此选项
-o 覆盖配置文件中的选项,例如-o "IdentityFile=gmem.key"
-p 远程主机的监听端口
-R 反向端口转发,远程机器(服务器)[bind_address:]port被自动转发到本地机器host:hostport。该选项启用后,ssh在远程机器(服务器)上开启port的监听,并把针对远程机器bind_address地址port端口的请求全部通过SSH隧道转发到本地。忽略bind_address或者将其指定为*则绑定远程机器的所有IP地址
注意:如果服务器使用的是OpenSSH,必须启用

/etc/ssh/sshd_config
1
GatewayPorts yes

否则总是绑定到127.0.0.1
-T 不分配伪终端(pseudo-tty)

-t 强制分配伪终端
-v 冗长模式,打印调试信息

端口转发功能:

SSH客户端支持三种端口转发(SSH隧道):

-L 本机网络接口:本机端口:远程网络接口:远程端口。正向转发,本机可以通过本机端口访问远程服务
-R 远程网络接口:远程端口:本机网络接口:本机端口。反向转发,远机可以通过本机端口访问本机服务
-D 本机网络接口:本机端口。动态转发,本地产生一个Socks代理,通过代理的请求,发送到远机的相同端口。例如本地代理端口8087,本地客户端访问xxxx端口都会被转发给远程主机的xxxx端口

注意:
服务器端是OpenSSH时,默认情况下root不能通过密码登录到SSH,需要修改:

/etc/ssh/sshd_config
1
PermitRootLogin yes

举例:

Shell
1
2
3
4
5
6
7
8
9
10
11
12
# 基于公钥认证机制登陆
ssh -i ~/Documents/puTTY/gmem.key root@vpn.gmem.cc
 
# 启用正向端口转发,将本机2222端口转发到192.168.104.91:22
ssh -nNTf -L 0.0.0.0:2222:192.168.104.91:22 -o "ExitOnForwardFailure yes" root@192.168.104.91
 
# 启用反向端口转发
ssh -nNT -R vpn.gmem.cc:2022:localhost:22 root@vpn.gmem.cc
    -o "ExitOnForwardFailure yes"   # 转发失败则退出remote port forwarding failed for listen...
 
# 连接到目标机器,执行两个命令,然后退出
ssh -i /root/Documents/puTTY/gmem.key root@tk.gmem.cc "uname;echo OK"
sshpass

通过命令行传递SSH密码

执行下面的命令安装此工具:

Shell
1
sudo apt-get install sshpass

示例:

Shell
1
sshpass -p password ssh root@host
scp

安全拷贝(远程文件拷贝)

格式:
scp
  [-1246BCpqrv] [-c cipher] [-F ssh_config] [-i identity_file]
  [-l limit] [-o ssh_option] [-P port] [-S program] 
  [[user@]host1:]file1 ...
  [[user@]host2:]file2

描述:
该命令使用SSH来进行网络上文件的拷贝,使用与SSH一样的身份验证并提供与SSH一样的安全性保证,如果需要身份验证,scp会提示输入密码。
可以将本地文件拷贝到远程服务器,反之亦可,在两台远程服务器之间拷贝文件也是支持的。
当目标文件存在时,scp会覆盖其内容,但是保留inode;如果目标文件不存在,则首先创建一个空白文件,并把内容填充进去

Windows下可以安装WinSSHD以支持SCP。

选项:
-1 强制scp使用协议1
-2 强制scp使用协议2
-4 强制scp仅使用IPv4
-6 强制scp仅使用IPv6
-B 执行批处理模式(阻止密码输入提示)
-C 启用压缩
-c cipher 指定用于加密传输数据的密钥
-F ssh_config 指定传输给ssh的配置文件
-i identity_file 指定ssh私钥文件,用于基于公钥的的身份验证
-l limit 限制使用带宽(Kbit/s)
-P port 指定远程主机的端口
-p 保留原始文件的修改时间、访问时间等信息
-q 安静模式,禁用进度、诊断信息
-r 递归的复制整个目录,自动以树遍历顺序跟踪符号连接的目标
-S program 用于加密连接的程序
-v 冗长模式,导致scp和ssh打印调试信息

举例:

Shell
1
2
3
4
5
6
# 将远程文件复制到本机当前目录(注意Windows路径的转写)
scp Suigintou@192.168.0.89:/e:/Software/Developer/pdtenv/Tomcat7.tar.gz  .
# 复制目录下所有sh文件,当前目录同名文件自动覆盖
scp root@192.168.0.90:/usr/local/Kingsmart/Tomcat7/*.sh .
# 将本地文件复制到远程机器
scp -i ~/gmem.key /tmp/gmem.sql root@tk.gmem.cc:/tmp/gmem.sql
sftp

SFTP客户端。该客户端使用SSH协议进行通信

选项:
很多SSH、SCP命令的配置可以使用,这里不列出
-D sftp_server_path  直接连接到本地SFTP服务器

交互式命令:
bye  exit  退出
cd   修改服务器的当前目录
chgrp  修改服务器文件的组
chmod  修改服务器文件的权限
chown  修改服务器文件的所有者
df  显示当前目录所在文件系统的使用情况信息。-h人类可读,-i显示inode信息
get [-afPpr] remote-path [local-path]
下载远程文件到本地,如果local-path不指定则文件名由远程给出。remote-path可以包含通配符以匹配多个文件,local-path可以是目录。-a 尝试断点续传,-f在传输完成后调用fsync,-P/-p拷贝权限和访问时间信息,-r递归下载子目录
lcd  修改本地的当前目录
lls  列出本地文件
lmkdir  在本地创建目录
ln  创建符号连接
lpwd  打印本地当前目录
ls  列出远程文件
lumask  设置本地umask
mkdir  创建远程目录
progress  显示进度信息
put [-fPpr] local-path [remote-path]   上传本地文件到服务器
pwd  显示当前目录
reget [-Ppr] remote-path [local-path]  断点续传
rename oldpath newpath  重命名
rm path  删除文件
rmdir path  删除目录

举例:

Shell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 使用公钥认证,连接到交互式客户端
sftp -o "IdentityFile=/root/Documents/puTTY/gmem.key" root@tokyo.gmem.cc
 
# 进入指定本地目录
lcd /var/lib
# 进入指定的远程目录
cd /var/lib
 
# 列出远程文件
ls
 
# 下载远程目录到本地
get -ar mysql
 
# 修改远程文件的组、权限、所有者
chgrp grp /path/to
chmod mode /path/to
chown own /path/to
 
 
# 退出交互式客户端
exit
nmap

执行网络探测与端口扫描
该工具可以用来快速扫描大型网络

格式:
nmap [Scan Type...] [Options] {target specification}

目标选项:
可以指定主机名、IP地址或者网络,例如:scanme.nmap.org, microsoft.com/24, 192.168.0.1; 10.0.0-255.1-254
-iL 从文件中读取目标
-iR 随机选取目标
--exclude 排除目标
--excludefile 从文件中读取排除目标
目标发现选项:
-sL 简单的列出待扫描的目标
-sn 使用PING扫描,禁用端口扫描
-Pn 认为所有目标主机在线
-PS/PA/PU/PY[portlist] 对端口列表执行TCP SYN/ACK,UDP或SCTP扫描
-PE/PP/PMICMP 执行echo, timestamp,或者netmask request探针
-PO[protocol list] 执行IP协议PING
-n/-R 从不/总是进行DNS查找
--dns-servers 指定逗号分隔的DNS列表
--system-dns 使用操作系统DNS
--traceroute 跟踪每个主机的路由情况
扫描技术选项:
-sS/sT/sA/sW/sM 执行TCP SYN/Connect()/ACK/Window/Maimon扫描
-sU 执行UDP扫描
-sN/sF/sX 执行TCP Null, FIN, Xmas扫描
--scanflags 定制TCP扫描标记
-sI 执行空闲扫描
-sO IP协议扫描
端口选项:
-p 仅扫描指定的端口,合法的实例:-p22; -p1-65535; -p U:53,111,137,T:21-25,80,139,8080,S:9
-F 快速扫描,比标准扫描探测更少的端口
-r 顺序的扫描端口
--top-ports num 扫描num个最知名的端口
服务检测:
-sV 探测打开的端口,以确定服务的类型与版本
操作系统检测:
-O 启用操作系统检测
输出选项:
-oN/-oX/-oS/-oG file 输出一般格式,XML格式,kIddi3,Grepable格式到文件
--reason 显示当口处于某个状态的原因
--open 仅显示打开状态的端口
--packet-trace 显示所有收发的数据包
--append-output 附加到输出文件的尾部而不是覆盖
-v 增加输出的冗长级别
-vv进一步增加输出的冗长级别

其它选项:
-6 启用IPv6扫描
--send-eth 发送原始以太网数据桢
--send-ip 发送IP数据报
-A 启用操作系统探测、版本探测、路由跟踪

举例:

Shell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
#对gmem.cc进行全面扫描
nmap -v -A gmem.cc
#alex@amethystine:~$ nmap -v -A gmem.cc
#Starting Nmap 6.40 ( http://nmap.org ) at 2015-05-21 15:15 CST
#NSE: Loaded 110 scripts for scanning.
#NSE: Script Pre-scanning.
#执行PING扫描
#Initiating Ping Scan at 15:15
#Scanning gmem.cc (106.185.46.7) [2 ports]
#Completed Ping Scan at 15:15, 0.07s elapsed (1 total hosts)
#执行DNS解析
#Initiating Parallel DNS resolution of 1 host. at 15:15
#Completed Parallel DNS resolution of 1 host. at 15:15, 0.01s elapsed
#Initiating Connect Scan at 15:15
#扫描端口,可以看到该服务器可能开启了MySQL、Apache、SSH服务
#Scanning gmem.cc (106.185.46.7) [1000 ports]
#Discovered open port 80/tcp on 106.185.46.7
#Discovered open port 22/tcp on 106.185.46.7
#Discovered open port 1723/tcp on 106.185.46.7
#Discovered open port 3306/tcp on 106.185.46.7
#Discovered open port 3690/tcp on 106.185.46.7
#Completed Connect Scan at 15:16, 13.28s elapsed (1000 total ports)
#扫描应用服务
#Initiating Service scan at 15:16
#Scanning 5 services on gmem.cc (106.185.46.7)
#Completed Service scan at 15:16, 15.58s elapsed (5 services on 1 host)
#NSE: Script scanning 106.185.46.7.
#Initiating NSE at 15:16
#Completed NSE at 15:16, 2.77s elapsed
#Nmap scan report for gmem.cc (106.185.46.7)
#Host is up (0.10s latency).
#rDNS record for 106.185.46.7: li759-7.members.linode.com
#Not shown: 995 closed ports
#PORT     STATE SERVICE  VERSION
#探测到SSH服务
#22/tcp   open  ssh      (protocol 2.0)
#| ssh-hostkey: 1024 2c:89:42:27:6d:12:b0:17:72:79:3f:ad:51:e0:04:ed (DSA)
#| 2048 1b:1e:2d:e0:10:c1:89:62:4e:c2:bc:7f:dd:ae:67:a1 (RSA)
#|_256 62:5f:c1:16:c7:42:b6:46:0d:d9:69:b0:88:c1:4b:6d (ECDSA)
#探测到Apache服务
#80/tcp   open  http     Apache httpd 2.4.7 ((Ubuntu))
#|_http-methods: POST OPTIONS GET HEAD
#|_http-title: Site doesn't have a title (text/html)
#探测到VPN服务
#1723/tcp open  pptp     linux (Firmware: 1)
#探测到MySQL服务
#3306/tcp open  mysql    MySQL 5.5.35-1ubuntu1
#| mysql-info: Protocol: 10
#| Version: 5.5.35-1ubuntu1
#| Thread ID: 8572
#| Some Capabilities: Long Passwords, Connect with DB, Compress, ODBC, Transactions, Secure Connection
#| Status: Autocommit
#|_Salt: &a81/9l7
#探测到SVN服务
#3690/tcp open  svnserve Subversion
#NSE: Script Post-scanning.
#Initiating NSE at 15:16
#Completed NSE at 15:16, 0.00s elapsed
#Read data files from: /usr/bin/../share/nmap
#Service detection performed. Please report any incorrect results at http://nmap.org/submit/ .
#Nmap done: 1 IP address (1 host up) scanned in 31.95 seconds
 
 
#对本地局域网进行PING扫描
nmap -v -sn 192.168.0.1-254
ifconfig

查看或者配置网络接口

描述:
该命令用于配置内核常驻(kernel-resident)的网络接口,可以在系统启动时建立网络连接,如果不给定任何参数,该命令会显示当前活动的网络接口的列表

格式:
ifconfig [-v] [-a] [-s] [interface]
ifconfig [-v] interface [aftype] options | address ...

选项:
-a 显示所有网络接口,包括已经停用的
-s 显示简短列表,类似netstat -i
interface 网络接口的名称
aftype 地址族,用于解析和现实所有协议地址,支持inet (TCP/IP, default), inet6 (IPv6), ax25 (AMPR Packet Radio), ddp (Appletalk Phase 2), ipx (Novell IPX) 以及 netrom (AMPR Packet radio)
up 该标记导致网络接口被激活,如果为网络接口分配了IP地址,则自动隐含该标记
down 该标记导致网络接口被停用
[-]arp 启用或者停用该网络接口的APR协议支持
[-]promisc 启用或者停用网络接口的混杂模式,如果启用,网络上所有数据报被该网络接口接收
[-]allmulti 启用或者停用网络接口的全组播模式,如果启用,网络上所有多播包被该网络接口接收
metric N 在计算数据包转发次数时,所要加上的数目
mtu N 设置最大传输单元
dstaddr addr 设置PPP协议远端的IP地址
netmask addr 设置该网络接口的子网掩码
add addr/prefixlen 为网络接口分配一个IPv6地址
del addr/prefixlen 为网络接口移除一个IPv6地址
[-]broadcast [addr] 设置该网络接口的广播地址,或者清除该网络接口的IFF_BROADCAST标记
[-]pointopoint [addr] 启用点对点模式,与另外一台计算机直连
hw class address 如果设备驱动支持,可以设置该网络接口的硬件地址
multicast 设置该网络接口的多播标记
address 设置分配给该网络接口的IP地址

举例:

Shell
1
2
3
4
5
6
#设置eth1的广播地址
ifconfig eth1 broadcast 192.168.0.255
#设置eth0的IP地址
ifconfig eth0 192.168.0.90
#停用eth1
ifconfig eth1 down
ip

显示或者配置路由、网卡、策略路由或者隧道

关于Linux路由的更多知识,参考:Linux网络知识集锦

格式:

Shell
1
2
3
# 如果不清楚对象支持哪些命令,可以 ip object help
ip [ OPTIONS ] OBJECT { COMMAND | help }
ip [ -force ] -batch filename

选项:
-V, -Version 显示版本并退出
-b, -batch <FILENAME> 批处理模式,从指定的文件或者标准输入读取命令并调用,第一个错误导致退出
-force 批处理模式中出现错误时不退出
-s, -stats, -statistics 输出更多的信息,该选项使用多次会导致更多的信息被打印
-l, -loops <COUNT> 命令 ip addr flush 最大循环次数,默认0表示循环直到所有地址被移除
-f, -family <FAMILY> 指定使用的地址族
-4 等价于 -family inet
-6 等价于 -family inet6
-B 等价于 -family bridge
-D 等价于 -family decnet
-I 等价于 -family ipx
-0 等价于 -family link
-o, -oneline 每个记录单独一行显示,换行符替换为反斜杠('\')
-r, -resolve 使用系统的DNS解析器来打印主机地址

对象:
所有对象名称都支持前缀简写,例如address可以简写为addr或者a
address 设备的协议(IPv4或者IPv6)地址
addrlabel 协议地址标签
l2tp 第二层隧道协议,在IP协议上建立以太网隧道
link 网络设备,其add子命令用于添加虚拟设备(virtual link)
maddress 多播地址
monitor 监听网络连接信息
mroute 多播路有缓存条目
mrule 多播路有策略数据库中的规则
neighbour 管理ARP和NDISC缓存条目
netns 管理网络名字空间
route 路由表条目
rule 路由策略数据库中的规则
tunnel IP协议隧道
tuntap  TUN/TAP设备,TUN/TAP分别是模拟网络层/链路层的内核虚拟设备
xfrm 管理IPSec策略

举例:

Shell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
# 给网络接口eth0分配一个IP地址,设置会在系统重启后丢失
ip addr add 192.168.0.89 dev eth0
# 显示IP地址、MAC地址等信息
ip addr show
# 仅仅显示特定网络接口的信息
ip addr show dummy0
 
# 移除IP地址
ip addr del 192.168.0.89/24 dev eth0
# 禁用网络接口
ip link set eth1 down
# 启用网络接口
ip link set eth1 up
 
# 显示所有设备
ip link ls
# 显示指定类型的设备
ip link show type bridge|veth|tap
# 显示详细信息,例如设备类型
ip -d link show
# 6: kube-ipvs0: <BROADCAST,NOARP> mtu 1500 qdisc noop state DOWN mode DEFAULT group default
#  link/ether 2e:be:57:1f:f0:d5 brd ff:ff:ff:ff:ff:ff promiscuity 0
#  dummy addrgenmode eui64
#  类型
# 10: cali11f1d8af43c@if4: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1440 qdisc noqueue state UP mode DEFAULT group default
#  link/ether ee:ee:ee:ee:ee:ee brd ff:ff:ff:ff:ff:ff link-netnsid 3 promiscuity 0
#  veth addrgenmode eui64
#  类型
 
# 添加一个网桥
ip link add br0 type bridge
# 删除一个网桥
ip link delete br0 type bridge
 
# 添加一个macvtap设备,其lower device为eth0
ip link add link eth0 name macvtap0 type macvtap
# 为macvtap设置MAC地址并启动
ip link set macvtap0 address 1a:46:0b:ca:bc:7b up
 
# 添加一个TAP设备,归属于root用户
ip tuntap add tap0 mode tap user root
 
# 添加一个veth对,同属默认网络命名空间
ip link add veth0 type veth peer name veth1
 
# 设置tap0的master设备为br0,即把tap0束缚(enslave)到br0。用于把一个虚拟/真实设备连接到网桥
# 被连接到网桥的设备,其状态必须为up
ip link set tap0 master br0
# 释放tap0的被束缚状态。用于解除一个虚拟/真实网络设备到网桥的连接
ip link set tap0 nomaster
 
# 显示路由表
ip route show
# 显示指定路由表的内容
ip route list table 133
 
# 添加静态路由
ip route add 10.10.20.0/24 via 192.168.0.1 dev eth0  # via网关的间接路由
ip route add 10.0.0.0/8 dev br0                      # 直接路由
# 移除静态路由
p route del 10.10.20.0/24
 
# 添加默认路由(网关)
ip route add default via 192.168.0.1
 
# 添加网络命名空间
ip netns add test
# 将设备移动到网络命名空间
ip link set veth1 netns test
# 在网络命名空间下执行命令
ip netns exec test ip link show veth1
 
# 添加策略路由,具有123标记的封包,查找100表
ip rule add fwmark 123 lookup 100
 
# 列出策略路由
ip -f inet rule list
# 0:      from all lookup local
# 具有0x539的封包,查找133表
# 32765:  from all fwmark 0x539 lookup 133
# 32766:  from all lookup main
# 32767:  from all lookup default
ip route

管理路由表

格式:

Shell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 列出或刷新选择器匹配的路由
ip route { list | flush } SELECTOR
 
# 保存和恢复路由
ip route save SELECTOR
ip route restore
 
# 查询路由
ip route get ADDRESS [ from ADDRESS iif STRING  ] [ oif STRING ] [ tos TOS ]
 
# 增删改换路由
ip route { add | del | change | append | replace } ROUTE
 
 
# SELECTOR语法
[ root PREFIX ] [ match PREFIX ] [ exact PREFIX ] [ table TABLE_ID ] [ proto RTPROTO ] [ type TYPE ] [ scope SCOPE ]
 
# ROUTE语法
ROUTE = [ TYPE ] PREFIX [ tos TOS ] [ table TABLE_ID ] [ proto RTPROTO ] [ scope SCOPE ] [ metric METRIC ]
        [ [ via ADDRESS ] [ dev STRING ] [ weight NUMBER ] [ onlink | pervasive ] OPTIONS FLAGS [ nexthop NH ] ... ]
# 其中TYPE包括
[ unicast | local | broadcast | multicast | throw | unreachable | prohibit | blackhole | nat ]

路由类型:

  1. unicast,此路由条目描述到达PREFIX所覆盖的目的地址的路径
  2. unreachable,PREFIX覆盖的网络不可达,发送ICMP消息host unreachable
  3. blackhole,PREFIX覆盖的网络不可达,静默的丢弃
  4. prohibit,PREFIX覆盖的网络不可达,发送ICMP消息communication administratively prohibited
  5. local,目的地指向本机,包被环回并本地递送
  6. broadcast,目的地是广播地址,包作为link broadcasts发送

示例:

Shell
1
2
# 添加一个local类型的路由到100表中,此路由让一切路由都走lo网卡
ip route add local 0.0.0.0/0 dev lo table 100 
ip rule

管理路由策略数据库。典型的路由算法仅仅根据目的地址来决定如何路由,如果需要更加高级的路由策略 —— 例如基于源地址、IP协议、传输协议端口甚至协议载荷,则需要使用该命令。这种高级路由叫做policy routing

为了实现策略路由,原先的基于目的地址的、以最长匹配规则排序的路由表,被替换为路由策略数据库(RPDB)。通过执行数据库中的一些规则,来决定如何路由

每个策略路由规则由选择器SELECTOR和动作断言ACTION PREDICTATE构成。RPDB按照规则的优先级降序(数字越小优先级越高)的被扫描,每个规则的SELECTOR针对封包的{source address, destination address, incoming interface, tos, fwmark}进行匹配判断,如果匹配成功,则ACTION被执行。

ACTION PREDICTATE可以返回成功,这种情况下它要么给出路由目的地址,要么给出失败提示,且RPDB查找终止。否则(不成功)则继续匹配下一条RPDB规则

在内核启动时,它会初始化具有三条规则的RPDB:

  1. 优先级0;选择器:匹配任何封包;动作:查找路由表local(ID 255)。local是一个特殊的路由表,包含本地地址、广播地址的高优先级的控制路由。此规则不能删除或修改
  2. 优先级RPDB;选择器:匹配任何封包;动作:查找路由表main(ID 254)。main表是一个普通的路由表,包含所有非策略性路由规则。此表可以被删除或覆盖
  3. 优先级32767;选择器:匹配任何封包;动作:查找路由表default(ID 253)。default表是空白的,用于没有匹配到的封包的后处理

每个RPDB条目都包含一些额外的属性,例如每个规则都有向路由表的指针。NAT和masquerading规则包含一个属性,用于选择转换/掩码的IP地址。

RPDB包含以下几种类型的规则:

  1. unicast,返回规则所引用的路由表中的一个条目
  2. blackhole,安静的丢弃封包
  3. unreachable,生成一个Network is unreachable错误
  4. prohibit,生成一个Communication is administratively prohibited错误
  5. nat,将源地址转换为其它值

格式:

Shell
1
2
ip [ OPTIONS ] rule  { COMMAND | help }
ip rule  [ list | add | del | flush ] SELECTOR ACTION

其中SELECTOR可以是(以下项中的多个):

  1. from PREFIX,匹配源地址的前缀
  2. to PREFIX,匹配目的地址的前缀
  3. tos TOS,匹配Type of Service
  4. fwmark FWMARK[/MASK],匹配防火墙标记,也就是iptables的MARK
  5. iif STRING,匹配封包的来源网卡,这意味着你可以为本地发起的、转发的封包设置完全独立的路由规则
  6. oif STRING,匹配封包的出口网卡,仅仅对来自本地的、绑定到特定设备的套接字有效
  7. pref NUMBER,优先级,同义词priority、order

其中ACTION可以是:

  1. table TABLE_ID,表ID可以是local | main | default | NUMBER,如果匹配规则,则到哪个表中查找路由
  2. nat ADDRESS
  3. prohibit | reject | unreachable
  4. realms [SRCREALM/]DSTREALM ]

ACTION后面可以跟着SUPPRESSOR:[ suppress_prefixlength NUMBER ] [ suppress_ifgroup GROUP ]

示例:

Shell
1
2
# 添加一个规则,匹配标记为1的封包,到100表中查找
ip rule add fwmark 1 lookup 100
bridge

显示/操控网桥地址和设备

举例:

Shell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
# 显示所有连接到网桥的网络接口(端口,Port)的信息
bridge link
bridge link show dev eth0
 
# 在端口上设置网桥相关的属性
bridge link set
  dev eth0           # 针对哪个端口
  cost COST          # STP路径成本
  priority PRIO      # STP端口优先级
  state STATE        # 端口状态:0禁用 1STP监听 2 STP学习 3STP转发 4STP阻塞
  root_block on|off  # 端口是否为STP的根端口
  hairpin on|off     # 流量是否可以从接收它的端口发回去,默认否,流量不会从接收端口转发回去
 
 
 
# FDB包含了网桥每个端口(连接)上已知的MAC地址
# 添加FDB项
bridge fdb add
  LLADDR             # MAC地址
  dev DEV            # MAC地址关联的网络接口
  dst IPADDR         # MAC地址所在的VXLAN隧道端点(VTEP)的IP地址
  vni VNI            # VXLAN VNI网络标识符(VXLAN段ID),连接到VTEP是需要
  port PORT          # 远程VTEP的UDP端口
  via DEVICE         # 为了将数据报送达远程VTEP,需要通过的设备
 
  self               # 关联到软件FDB(默认)
  embedded           # 关联到offloaded FDB
  router             # 关联到路由器
 
# 显式FDB项
bridge fdb show
 
 
 
# MDB包含端口上已知的IP多播组地址
# 添加MDB项
bridge mdb add      
  dev DEV            # 组播地址关联的接口
  port PORT          # 连接到此端口上的link是多播组成员
  grp GROUP          # 组播地址
brctl

操控网桥

格式: brctl [commands]

子命令:

Shell
1
2
3
4
5
6
7
8
9
10
11
addbr             <bridge>  # 新建一个网桥
delbr             <bridge>  # 删除一个网桥
addif             <bridge> <device> # 将一个网卡接入网桥
delif             <bridge> <device> # 从网桥中删除一个设备
setbridgeprio        <bridge> <prio> # 设置网桥优先级
setfd             <bridge> <time> # 设置转发延迟
setmaxage         <bridge> <time> # 设置报文最大生命周期
show              [ <bridge> ] # 显示网桥列表
showmacs          <bridge> # 显示MAC列表
showstp           <bridge> # 显示网桥的STP信息
stp               <bridge> {on|off} # 开关STP

示例: 

Shell
1
2
3
4
5
6
7
8
9
10
11
# 停止eth0
sudo ip link set eth0 down
 
# 添加eth0到libvirt网桥,使用桌面系统时要禁用NM对eth0的管理
sudo brctl addif virbr0 eth0
 
# 为网桥添加一个新IP,此IP原来属于eth0
sudo ip addr add 10.0.1.1/24 dev virbr0
 
# 启动eth0
sudo ip link set eth0 up
iwconfig

支持与网线网络接口相关的配置

iwlist

获取无线网络的详细信息

举例:

Shell
1
iwlist wlan1 scan
wpa_cli

WPA命令行客户端

举例:

Shell
1
2
3
4
5
6
7
8
9
10
11
# 查看当前无线网络的详细信息
sudo wpa_cli status
# Selected interface 'wlan1'
# bssid=e8:ed:f3:fc:b3:bf
# ssid=dangdang-ydgw
# id=0
# mode=station
# pairwise_cipher=CCMP
# group_cipher=CCMP
# key_mgmt=WPA2-PSK
# wpa_state=COMPLETED
ifup

激活一个网络接口。该命令与下面两个命令与/etc/network/interfaces文件一起工作

ifdown

停用一个网络接口

ifquery 

解析一个网络接口的配置

iptables 参考重温Iptables
ipset

IP Sets的管理工具

在iptables中,如果我们去匹配多个无规律的IP地址的话就会写入多条iptables的规则,当如果需要匹配几百甚至上千个IP地址的话,那么性能就会受到严重的影响。IP Sets可以解决这个问题

IP Sets是内核框架,可以被ipset命令管理。根据类型的不同,一个IP Set可以存放多个IP地址、网络号、TCP/UDP端口、MAC地址、网络接口名,以及所有这些的组合。当用一个条目来比对,看是否匹配IP Set时,速度极快

应用场景:

  1. 存储一个IP地址集合,并且和一个Iptables规则进行匹配
  2. 动态的基于IP地址、端口更新iptables规则,而不影响性能
  3. 表述一个复杂的规则集,然后在一个iptables规则中引用

子命令:

Shell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
# 创建具有指定名称、指定类型的IPSet
# 其中TYPENAME格式为:method:datatype[,datatype[,datatype]]
ipset create SETNAME TYPENAME [ CREATE-OPTIONS ]
# 创建一个名为test的hash:ip类型(以哈希形式存储的IP)的IPSet,新条目的默认超时300s(超时后自动移除)。
ipset create test hash:ip timeout 300
# 创建hash:net类型的IPSet
ipset create foo hash:net
# 创建hash:ip,port类型的IPSet
ipset create bar hash:ip,port
 
 
# 添加一个条目到IPSet
ipset add SETNAME ADD-ENTRY [ ADD-OPTIONS ]
# 向test中添加条目192.168.0.1,超时60s
ipset add test 192.168.0.1 timeout 60
# 添加到hash:net类型的IPSet
ipset add foo 192.168.0.0/24
# 添加到hash:ip,port类型的IPSet
ipset add foo 192.168.1.0/24,80-82
ipset add foo 192.168.1.1,udp:53
ipset add foo 192.168.1.1,vrrp:0
ipset test foo 192.168.1.1,80
 
 
# 从IPSet中删除一个条目
ipset del SETNAME DEL-ENTRY [ DEL-OPTIONS ]
# 测试一个条目是否属于IPSet
ipset test SETNAME TEST-ENTRY [ TEST-OPTIONS ]
# 删除指定的IPSet,如果不指定名称,删除所有IPSet
ipset destroy [ SETNAME ]
# 列出指定的IPSet的头信息和条目列表
ipset list [ SETNAME ]
# 保存IPSet到文件
ipset save [ SETNAME ]
# 从文件恢复IPSet
ipset restore
# 刷空IPSet的条目
ipset flush [ SETNAME ]
# 重命名IPSet
ipset rename SETNAME-FROM SETNAME-TO
# 交换IPSet的内容
ipset swap SETNAME-FROM SETNAME-TO

CREATE/ADD选项

timeout 指定条目的超时
nomatch 对于hash:net类型,如果添加新条目是指定此选项,进行匹配时就好像该条目并没有添加一样
comment  指定注释

IPSet类型:

bitmap:ip  使用一段内存存储IPv4主机或网络地址,最多存储65536个条目
bitmap:ip,mac  存储IP+MAC地址对
bitmap:port 存储端口
hash:ip 使用哈希表存储主机地址或网络地址,0 IP不能存储进来
hash:net 存储不同大小的网络地址
hash:net,net 存储一对网络地址
hash:ip,port 存储IP地址和端口

在iptables中使用:

你可以使用匹配扩展set来引用IPSet:

Shell
1
2
3
4
5
ipset create bannedip hash:ip
# 如果封包的源地址属于Ipset bannedip,则丢弃封包
iptables -I INPUT -m set --match-set bannedip src -j DROP
ipset add bannedip 4.5.6.7
ipset add bannedip 1.2.3.4
iptables-save

导出iptables配置到标准输出

iptables-restore

从文件恢复iptables配置

conntrack

此命令提供netfilter的连接跟踪系统的全功能用户空间接口,代替/proc/net/ip_conntrack的功能。使用该命令你可以检索、列出、探查、维护Linux内核的连接跟踪子系统,例如:

  1. Dump出完整或过滤后的连接列表
  2. 从状态表中删除连接
  3. 添加新的连接
  4. 监控连接跟踪事件

连接跟踪系统在内部,维护两个表:

  1. conntrack:默认表,包含当前被追踪的、经过本系统的连接。除非你使用iptables的 NOTRACK目标,否则所有连接都在其中
  2. expect:期望表,连接跟踪期望(Connection tracking expectations )用于“expect“ RELATED连接到一个现有的连接。Expectation主要被connection tracking helpers(也叫Application level gateways, ALGs)使用,处理FTP、SIP、H.323这样的复杂协议

格式:

Shell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 列出
conntrack -L [table] [options] [-z]
# 检索
conntrack -G [table] parameters
# 删除
conntrack -D [table] parameters
# 创建
conntrack -I [table] parameters
# 更新
conntrack -U [table] parameters
# 显示实时事件
conntrack -E [table] [options]
# 刷出整个表
conntrack -F [table]
# 显示计数器
conntrack -C [table]
# 显示内核连接跟踪系统的统计信息
conntrack -S

一般选项:

-z, --zero  读取后自动清零计数器,仅仅和 -L联用
-o, --output [extended,xml,timestamp,id,ktimestamp]  以特定格式显示输出
-e, --event-mask [ALL|NEW|UPDATES|DESTROY][,...]过滤事件类型,和 -E联用
-b, --buffer-size 设置Netlink套接字缓冲大小

过滤器参数:

-s, --orig-src IP_ADDRESS 最初通信方向的源地址
-d, --orig-dst IP_ADDRESS 最初通信方向的目的地址
-r, --reply-src IP_ADDRESS 应答方向的源地址
-q, --reply-dst IP_ADDRESS 应答方向的目的地址 
-p, --proto PROTO L4协议类型,例如TCP UDP
-f, --family PROTO  L3协议族ipv4, ipv6,仅仅和 -L联用。默认IPv4
-t, --timeout TIMEOUT 指定超时
-m, --mark MARK[/MASK] 连接跟踪标记ctmark
-c, --secmark SECMARK 连接跟踪selinux安全标记
-u, --status [ASSURED|SEEN_REPLY|FIXED_TIMEOUT|EXPECTED|UNSET][,...]  连接跟踪状态
-n, --src-nat 仅仅匹配SNAT连接
-g, --dst-nat 仅仅匹配DNAT连接
-j, --any-nat 匹配任何NAT连接
-w, --zone 根据连接跟踪Zone过滤,参考iptables的CT目标
--tuple-src 指定expectation的源地址元组
--tuple-dst IP_ADDRESS 指定expectation的目的地址元组
--mask-src IP_ADDRESS   指定expectation的源地址掩码
--mask-dst IP_ADDRESS 指定expectation的目的地址掩码

TCP过滤参数:

--sport, --orig-port-src  最初通信方向的源端口
--dport, --orig-port-dst 最初通信方向的目的端口
--reply-port-src 应答方向的源端口
--reply-port-dst  应答方向的目的端口
--state [NONE | SYN_SENT | SYN_RECV | ESTABLISHED | FIN_WAIT | CLOSE_WAIT | LAST_ACK | TIME_WAIT | CLOSE | LISTEN]  TCP状态

UDP过滤参数:

--sport, --orig-port-src 最初通信方向的源端口
--dport, --orig-port-dst 最初通信方向的目的端口
--reply-port-src 应答方向的源端口
--reply-port-dst 应答方向的目的端口

ICMP过滤参数:

--icmp-type TYPE  ICMP类型
--icmp-code CODE ICMP代码
--icmp-id ID  ICMP ID

示例:

Shell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 以 /proc/net/ip_conntrack 格式显示连接跟踪表
conntrack -L
conntrack -L -o extended
conntrack -L -o xml
 
# 仅仅列出IPv6
conntrack -L -f ipv6 -o extended
 
# 列出SNAT连接
conntrack -L --src-nat
 
# 列出事件,显示时间戳
conntrack -E -o timestamp
# 注意,输出中包含ASSURED字样的,表示此连接不会被消除,即使达到最大可跟踪连接数量限制后
 
# 删除所有源地址1.2.3.4的连接
conntrack -D -s 1.2.3.4
 
# 标记所有源地址1.2.3.4的连接
conntrack -U -s 1.2.3.4 -m 1 
pen

负载均衡器,支持基于TCP的协议的负载均衡,例如HTTP、SMTP

此LB能够跟踪每个请求,并将其转发给客户端上一次访问的服务器(会话绑定),这种LB算法比RR更加高级

格式:

Shell
1
2
3
pen options [host:]port
  h1[:p1[:maxc1[:hard1[:weight1[:prio1]]]]]
  [h2[:p2[:maxc2[:hard2[:weight2[:prio2]]]]]] ...

选项:

-C 指定控制端口,此端口接收发送给LB的命令
-F 指定配置文件
-H 为HTTP请求添加X-Forwarded-For头
-b 将不响应服务器列入黑名单的持续时间,单位秒
-T 会话跟踪持续时间,单位秒
-S 最大服务器数
-C 最大客户端数
-e host:port 如果所有服务器不可用,使用该紧急服务器
-f 在前台运行
-n 使用非阻塞IO
maxc1 服务器1的最大客户端数量
hard1  服务器1的最大客户端数量(硬限制)
weight1 此服务器的权重,用于基于权重的负载均衡算法
prio1 此服务器的优先级,用于基于优先级的负载均衡算法

示例:

Shell
1
2
# 监听所有网络接口的18000,转发给目标主机的8000,在前台运行,启动调试日志
pen -fd 0.0.0.0:18000 172.27.170.143:8000
snmp

snmp包提供了若干命令,它们的格式如下:

Shell
1
2
3
4
5
snmp_command
  -u bootstrap -l authPriv -a MD5
  -x DES -A temp_password -X temp_password
  
  remote_host snmp_sub_command_or_options

它们公共的选项如下:

-v 指定需要使用的SNMP协议的版本
-c 指定SNMPv1、v2使用的团体名
-u 指定用于身份验证的用户名
-l 指定连接的安全性级别:noAuthNoPriv 不验证不加密;authNoPriv 验证不加密;authPriv 验证加密
-a 身份验证协议:MD5、SHA
-x 数据加密协议:DES、AES
-A 身份验证短语
-X 数据加密短语

命令举例:

Shell
1
2
3
4
5
#执行SNMP get操作,显示系统信息
snmpget
  -u bootstrap -l authPriv -a MD5
  -x DES -A password -X password
  192.168.0.90 1.3.6.1.2.1.1.1.0
justniffer

这是一个TCP包嗅探器,它能够重建TCP流,并且对请求/应答风格的协议做了优化。justniffer还能重建HTTP内容并保存到磁盘

安装:

Shell
1
2
3
sudo add-apt-repository ppa:oreste-notelli/ppa
sudo apt-get update
sudo apt-get install justniffer

格式: 

Shell
1
2
3
4
5
6
7
justniffer
  [ [-i interface] or [-f <tcpdump file>] ]  [-F]
  [-p <packet filter>]  [-u or -x]
  [ [-r] or [-l <log format>] or [-a <log format>]  ]
  [-c <config file>]  [-e <external program>]  [-U <user> ]  
  [-n <not-found> ]  [-s <max concurrent tcp streams> ]  
  [-d <max concurrent IP fragments> ]

选项:

-i 需要嗅探的接口名称,例如eth0
-f 从文件中读取tcpdump,用于离线分析。目标文件必须是pcap文件(tcpdump、wireshark等产生)。jusstniffer需要完整的dump,而默认的tcpdump只会收集每个包的前64字节,因此你需要 tcpdump -i eth0 -s 0 -w file.cap 
-F 强制从文件读取tcpdump,即使dump不是完整的
-p 包过滤器,pcap filter格式,例如 "tcp port 23" 、 "host 8.8.8.8 and tcp port 80" 
-l 日志格式,你可以使用很多 % 开头的占位符。如果不指定使用CLF(Common Log Format,大部分Web服务器的日志格式)
-a 附加日志格式到CLF后面
-r 显示原始流,等价于 -l %request%response 
-s 最大并发的TCP流数量
-d 最大并发的IP分片数量
-x 使用HEX编码不可打印字符
-e 对于请求/应答模式的协议,通过管道,对每个请求/应答调用外部命令
-c 从文件读取配置

日志格式:

%close.originator([not applicable string])
连接关闭方:client,server,timedout,如果不可用,显示入参内的字符串(不指定使用短横线)
%close.time
从最后一个响应到关闭,消耗的时间
%close.timestamp[2]([format])
被关闭时间戳(close timestamp)替换,可以指定时间格式,如果有后缀2,则显示seconds.microseconds格式
%connection
连接持续性指示符,unique请求/应答是TCP连接中唯一的;start是第一个;last是最后一个;continue是中间的 
%connection.time([not applicable string])
从连接建立到现在,流逝的时间
%connection.timestamp[2]([format])
被连接时间戳(connection timestamp)替换,可以指定时间格式
%dest.ip
被目标地址替换
%dest.port
被目标端口替换
%source.ip
被源地址替换
%source.port
被源端口替换
%request
完整的请求,可能多行,可能包含不可打印字符
%request.timestamp[2]([format])
被请求时间戳替换
%request.size
请求的大小,包含请求头
%request.line
用于HTTP,请求行,例如"GET /index.html HTTP/1.1"
%request.method
用于HTTP,请求方法,例如POST
%request.url
用于HTTP,请求地址
%request.protocol
请求的协议
%request.header
请求头,多行。可以使用%request.header.*访问单个HTTP请求头
%response
完整的响应,可能多行,可能包含不可打印字符
%response.size
响应的大小,包含响应头
%response.timestamp[2]([format])
响应时间戳
%response.line
用于HTTP,响应行
%response.protocol
响应协议
%response.code
用于HTTP,响应状态码
%response.message
用于HTTP,响应状态码的字符串表示
%response.header
响应头,多行。可以使用%response.header.*访问单个HTTP响应头
%session.requests
被TCP会话的请求序列号替换
%session.time
被TCP会话lifespan替换
%tab
打印一个TAB
%streams
打印当前TCP流的数量
%newline
打印换行符
%% 
打印 %

时间戳格式:
%Y   年
%m  月,01-12
%d   日,01-31
%H   时,00-23
%M  分,00-59
%S   秒,00-60
%F   等价于 %Y-%m-%d
%T  等价于 %H:%M:%S

举例:

Shell
1
2
3
# 嗅探针对repository.sonatype.org的HTTP请求,打印请求URL和响应状态码
sudo justniffer -i wlan1 -p "host repository.sonatype.org and port 80"
    -l "%connection.timestamp(%F %T) %source.ip:%source.port %request.url %response.code"
setserial

获取或者设置Linux的串口信息。
在正常的初始化过程中,仅仅1-4号串口基于默认I/O端口和IRQ值初始化,要初始化额外的串口或者把1-4号串口修改为非标准配置,可以使用该程序

格式:
setserial [ -abqvVWz ] device [ parameter1 [ arg ] ] ...
setserial -g [ -abGv ] device1 ...

选项:
device 需要操作的设备,例如/dev/ttyS0, /dev/ttyS1, /dev/ttyS2, /dev/ttyS3
-a  获取串口设备信息时,打印所有可用信息
-b 获取串口设备信息时,打印概要配置信息
-g 获取串行端口的配置信息
-q 打印较少的信息
-v 打印冗长信息,输出额外的状态信息
-z 在设置串口标志位前置零

ethtool

查看以太网接口的信息,例如连接速度。示例:

Shell
1
2
ethtool eth0
ethtool eth0 | grep Speed 
系统管理命令
命令 说明 
users 显示所有的登录的用户
last 显示最近登陆的用户列表
groups 列出用户(如果不指定用户则默认当前用户)和他所属于的组,例如 groups alex 
id

显示用户标识符信息,举例:

Shell
1
2
3
id alex
#输出,gid显示了用户的主要组(Primary group),默认主要组和用户名相同
#uid=1000(alex) gid=1000(alex) groups=1000(alex),4(adm),27(sudo)
useradd

创建一个新用户或更新默认新用户信息

格式:
useradd [options] LOGIN
useradd -D
useradd -D [options]

选项:

-b 指定基目录,基目录/账户名就是家目录,基目录默认/home
-c  password文件中的注释字段
-d 指定家目录
-e 账户被禁用的日期,格式YYYY-MM-DD
-f 密码过期后,账户被彻底禁用之前的天数。0 表示立即禁用,-1 表示禁用这个功能
-g 用户初始登陆组(主要组)的组名或ID。组名必须已经存在。组号码必须指代已经存在的组。如果不指定该参数,默认会创建一个和用户名字一样的组,该行为受/etc/login.defs中USERGROUPS_ENAB参数的控制:该参数为no时,新用户被添加到 /etc/default/useradd 中GROUP变量指定的组
-G 用户所属附属组,逗号分隔
-M 不创建家目录
-N 不创建同名组,而是加入到-g指定的组或者使用/etc/default/useradd中的GROUP变量
-p 加密过的密码
-r 创建一个系统账户。不在/etc/shadow中保存密码年龄信息、不创建家目录,UID在SYS_UID_MIN到SYS_UID_MAX之间选择
-s 用户使用的登录Shell
-u 基于数字的用户ID,必须非负整数,一般要求唯一
-U, --user-group 创建与用户同名的群组

userdel

删除用户

选项:
-f  强制删除,甚至在用户当前正在登录的场景下
-r  删除用户的家目录及其中的文件

usermod

修改用户帐号。 可以修改密码、 组身份、 截止日期等。修改后的用户可能需要重新登录才能生效

选项:
-a  添加用户到额外的组中,仅和-G联用
-c password文件中的注释字段
-d 为用户指定新的家目录
-e 账户被禁用的日期,格式YYYY-MM-DD
-f 密码过期后,账户被彻底禁用之前的天数。0 表示立即禁用,-1 表示禁用这个功能
-G 用户所属附属组,逗号分隔
-l  修改用户的登录名
-L  锁定一个用户的密码
-U 解锁一个用户的密码
-m  移动家目录到新的位置

示例:

Shell
1
2
# 把alex附加到ssl-cert组
sudo usermod -a -G ssl-cert alex
gpasswd

管理配置文件/etc/group和/etc/gshadow
示例:

Shell
1
2
# 从ssl-cert组中删除alex
sudo gpasswd -d alex ssl-cert
groupmod 修改指定组
newgrp 修改当前用户的GID
passwd

设置、修改、或者删除用户的密码。普通用户只能修改自己的密码,root则可以修改任何用户的密码。

格式:
passwd [options] [LOGIN]

选项:
-a 仅和-S联用,显式所有用户的状态
-d 删除用户密码
-e 立即使密码过期
-i INACTIVE 用于在密码过期INACTIVE天后自动禁用用户,用户将不能登陆
-l 锁定,禁止修改密码
-m 修改密码的最小时间间隔(天)
-S 显示账户的状态信息
-u 解锁,允许修改密码
-x 密码最长有效期限

举例:

Shell
1
2
3
# 修改root密码
sudo passwd root
# 系统会提示输入新密码Enter new UNIX password:  
who 显示本系统上的登陆用户
w

显示哪些人登录了,他们在做什么

格式:

Shell
1
w [options] user [...]

 示例:

Shell
1
2
3
4
5
6
7
# 第一行:当前时间,系统运行时间,登录用户数,1、5、15分钟负载
22:23:26 up 60 days, 21:06,  1 user,  load average: 0.04, 0.01, 0.00
#用户     终端名    远程主机         登录时间  空闲时间 JCPU   PCPU 当前执行的命令行
USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
root     pts/1    123.120.25.149   17:09    0.00s  0.06s  0.00s w
# JCPU:所有附着在此TTY上的进程所消耗的时间
# PCPU:WHAT指定的那个进程消耗的时间
logname 显示当前用户的名称,类似的命令:whoami
hostname 显示系统的主机名字
hostid 显示主机的 32 位的16 进制ID
uname 显示操作系统的信息,例如内核版本
arch 显示当前系统的指令集架构,相当于uname -m
id 打印当前进程的真实和有效用户ID、组ID
tty 显示当前登录终端的设备映射文件
init init命令是所有进程的父进程。在系统启动的最后一步调用
runlevel 显示当前和最后的运行级别
reboot 重新启动主机
shutdown 关闭主机,类似的还有halt
trap 捕获信号并设置信号处理逻辑,参考Bash学习笔记
pgrep,pkill

查找或杀死进程
这两个命令用于根据进程的名称或者其他属性来查找、杀死进程

格式:
pgrep [options] pattern
pkill [options] pattern

选项:
-signal 仅pkill,需要发送给目标进程的信号
-c 打印匹配的进程数量而不是输出详细信息
-d 仅pgrep,指定用于分隔进程ID的字符串
-f 对整个命令行进行匹配而不是进程名称
-g 仅选择有效GID与该选项指定的GID匹配的进程,多个GID用逗号分隔
-G 仅选择真实GID与该选项指定的GID匹配的进程,多个GID用逗号分隔
-l 仅pgrep,连同PID一起列出进程名称
-a 仅pgrep,连同PID一起列出进程完整命令行
-n 仅选择最新启动的进程
-o 仅选择最早启动的进程
-P 仅选择父进程是该选项指定的PID的进程
-u 仅选择有效UID与该选项指定的UID匹配的进程,多个UID用逗号分隔
-U 仅选择真实UID与该选项指定的UID匹配的进程,多个UID用逗号分隔
-v 取反匹配
-w 仅pgrep,显示所有线程的id
-x 仅选择名称(如果指定-f则是命令行)完全匹配模式的进程
pattern 用于匹配名称或者命令行的正则表达式

退出状态:
0 一个或更多的进程被匹配 
1 无进程匹配 
2 语法错误 
3 其它严重错误

举例:

Shell
1
2
3
4
#立即杀死所有MySQL和Java进程
sudo pkill -9 '(mysql|java)'
#列出MySQL进程的PID和命令行路径
pgrep -a mysql
service

启动或停止一个System V系统服务(/etc/init.d中的脚本)或者Upstart Job(/etc/init中的配置文件)

格式:

Shell
1
2
3
service SCRIPT COMMAND [OPTIONS]
# 显示所有服务的状态
service --status-all

SCRIPT要么对应 /etc/init.d/SCRIPT ,要么对应 /etc/init/SCRIPT.conf ,如果这两个目录都存在SCRIPT则Upstart Job的优先级更高

可以调用哪些COMMAND则取决于脚本,service将COMMAND和OPTIONS直接传递给对应的脚本

每个脚本至少应该定义start、stop命令,COMMAND restart相当于先运行stop,紧接着运行start

monit

监控进程、程序、文件的状态。可以完成自动重启

参考Ubuntu下使用monit

chkconfig

新近的Ubuntu版本已经不支持该命令,使用update-rc.d命令代替之

显示和管理在启动过程中所开启的服务,该命令提供简单的方式管理/etc/rc[0-6].d目录中的符号链接
chkconfig可以添加、移除、列出、修改服务,以及检查服务的启动状态
如果不指定--level,on/off选项应用于2-5运行级别,reset则应用于所有级别
注意:每个服务可以包含start、stop脚本,当切换运行级别时,已经启动的服务不会重新启动,已经停止的服务也不会重新停止

格式:

Shell
1
2
3
4
5
6
chkconfig [--list] [--type type][name]
chkconfig --add name
chkconfig --del name
chkconfig --override name
chkconfig [--level levels] [--type type] name <on|off|reset>
chkconfig [--level levels] [--type type] name

选项:
--level levels 指定操控的运行级别
--add name 添加一个服务,服务脚本必须预先存放为/etc/init.d/name
--del name 删除一个服务,/etc/rc[0-6].d中的符号链接全部删除
--list name 列出服务在各运行级别的启停信息

sysv-rc-conf

提供图形界面来管理System V风格的启动脚本:

Shell
1
2
sudo apt-get install sysv-rc-conf
sudo sysv-rc-conf 
update-rc.d

安装或者移除System V风格的初始化脚本的符号链接

格式:

Shell
1
2
3
update-rc.d [-n] [-f] name remove
update-rc.d [-n] name defaults
update-rc.d [-n] name disable|enable [ S|2|3|4|5 ]

选项:
-n  不做任何事情,只显示会做什么
-f 强制移除符号链接,即使/etc/init.d/name仍然存在

initctl

管理Upstart任务,通过此命令管理员可以与基于Upstart的init进程交互。某些发行版中,此命令可以和service替换使用,例如 initctl start srv 效果等同于 service srv start 

格式:

Shell
1
initctl [OPTION]...  COMMAND [OPTION]...  ARG...

子命令:
start JOB [KEY=VALUE]...   启动Job的新实例。KEY=VALUE用于指定Job的环境变量,对于多实例的Job通常基于环境变量设置它的实例名
stop JOB [KEY=VALUE]...  请求停止一个Job实例
restart JOB [KEY=VALUE]...  重启一个Job实例,首先将其Goal设置为stop,然后设置Goal为start
reload JOB [KEY=VALUE]...  发送SIGHUP信号给运行中的Job实例
status JOB [KEY=VALUE]...  显示Job的状态
list  列出已知的Job及其实例
emit EVENT [KEY=VALUE]...  请求发布EVENT类型的事件,KEY=VALUE用于指定事件中的环境变量,这些变量会自动export到受事件影响的Job的脚本代码中

systemctl

控制和管理基于Systemd的服务,以及Systemd init机制本身。

格式:

Shell
1
2
3
# NAME 服务的名称,必须是unitName.unitType,例如mysql.service
# 如果unitType为service,则.unitType部分可以省略
systemctl [OPTIONS...] COMMAND [NAME...]

子命令:
start  启动一个服务, systemctl start x.service等价于sysvinit的service x start,下同
stop  停止一个服务
restart  停止,然后再启动一个服务。即使执行命令之前,服务没有在运行,它也会被启动
reload  如果支持,用于重新载入一个服务
condrestart  如果服务正在运行,则重启之
status  打印服务的状态
list-unit-files   列出所有Unit定义,附加--type=service则仅列出服务
enable  允许服务自启动,systemctl enable x.service等价于sysvinit的chkconfig x on
disable  禁止服务自启动
is-enabled  检查服务是否可以自启动
daemon-reload  重新加载Systemd的配置
reboot  重启机器
poweroff 关机
suspend  待机
hibernate  休眠
hybrid-sleep 混合休眠模式(同时休眠到硬盘并待机)

示例:

Shell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# 列出所有正在运行的单元
systemctl list-units
# 列出所有单元,包括没有配置文件或者启动失败的
systemctl list-units --all
# 列出所有没有运行的单元
systemctl list-units --all --state=inactive
# 列出所有加载失败的单元
systemctl list-units --failed
# 列出所有正在运行的服务
systemctl list-units --type=service
 
# 查看蓝牙服务的状态
systemctl status bluetooth.service
 
# 查看单元是否启用、禁用
# enabled 允许自动启动
# disabled 不允许自动启动
# static 该单元的配置不包含install段,只能作为其它配置文件的依赖
# masked 该单元禁止被设置为自启动
systemctl list-unit-files
 
# 启动MySQL服务
systemctl mysql start
# 杀死Apache服务的所有进程
ystemctl kill apache.service 
 
# 让Systemd加载最新的配置文件
sudo systemctl daemon-reload
journalctl

查询systemd日志,即systemd-journald.service写入磁盘的日志内容。如果调用时不添加任何参数,则输出所有已经收集的日志内容。你可以指定多个FIELD=VALUE格式过滤条件,例如_SYSTEMD_UNIT=tomcat8.service。如果:

  1. 多个过滤条件针对不同的FIELD,则这些条件进行AND
  2. 多个过滤条件针对相同的FIELD,则这些条件进行OR
  3. 在两组过滤条件之间添加 + 符号,则前后条件进行OR

所有用户被授权访问自己私有的日志。默认的仅仅root和systemd-journal组的用户能够访问系统日志、其它用户的日志

格式:journalctl [OPTIONS...] [MATCHES...]

选项:
-r  反转输出顺序,最新的日志最先显示
-n NUM  显示最新的NUM条日志,默认10
-f 持续追加日志到标准输出,类似于tail -f
-k, --dmesg 仅显示内核消息,等价于_TRANSPORT=kernel
-u, --unit=UNIT|PATTERN,根据systemd配置单元过滤,等价于_SYSTEMD_UNIT=*
--user-unit= 显示特定用户会话单元(session unit)的消息,等价于_UID=*
-p 根据优先级过滤消息,可以指定数字或者级别名称,0-7分别为emerg,alert,crit,err,warning,notice,info,debug。可以指定范围,例如 3..4。等价于PRIORITY=*
--since=, --until= 显示指定时间之后,或者之前的消息,日期格式:2012-10-30 18:17:16,如果时间部分省略默认00:00:00,日期还可以使用yesterday、today等单词
--system  仅仅显示内核和系统消息
--user  仅仅显示当前用户的配置单元的消息
-M  仅仅显示本机上一个正在运行的容器的消息,必须指定容器名

示例:

Shell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 显示tomcat8服务今天的日志
journalctl -u tomcat8 --since today
# 显示指定进程的日志
journalctl _PID=12558
# 显示特定程序的日志
journalctl /usr/bin/bash
# 显示最新的20条日志
journalctl -n 20
# 持续跟踪新的日志写入
journalctl -f
# 查看磁盘用量
journalctl --disk-usage
# 删除老的日志,直到磁盘占用空间不大于1G
sudo journalctl --vacuum-size=1G
# 删除老的日志,保留最近1年的
sudo journalctl --vacuum-time=1years
 
# 显示Kubelet的INFO及其一上级别的信息
journalctl -u kubelet -f  -p 0..7
 
# 指定时间范围
journalctl --since "2018-08-16 18:30:00" --until "2018-08-16 18:40:0"
systemd-analyze

分析系统的启动耗时

示例:

Shell
1
2
3
4
# 查看启动耗时的概要信息
systemd-analyze        
# 查看每个服务的启动耗时信息,按照耗时从高到低排列
systemd-analyze blame                            
hostnamectl

查看或者设置主机名信息

示例:

Shell
1
2
# 设置主机名
sudo hostnamectl set-hostname
localectl

进行本地化配置

示例:

Shell
1
2
3
4
# 设置语言和编码方式
sudo localectl set-locale LANG=en_GB.utf8
# 设置键盘映射方式
sudo localectl set-keymap en_GB 
timedatectl

时区、日期、时间设置

示例:

Shell
1
2
3
4
5
6
7
# 列出所有可用时区
timedatectl list-timezones
# 设置时区
sudo timedatectl set-timezone America/New_York
# 设置日期、时间,格式分别为YYYY-MM-DD、HH:MM:SS
sudo timedatectl set-time "2016-11-11"
sudo timedatectl set-time "16:16:00"
chronyc

时钟同步命令

示例:

Shell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
# 查看 NTP 服务器的在线和离线状态
chronyc activity
 
# 检查 NTP 访问是否对特定主机可用
chronyc accheck
 
# 该命令会显示有多少 NTP 源在线/离线
chronyc activity
 
# 手动添加一台新的 NTP 服务器
chronyc add server
 
# 在客户端报告已访问到服务器
chronyc clients
 
# 手动移除 NTP 服务器或对等服务器
chronyc delete
 
# 手动设置守护进程时间
chronyc settime
 
# 校准时间服务器,显示系统时间信息
chronyc tracking
 
# 检查 NTP 访问是否对特定主机可用
chronyc accheck
 
# 查看时间同步源
chronyc sources -v
 
# 查看时间同步源状态
chronyc sourcestats -v
 
# 立即进行时钟同步
chronyc -a makestep
loginctl

查看当前登录的用户或会话

示例:

Shell
1
2
3
4
# 显示登录的会话
loginctl list-sessions
# 显示登录的用户
loginctl list-users
su

改变用户身份,以另外一个账户登录,如果不加参数,则改变为root

格式:
su [options] [username]
选项:
-c,  指定需要执行的命令
-, -l, --login 提供类似于username直接登陆的执行环境,如果使用“-”,必须作为最后一个options
-s, --shell 需要调用的Shell
-m, -p  保留当前的环境变量,除了$PATH、$IFS

sudo

以root或其他用户身份来执行一个命令。只能应用于程序,不能应用于Bash内置命令,例如: sudo cd /var/lib/mysql不会达到预期效果。

格式:
sudo -h | -K | -k | -V
sudo -v [-AknS] [-g group] [-h host] [-p prompt] [-u user]
sudo -l [-AknS] [-g group] [-h host] [-p prompt] [-U user] [-u user] [command]

选项:
-E 提示需要保留当前环境变量
-e 编辑一个或者多个文件,而不是执行命令
-g 指定主要组(primary group)而不是使用目标用户的主要组
-H 设置HOME环境变量为目标用户的HOME目录
-i 执行用户的默认登陆Shell,这意味着.profile、.login等会被读取并执行
-u 指定目标用户

举例:

Shell
1
2
3
4
5
# 以root身份执行命令,不永久提升
sudo ls /dev
# 永久提升当前用户为root,不执行命令
sudo -i
exit     #需要退出root的登陆才能返回当前用户
mount

挂载一个文件系统, 通常都用来安装外部设备, 比如软盘或CDROM。Unix系统中所有可访问的文件,都组织在单棵树中,这棵树的根叫做  / 。树中的文件可以分布在多个设备上。mount命令的职责就是将设备附到文件系统树的某个节点上。

大部分设备都由特殊的设备文件来代表。例外情况如NFS,它由gmem.cc:/dir这样的URI表示。引用设备文件时,也可以使用LABEL或UUID。

注意:

  1. 作为挂载点的目录,必须预先创建
  2. 如果挂载点目录中有文件,挂载成功后,此文件不可见
  3. 上述不可见的文件,在umount后重新出现
  4. 挂载后,挂载点于目录文件系统根目录具有一致的Unix权限

绑定挂载

从内核2.4开始,允许将文件系统树的某一部分,重新挂载到另外一个位置:

mount --bind olddir newdir
mount -B olddir newdir

在fstab中,进行绑定挂载的格式是:/olddir /newdir none bind

执行绑定挂载后,olddir的内容可以在newdir处访问,它们一模一样。

绑定挂载也可以用来挂载单个文件。

默认情况下,绑定挂载不会处理子挂载,也就是说,/olddir的某个子目录被作为挂载点的情况,其内容无法体现在/newdir中,要解决此问题,可以使用:

mount --rbind olddir newdir

移动操作

从2.5.1开始,支持将一个挂载的子树移动到另外一个位置:

mount --move olddir newdir
mount -M olddir newdir

注意olddir必须是一个挂载点

共享子树

从2.6.15开始,可以将挂载、及其子挂载标记为shared, private, slave 或 unbindable。可以在容器技术中使用:

mount --make-shared mountpoint
mount --make-slave mountpoint
mount --make-private mountpoint
mount --make-unbindable mountpoint

格式:
mount -t type device dir
mount [-lhV]
mount -a [-fFnrsvw] [-t vfstype] [-O optlist]
mount [-fnrsvw] [-o option[,option]...] device|dir
mount [-fnrsvw] [-t vfstype] [-o options] device dir

选项:

-a --all 挂载所有fstab中包括的所有文件系统
-f --fake 执行所有步骤,除了系统调用,用于和-v联用来观察mount命令的具体行为
-r --read-only 挂载为只读模式,与-o ro同义
-w --rw 挂载为读写模式,与-o rw同义
-L  label 挂载具有指定标签的分区
-U  uuid 挂载具有指定UUID的分区
-t  --types vfstype 指示文件系统的类型,如果不指定,mount命令会尝试猜测文件系统的类型
-o --options 使用逗号分隔的选项,例如mount LABEL=mydisk -o noatime,nouser

举例:

Shell
1
2
3
4
#把第一块硬盘的第3个分区挂载为/kssi
mount /dev/hda3 /kssi
#挂载一个iso镜像文件
mount -o loop /home/alex/unbunt-14.02.iso /mnt/cdrom
umount

卸载一个当前已经 mount 的文件系统

举例:

Shell
1
2
3
4
#根据设备路径卸载
umount /dev/hda3
#根据挂载目录卸载
umount /kssi
getconf 

查询系统配置变量

格式:
getconf -a
getconf [-v specification] system_var
getconf [-v specification] path_var pathname

选项:
-a 显示所有配置变量及其值
system_var 系统配置变量的名称,在sysconf中定义
path_var 由pathconf定义的系统配置变量

举例:

Shell
1
2
#获取内存页的大小
getconf PAGESIZE
mkswap 创建一个交换分区或文件,随后必须马上使用swapon来启用
swapon 启用/禁用交换分区或文件,通常在启动和关机的时候才有效
swapoff
mke2fs 创建ext2文件系统
tune2fs 调整ext2文件系统。 可以用来修改文件系统参数
dumpe2fs 打印非常详细的文件系统信息
tune2fs 

显示或调整ext2/ext3/ext4文件系统的参数

举例:

Shell
1
2
#查看硬盘分区的块大小
tune2fs -l /dev/xvda | grep 'Block size'
du 递归的显示磁盘文件的使用状况。默认从当前工作目录递归
hdparm 列出或修改硬盘参数
fdisk

在存储设备上创建和修改一个分区表。该命令理解DOS风格的分区表、BSD|SUN风格的disklables。fdisk不理解GUID分区表(GPTs),它也不是为了大型分区设计的,你可以使用GNU parted代替它

硬盘可以被划分为1-N个逻辑磁盘——分区(partitions),关于分区的信息记录在分区表中,分区表位于磁盘的0扇区

Linux至少需要一个分区,作为其根文件系统。Linux可以使用交换文件或者交换分区,然而后者效率高,因此Linux系统的第二个分区常常是swap分区。在Intel兼容硬件上启动机器的BIOS最多只能访问磁盘的前1024个柱面(cylinders),因此,大磁盘用户常常划分从若干MB的小分区,挂载到/boot,存储内核镜像、一部分启动时需要的辅助文件

格式:

Shell
1
2
3
fdisk [-uc] [-b sectorsize] [-C cyls] [-H heads] [-S sects] device
fdisk -l [-u] [device...]
fdisk -s partition...

选项:

-b sectorsize    指定磁盘的扇区大小
-c[=mode]    指定兼容模式:dos或nondos(默认)
-l 列出指定设备的分区表并退出
-s partition...    打印指定的每个分区的尺寸(按block计)

示例 - 在线修改分区表:

Shell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
# 这个例子中,我们希望扩展根分区的大小
# 目标机器是一台虚拟机,我们首先扩展了它的磁盘尺寸
qemu-img resize xenial-base.qcow2 256G
 
 
# 但是查看磁盘空间,发现没有变化。这是因为分区表的问题
df -H
Filesystem      Size  Used Avail Use% Mounted on
/dev/vda1        33G  2.6G   29G   9% /
 
 
# 开始修改分区表
 
# 首先关闭swap
swapoff -a
 
# 查看当前分区表
fdisk -l /dev/vda
# 可以看到磁盘是256G
Disk /dev/vda: 256 GiB, 274877906944 bytes, 536870912 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x873848e8
 
Device     Boot    Start      End  Sectors  Size Id Type
/dev/vda1  *        2048 65107967 65105920   31G 83 Linux
/dev/vda2       65110014 67106815  1996802  975M  5 Extended
/dev/vda5       65110016 67106815  1996800  975M 82 Linux swap / Solaris
# 但是分区表仅仅用到 67106815 * 512 / 1024 / 1024 / 1024 = 32GiB,也就是未扩展前的磁盘大小
 
# 进入交互模式
fdisk /dev/vda
 
# 依次删除所有分区
fdisk /dev/vda
Command (m for help): d
Partition number (1,2,5, default 5):   5        # 删除分区5,交换分区
Command (m for help): d
Partition number (1,2,5, default 5):   2        # 删除分区2
Command (m for help): d                         # 不需要选择,删除分区1
 
# 重新创建主分区
Command (m for help): n
Select (default p): p                           # 创建主分区
Partition number (1-4, default 1):  1           # 创建根分区vda1
First sector (2048-536870911, default 2048):    # 保持第一扇区大小不变
Last sector, +sectors or +size{K,M,G,T,P} (2048-536870911, default 536870911): +252G
                                                # 填写+252G 留下4G给交换分区
# 重新创建交换分区
Command (m for help): n                         # 然后依次回车
Command (m for help): t                         # 修改分区2的类型
Partition number (1,2, default 2): 2
Partition type (type L to list all types): 82   # 修改为交换分区
 
# 保存更改
Command (m for help): w
 
# 由于根分区正在被使用,因此分区表修改但未重新载入
The partition table has been altered.
Calling ioctl() to re-read partition table.
Re-reading the partition table failed.: Device or resource busy
 
The kernel still uses the old table. The new table will be used at the next reboot or after you run partprobe(8) or kpartx(8).
 
# 不需要重启,使用下面的命令告知内核,载入新的分区表
partprobe
 
# 可以看到分区表正常了
fdisk -l /dev/vda
Disk /dev/vda: 256 GiB, 274877906944 bytes, 536870912 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x873848e8
 
Device     Boot     Start       End   Sectors  Size Id Type
/dev/vda1            2048 528484351 528482304  252G 83 Linux
/dev/vda2       528484352 536870911   8386560    4G 82 Linux swap / Solaris
 
# 工作仍然没有结束,df -H 可以看到文件系统大小仍然是旧的
df -H
Filesystem      Size  Used Avail Use% Mounted on
/dev/vda1        33G  2.6G   29G   9% /#
 
# 更新文件系统大小
resize2fs /dev/vda1
 
# 重新创建交换分区
mkswap /dev/vda2
Setting up swapspace version 1, size = 4 GiB (4293914624 bytes)
no label, UUID=bb073528-4aa6-4af1-8bbd-78267bc90336
 
# 将新的UUID,替换fstab中的旧的
vim /etc/fstab
 
# 启动swap
swapon -a
badblocks 检查存储设备的坏块
lsblk 列出所有块设备,将以树状结构显示磁盘和分区
blkid 显示各分区的UUID
lsusb 列出所有USB总线和使用USB 的设备
usbmodules 输出连接USB 设备的驱动模块的信息
mkbootdisk 创建启动盘
dump,restore 备份和还原文件系统
quota 显示用户或组的磁盘配额
setquota 设置用户或组的磁盘配额
ulimit

设置使用系统资源的上限

选项:

-a:显示目前资源限制的设定
-c :设定core文件的最大值,单位为区块
-d :程序数据节区的最大值,单位为KB
-f :shell所能建立的最大文件,单位为区块
-H:设定资源的硬性限制,也就是管理员所设下的限制
-m :指定可使用内存的上限,单位为KB
-n :指定同一时间最多可开启的文件数
-p :指定管道缓冲区的大小,单位512字节
-s :指定栈的上限,单位为KB
-S:设定资源的弹性限制
-t :指定CPU使用时间的上限,单位为秒
-u :用户最多可开启的程序数目
-v :指定可使用的虚拟内存上限,单位为KB

lsmod 列出所有安装的内核模块
insmod 强制一个内核模块的安装
rmmod 强制卸载一个内核模块
modinfo 输出一个可装载的内核模块的信息
modprobe

从Linux内核中添加或者删除模块。该命令智能的进行模块的安装/卸载,为了便利,不区分模块名字中的-和_。该命令会查找 /lib/modules/`uname -r` 目录,找到所有模块和相关文件

格式:

Shell
1
2
3
4
modprobe [-v] [-V] [-C config-file] [-n] [-i] [-q] [-b] [modulename] [module params...]
modprobe [-r] [-v] [-n] [-i] [modulename...]
modprobe [-c]
modprobe [--dump-modversions] [filename]

选项:
-a    安装命令行中所有指定的模块
-r    移除而不是安装模块

注意,重启后效果消失。要永久修改内核模块加载,使用/etc/modules文件

sync 强制写入所有需要更新的 buffer 上的数据到硬盘上
ldd 显示一个可执行文件的共享库的依赖关系
rsync

可以在多台主机之间进行文件同步

格式:

Shell
1
2
3
4
5
6
# 本地同步
rsync [OPTION...] SRC... [DEST]
 
# 远程同步
rsync [OPTION...] [USER@]HOST:SRC... [DEST]     # PULL
rsync [OPTION...] SRC... [USER@]HOST:DEST       # PUSH

选项:

-a  归档模式,等价于-rlptgoD
-r  递归处理目录
-l   不跟随符号链接
-p 保留文件模式
-t  保留修改时间
-g  保留文件的group信息
-o  保留文件的owner信息
-D  --devices --specials 保留设备文件、保留特殊文件
-z  传输数据时进行压缩
-P 等价于 --partial --progress
--partial  保留部分传输的文件
--progress 显示传输进度
--delete  删除目标目录中比源目录多余的文件
--inplace  就地更新,不改变目标文件的inode
-t, --times  保持修改时间不变
-c, --checksum 基于校验和判断哪些文件需要传输,而非修改时间+尺寸
-I, --ignore-times 判断哪些文件需要传输时,仅仅考虑尺寸,不考虑修改时间
-v 显示更多日志
-e 指定使用的远程Shell
-i 为所有更新输出变更摘要
-q 安静模式

示例:

Shell
1
2
3
4
5
6
# 使用密钥登陆到bj.gmem.cc,然后将本地的www目录拷贝到bj的/var/目录下
rsync -avz -e "ssh -i  /home/alex/Documents/puTTY/gmem.key" --progress www root@bj.gmem.cc:/var/
 
# 使用校验和来确认文件是否需要同步
rsync -Pav -e "ssh -i /root/Documents/puTTY/gmem.key" --checksum \
    root@hk.gmem.cc:/var/www/html/blog/wp-content/uploads /var/www/html/blog/wp-content
stat 显示一个文件或目录的详细信息,例如尺寸、修改时间等
logger

附加一个用户产生的消息到系统日志,系统日志默认/var/log/syslog

格式:
logger [-dhisV] [-f file] [-n server] [-P port] 
[-p pri] [-t tag] [-u socket] [message]

选项:
-d, --udp 使用UDP而不是TCP
-i, --id 记录进程的ID
-f, --file file 将文件的内容记录到系统日志,不得与命令行message联用
-n, --server server 通过UDP将日志写到远程syslog服务器
-P, --port port UDP端口,默认514
-p, --priority priority 设定消息进入日志的优先级,使用facility.level的格式,默认user.notice
-s, --stderr 同时将消息写出到标准错误
-t, --tag tag 为每行日志输出附加标签
-u, --socket socket 写到指定的套接字而不是内置的syslog例程

logrotate 管理系统的日志文件。可以在合适的时候轮换、压缩、删除
strip 从可执行文件中去掉调试符号引用。这样做可以减小尺寸, 但是就不能调试了
lscpu

打印CPU架构相关信息,示例:

Shell
1
2
# 显示CPU当前的时钟频率
lscpu | grep MHz 
lshw 打印硬件信息
dmidecode

解码DMI(即SMBIOS,System Management BIOS)信息为人类可读的格式。DMI表包含了系统硬件信息,包括序列号、BIOS版本

信息依据DMI类型分段输出到屏幕上

sysctl

在运行时配置内核参数,这些内核参数位于/proc/sys/

格式:
sysctl [-n] [-e] variable ...
sysctl [-n] [-e] [-q] -w variable=value ...
sysctl [-n] [-e] [-q] -p <filename>
sysctl [-n] [-e] -a
sysctl [-n] [-e] -A

选项:
variable 内核参数名(键),可以使用点号.代替/
variable=value 设置内核参数的值
-n 打印值时禁止打印键
-e 忽略未知键错误
-N 仅打印名称 
-q 不把设置的值打印到标准输出
-w 执行修改操作
-p 从/etc/sysctl.conf加载内核参数设置,设置为-表示从标准输入读取
-a 显示当前变量的所有值

举例:

Shell
1
2
3
sysctl -a
sysctl -n kernel.hostname
sysctl -w kernel.domainname="example.com"
dpkg-reconfigure

重新配置一个已经安装的包,举例:

Shell
1
2
# 重新配置数字证书,可以禁用某些证书
dpkg-reconfigure ca-certificates
update-ca-certificates

根据配置文件 /etc/ca-certificates.conf 的内容,更新/etc/ssl/certs下的受信任证书的符号链接

update-icon-caches 更新GTK图标缓存: sudo update-icon-caches /usr/share/icons/*
openssl

OpenSSL的命令行工具,OpenSSL是一个实现了 SSL(v2/v3) 和TLS (v1) 的开源组件
格式:
openssl command [ command_opts ] [ command_args ]

举例:

Shell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
# 生成密钥并自签名(根证书)
openssl genrsa -out ca.key 2048
openssl req -x509 -newkey rsa:2048 -keyout ca.key -out ca.crt -days 3650 \
  -subj "/C=CN/ST=BeiJing/L=BeiJing/O=Gmem Studio/OU=IT Support/CN=Gmem SHA256 CA"
 
# 单个命令同时生成密钥和证书,-nodes禁止 Enter PEM pass phrase 提示
openssl req -nodes -new -x509 -keyout server.key -out server.crt \
  -subj "/CN=Teleport Self-signed Certificate" -addext "subjectAltName = IP:82.157.67.96"
 
# 解码证书,以查看其内容
openssl x509 -in ca.crt -text -noout
# 解码证书请求,以查看其内容
openssl req -in k8s.csr -text -noout
 
# 解除私钥密码,将私钥转换为原始RSA Key
openssl rsa -in ca-withpass.key -out ca.key
 
# 转换为PKCS#8格式的私钥
# 这种格式的私钥以 -----BEGIN PRIVATE KEY----- 开头
# 包含私钥 + OID,OID说明了密钥类型
# 老版本的OpenSSL使用PKCS#1(传统OpenSSL格式),该格式以
# -----BEGIN RSA PRIVATE KEY----- 开头
 
# PKCS#1 转换为 PKCS#8
openssl pkcs8 -topk8 -in ~/Documents/puTTY/ca.key -out rootCA-key.pem  -nocrypt
# PKCS#8 转换为 PKCS#1
 
 
# 生成非对称秘钥对
openssl genrsa -out www.gmem.cc.key 2048
#生成证书请求(生成网站证书时,Common Name应当是你的域名,不要加端口)
openssl req -new -sha256 -key www.gmem.cc.key -out www.gmem.cc.csr \
  -subj "/C=CN/ST=BeiJing/L=BeiJing/O=Gmem Studio/OU=IT Support/CN=*.gmem.cc"
 
# 对证书请求签名
openssl x509 -req -days 3650 -in www.gmem.cc.csr -CA ca.crt
    -CAkey ca.key -CAcreateserial -out www.gmem.cc.crt
 
# 从证书中导出公钥
openssl x509 -inform pem -in www.gmem.cc.crt -pubkey
 
 
# 从Chrome 58开始,不支持仅仅依据CN字段来识别网站主机
# 必须在证书中使用SAN
openssl genrsa -out k8s.key 2048
export SAN_CFG=$(printf "\n[SAN]\nsubjectAltName=DNS:*.k8s.eb.dapp.com,DNS:*k8s.eb.mid,DNS:k8s.eb.dapp.com,DNS:k8s.eb.mid")
openssl req -new -sha256 -key k8s.key -out k8s.csr \
    -subj "/C=CN/ST=BeiJing/O=Beijing Dangdang Information Technology Co., Ltd./CN=TECH-DIGITAL Kubernetes Cluster " \
    -reqexts SAN -config <(cat /etc/ssl/openssl.cnf <(echo $SAN_CFG))
 
openssl x509 -req -sha256 -in k8s.csr  -out k8s.crt -CA ca.crt -CAkey ca-nopass.key -CAcreateserial -days 3650 \
     -extensions SAN -extfile <(echo "${SAN_CFG}")
# 不使用配置文件生成带有SAN的请求
openssl req  -addext ...
# 不使用配置文件进行签名
openssl x509 -extfile <(printf "subjectAltName = DNS:localhost, IP:127.0.0.1, IP:82.157.67.96")
# 不使用配置文件进行签名,签名中间CA证书
cat "$(openssl version -d | sed 's/.*"\(.*\)"/\1/g')/openssl.cnf" | sed "s|^\(dir\s*=\s*\)\(.*\)|\1$PWD|g" > openssl.cnf
openssl ca -extensions v3_ca -notext -in installer.csr -out installer.crt -cert ../ca/ca.crt -keyfile ../ca/ca.key -days 3650 -policy policy_anything -batch -create_serial -config openssl.cnf
cvt

计算VESA标准的CVT模式代码(mode lines),举例:

Shell
1
2
3
4
cvt 1600 900 60
# 输出如下:
# # 1600x900 59.95 Hz (CVT 1.44M9) hsync: 55.99 kHz; pclk: 118.25 MHz
# Modeline "1600x900_60.00"  118.25  1600 1696 1856 2112  900 903 908 934 -hsync +vsync
xrandr

注:该命令的修改在重启后失效,要永久生效,参考添加自定义的显示模式

RandR扩展的原生命令行接口。RandR(Resize and Rotate)是X11协议的扩展,为屏幕根窗口提供改变大小、旋转、反射效果的能力,同时支持设置刷新率,举例:

Shell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 查询当前连接到的显示器,显示分辨率和刷新率等信息
xrandr -q
# 输出
# Screen 0: minimum 1 x 1, current 1600 x 900, maximum 8192 x 8192
# Virtual1 connected primary 1600x900+0+0 (normal left inverted right x axis y axis) 0mm x 0mm
#   1280x768      60.00 +  59.87  
#   ...
#   640x480       59.94  
#   1600x900_600.00 599.89*
# Virtual2 disconnected (normal left inverted right x axis y axis)
 
# 新建一个显示模式              这里的内容参考cvt 1600 900 60命令的输出
xrandr --newmode "1600x900"  1837.25  1600 1760 1936 2272  900 903 908 1348 -hsync 命令+vsync
 
# 为显示器Virtual1添加刚刚新建的模式
xrandr --addmode Virtual1 1600x900
 
# 立即以指定模式输出
xrandr --output Virtual1 1600x900
dd

转换并拷贝文件,该命令根据参数转换数据的格式,并且把输入文件写出到输出文件中

参数:
bs=BYTES 每次读写的最大字节数
cbs=BYTES 每次转换的字节数
conv=CONVS 根据逗号分隔的CONVS符号列表来执行转换
count=N 读取N个输入块,块大小为bs
ibs=BYTES 每次最多读取的字节数,默认512
if=FILE 从目标文件读取,而不是标准输入
iflag=FLAGS 根据逗号分隔的FLAG符号列表来读取
obs=BYTES 每次最多写入的字节数,默认512
of=FILE 写出到文件,而不是标准输出
oflag=FLAGS 根据逗号分隔的FLAG符号列表来写出
seek=N 在输出文件开始处,跳过N个obs字节的块
skip=N  在输入文件开始处,跳过N个ibs字节的块
status=WHICH 禁止输出什么信息到标准错误,none禁止所有;noxfer禁止传输状态
注意:N和BYTES可以添加后缀:KB(1000);K(1024);MB(1000*1000);M(1024*1024)...等等

CONVS符号:
ascii 从EBCDIC到ASCII
ebcdic 从ASCII到EBCDIC
ibm 从ASCII到备选EBCDIC
block 填充空格,使换行符结尾的记录达到cbs大小
unblock 把记录结尾的空格改为换行符
lcase 转换为小写
ucase 转换为大写
sparse 对于NUL输入块,尝试seek而不是write
swab 交换每对输入字节
sync 填充NUL,让每个输入块达到ibs大小,与block/unblock联用,则填充空格而非NUL
excl 如果输出文件已经存在,则失败
nocreat 不去创建输出文件
notrunc 不去截断输出文件
noerror 出现读错误后,仍然继续
fdatasync 完毕前,同步数据到磁盘
fsync 同上,同时同步元数据

FLAG符号:
append 仅用于oflag,附加模式
direct 使用direct I/O
directory 除非是一个目录,否则失败
dsync 使用同步I/O
sync 使用他不I/O,包括元数据
nonblock 使用非阻塞I/O
noatime 不更新文件的访问时间
nocache 丢弃缓存数据
nofollow 不跟随符号链接

举例:

Shell
1
2
3
4
5
6
7
# 导出整个磁盘为镜像文件,注意if选择设备文件(而不是分区)
sudo dd bs=4M of=~/Downloads/raspberrypi-alex.img if=/dev/mmcblk0
# 导入镜像到磁盘,目标磁盘必须大于等于镜像,目标磁盘的所有分区必须预先unmount
sudo dd bs=4M if=~/Downloads/raspberrypi-alex.img of=/dev/mmcblk0&nbsp;
 
# 写swap分区
sudo dd if=/dev/zero of=/swapfile bs=1M count=1024
cpufreq-info

检索cpufreq内核信息

选项:
-c  CPU  显示指定CPU(序号)的信息
-e  打印调试信息
-f   依据cpufreq core得到CPU当前运作频率
-w  从硬件获取CPU运作频率,需要ROOT
-l    获得硬件限制的CPU频率范围
-d   得到使用的cpufreq内核驱动
-p   获得当前使用的cpufreq策略
-g   列出可用的governors,governors类似于Windows的电源计划:
          ondemand    按需快速动态调整CPU频率,会极速的在最大最小频率之间调整
          conservative   类似于ondemand,但是频率按时间的变化曲线会比较平缓
          performance   运行于最大频率
          powersave    运行于最小频率
          userspace   运行于用户指定的频率
-a   查看哪些CPU以相同的硬件频率运行
-s    如果可用,获得cpufreq统计信息
-y    显示最大的CPU频率变更延迟时间
-m  输出人类可读格式

示例:

Shell
1
2
3
4
5
cpufreq-info -p
# 800000 2901000 userspace 
 
cpufreq-info -g
# conservative ondemand userspace powersave performance
cpufreq-set

修改CPU频率设置的小工具

选项:
-c CPU    指定操作的CPU的序号,如果不指定,针对0号操作
-d    governor可以选择的最低频率
-u    governor可以选择的最高频率
-g GOV    切换使用的governor
-f    手工设置频率,需要加载governor:userspace
-r    修改所有硬件相关的CPU,2.6.29+忽略此选项

注意:设置在重启后丢失,要持久化,可以修改 /etc/init.d/cpufrequtils 脚本

示例:

Shell
1
2
3
4
5
6
7
# 设置为最大性能
sudo cpufreq-set -g performance
# 设置为省电模式
sudo cpufreq-set -g powersave
 
# 设置0号CPU的频率
sudo cpufreq-set -f 2901000
nsenter

在其它进程的命名空间中,执行程序。可进入的命名空间包括:mount、UTS、IPC、network、PID、user。

格式:

Shell
1
2
# 如果不指定program,则运行${SHELL},默认/bin/sh
nsenter [options] [program [arguments]]

 选项:

-t 进入哪个PID的命名空间
-m, --mount[=file] 进入mount命名空间,如果指定file,则从文件读取命名空间,否则使用PID的mount命名空间
-u 进入UTS命名空间
-i 进入IPC命名空间
-n 进入网络命名空间
-p 进入PID命名空间
-U 进入User命名空间
-G, --setgid gid 进入命名空间后,使用的GID,进入User命名空间总是需要设置GID,默认自动设置为0
-S, --setuid uid 进入命名空间后,使用的UID,进入User命名空间总是需要设置UID,默认自动设置为0
--preserve-credentials 进入User命名空间后不改变凭证信息,默认行为是设置为0,并且清楚补充组(supplementary groups)
-r 设置root目录
-w 设置工作目录

unshare 

运行应用程序,且不共享父进程的某些命名空间。

格式:

unshare [options] program [arguments]

选项:

-m 取消共享mount命名空间
-u 取消共享UTS命名空间
-i 取消共享IPC命名空间
-n 取消共享网络命名空间
-p 取消共享PID命名空间
-U 取消共享User命名空间

lvm

逻辑卷管理器(Logical Volume Manager)用于管理“逻辑卷”,专注于可弹性的扩缩文件系统的大小,它能够把多个物理分区合并为一个逻辑的卷。

概念:

Physical Volume,PV,物理卷:可供存储LVM的块设备,例如一块磁盘、一个MBR/GPT分区、一个回环文件、一个被内核映射的设备。PV包含一个特殊的LVM头

Volume Group,VG,卷组:一组物理卷,可以作为逻辑卷的容器。物理块从VG中分配出来,分配给LV

Logic Volume,LV,逻辑卷:也叫虚拟卷,由单个VG中的很多物理块组成。行为上类似于物理块设备,你可以在其上创建文件系统

Physical Extent,PE,物理块:VG中最小的连续取于(默认4MiB),多个PE组成LV

下面示例一个由两块磁盘构成的LV:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
Physical disks
 
  Disk1 (/dev/sda):
     _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
    |Partition1 50 GiB (Physical volume) |Partition2 80 GiB (Physical volume)     |
    |/dev/sda1                           |/dev/sda2                               |
    |_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ |_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ |
 
  Disk2 (/dev/sdb):
     _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
    |Partition1 120 GiB (Physical volume)                 |
    |/dev/sdb1                                            |
    |_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _|
 
 
 
 
LVM logical volumes
 
  Volume Group1 (/dev/MyVolGroup/ = /dev/sda1 + /dev/sda2 + /dev/sdb1):
     _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
    |Logical volume1 15 GiB  |Logical volume2 35 GiB      |Logical volume3 200 GiB              |
    |/dev/MyVolGroup/rootvol |/dev/MyVolGroup/homevol     |/dev/MyVolGroup/mediavol             |
    |_ _ _ _ _ _ _ _ _ _ _ _ |_ _ _ _ _ _ _ _ _ _ _ _ _ _ |_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _|

命令:

Shell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
# 列出可作为物理卷的设备
lvmdiskscan
 
# 创建物理卷,此命令将会在设备上创建LVM头
pvcreate /dev/sda2
 
# 显示物理卷列表
pvdisplay
# 获取所有物理卷
pvs
 
# 分区增大后,使用下面的命令可以自动扩充PV的大小
pvresize /dev/sda1
 
# 缩小PV
pvresize --setphysicalvolumesize 40G /dev/sda1
 
# 移动PV上的数据
pvmove /dev/sdb1
# 指定目标
pvmove /dev/sdb1 /dev/sdf1
 
# 删除PV,解除LVM头,LVM不会再将其看作是PV
pvremove /dev/sdb1
 
 
 
# 创建卷组
# vgcreate <volume_group> <physical_volume>
vgcreate VolGroup00 /dev/sda2
 
# 扩大卷组,覆盖(添加)其它物理卷
vgextend VolGroup00 /dev/sdb1
 
# 你也可以在创建卷组是指定多个物理卷
vgcreate VolGroup00 /dev/sda2 /dev/sdb1 /dev/sdc
 
# 重命名卷组
vgrename /dev/vg02 /dev/my_volume_group
 
# 显示卷组列表
vgdisplay
# 获取所有卷组
vgs
 
# 从VG移除PV
vgreduce myVg /dev/sdb1
# 移除所有空的PV
vgreduce --all vg0
 
 
 
# 创建逻辑卷
# lvcreate -L <size> <volume_group> -n <logical_volume>
lvcreate -L 10G VolGroup00 -n lvolhome
# 随后你可以通过 /dev/VolGroup00/lvolhome 访问此逻辑卷
 
# 限制逻辑卷仅能位于指定的物理卷上
lvcreate -L 10G VolGroup00 -n lvolhome /dev/sdc1
 
# 使用卷组中所有剩余空间的LV
lvcreate -l 100%FREE VolGroup00 -n lvolhome
 
# 显示逻辑卷列表
lvdisplay
# 获取所有逻辑卷
lvs
 
# 重命名逻辑卷
lvrename /dev/vg02/lvold /dev/vg02/lvnew
# 或者
lvrename vg02 lvold lvnew
 
# 改变LV大小
# 可能需要先通知物理卷的大小改变了
pvresize /dev/vdb
# 修改逻辑卷大小
lvresize -L +10G --resizefs MyVolGroup/mediavol
lvresize -L 15G --resizefs MyVolGroup/mediavol
lvresize -l +100%FREE --resizefs cinder-volumes/cinder-volumes-pool
 
# 删除逻辑卷,需要先umount,lsblk获取挂载点列表
lvremove VolGroup00/lvolhome
 
# 改变逻辑卷属性
vgchange
  # 激活(ay)或禁用(an)逻辑卷,只有激活的才能作为块设备
  -a|--activate y|n|ay
dmsetup

Device Mapper的用户空间工具,可以实现低级别的逻辑卷管理

格式:

Shell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
# 为指定的设备销毁非活动表槽(table slot)中的表
dmsetup clear device_name
 
# 创建具有指定名称的卷
# 如果操作成功,则设备出现在表中,并且为活动设备创建文件/dev/mapper/device_name
dmsetup create device_name [-u|--uuid uuid] [--addnodeoncreate|--addnodeonresume]
  # 如果提供table或table_file则加载表并激活,否则从stdin读取表(除非-n)
  [-n|--notable|--table {table|table_file}] [--readahead {[+]sectors|auto|none}]
 
# 列出设备的live table引用的设备列表
dmsetup deps [-o options] [device_name]
 
# 打印设备的简要信息
dmsetup info [device_name]
# 格式化打印
dmsetup info -c|-C|--columns [--count count] [--interval seconds] [--nameprefixes]
  [--noheadings] [-o fields] [-O|--sort sort_fields] [--separator separator] [device_name]
 
# 将table加载到设备的inactive table  slot
dmsetup load device_name [--table {table|table_file}]
 
# 列出设备名称
dmsetup ls [--target target_type] [--exec command] [--tree] [-o options]
 
# 向设备发送消息
dmsetup message device_name sector message
 
# 确保设备位于/dev/mapper的设备文件节点正确
dmsetup mknodes [device_name]
 
# 移除设备,移除后dmsetup不能再看见它。正在使用中的设备无法移除
# 使用 --force 会替换掉表,并让所有IO失败
# 使用 --deferred 可以延迟打开中的设备的删除,最后一个用户关闭设备后执行移除
dmsetup remove [-f|--force] [--retry] [--deferred] device_name
 
# 删除所有设备定义,也就是重置驱动
dmsetup remove_all [-f|--force] [--deferred]
 
# 重命名设备
dmsetup rename device_name new_name
dmsetup rename device_name --setuuid uuid
 
# 恢复设备,如果加载了inactive table,则表变为live,退出的IO将重新排队等待处理
dmsetup resume device_name [--addnodeoncreate|--addnodeonresume] [--noflush]
  [--nolockfs] [--readahead {[+]sectors|auto|none}]
 
# 管理IO统计信息
dmsetup stats command [options]
 
# 输出状态信息
dmsetup status [--target target_type] [--noflush] [device_name]
 
# 暂停设备,任何已经被设备映射的、尚未完毕的IO操作会被flush,
# 后续IO操作将被推迟处理,直到从暂停中恢复
dmsetup suspend [--nolockfs] [--noflush] device_name
 
# 输出设备的当前的表信息
dmsetup table [--target target_type] [--showkeys] [device_name]
 
# 打印当前加载的目标信息
dmsetup targets
 
# 等待直到事件计数器超过event_nr
dmsetup wait [--noflush] device_name [event_nr]
 
# 等待进行中的IO完成,然后将表替换为新的,让所有新IO请求失败
# 如果操作成,设备的表中引用的所有设备被释放
dmsetup wipe_table device_name [-f|--force] [--noflush] [--nolockfs]

示例:

Shell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
# 创建空白文件
# 声明大小10G,实际占用空间(seek)4K
dd if=/dev/zero of=/tmp/data.img bs=1K count=1 seek=10M
# 声明大小100M
dd if=/dev/zero of=/tmp/meta.img bs=1K count=1 seek=100K
 
# 映射为虚拟(loopback)块设备
losetup /dev/loop10 /tmp/meta.img
losetup /dev/loop11 /tmp/data.img
 
# 基于上述块设备,创建一个mapped device(thin-provisioning池)
dmsetup create thinpool0 \
#          数据设备起始扇区
#            数据设备结束扇区 * 512 = 10G      
#                               元数据设备
#                                           数据设备    
  --table "0 20971522 thin-pool /dev/loop10 /dev/loop11 \
# 最小可以分配的扇区数
#    最少可用的扇区阈值
#          有1个附加参数
#            附加参数,跳过用0填充的块
  128 65536 1 skip_block_zeroing"
 
# 设备 /dev/mapper/thinpool0 现在可用
 
# 在thinpool0上创建一个thin-provisioning卷
#                                        标识符
dmsetup message thinpool0 0 "create_thin 0"
dmsetup create thinvol0 --table "0 2097152 thin /dev/mapper/thinpool0 0"
 
# 设备 /dev/mapper/thinvol0 现在可用
 
# 格式化
mkfs.ext4 /dev/mapper/thinvol0
 
# 挂载
mkdir /tmp/thinvol
mount /dev/mapper/thinvol0 /tmp/thinvol
 
 
 
# 创建快照
#                                        新设备ID(快照设备)
#                                          旧设备ID,就是上文的thinvol
dmsetup message thinpool0 0 "create_snap 1 0"
# 创建快照设备
dmsetup create thinvol-snap0 \
  --table "0 2097152 thin /dev/mapper/thinpool0 1"
诊断与监控命令
命令 说明 
df

使用列表的形式显示文件系统的使用状况

格式:
df [OPTION]... [FILE]...

选项:
-a, --all 包含虚拟文件系统
-B, --block-size=SIZE 按SIZE缩放长度单位,-BM表示以1,048,576字节为单位
--total 进行总计
-h, --human-readable 以可读方式显示容量
-H, --si 与-h相似,但是单位转换时使用1000而不是1024
-i, --inodes 显示inode信息而不是block用量
-k 等价于 --block-size=1K
-l, --local 仅显示本地文件系统
--no-sync 在获取容量使用情况前不使用sync操作,默认行为
--output[=FIELD_LIST] 使用FIELD_LIST来指定输出列
-P, --portability 使用POSIX输出格式
--sync 在获取容量使用情况前使用sync操作
-t, --type=TYPE 限制文件系统的类型
-T, --print-type 打印文件系统类型
-x, --exclude-type=TYPE 排除文件系统类型

输出:
Filesystem 文件系统(分区)
1K-blocks  总计块数量
Used 已使用块数量
Available  可用块数量
Use% 占用百分比
Mounted on 挂载点

举例:

Shell
1
2
3
4
5
6
7
8
9
alex@amethystine:~$ df
Filesystem     1K-blocks    Used Available Use% Mounted on
/dev/sda1       81405680 7703348  69544124  10% /
none                   4       0         4   0% /sys/fs/cgroup
udev             3041916       4   3041912   1% /dev
tmpfs             610540    1624    608916   1% /run
none                5120       0      5120   0% /run/lock
none             3052692     152   3052540   1% /run/shm
none              102400      32    102368   1% /run/user
du

估算磁盘使用状况。该命令会递归的统计目录下每个文件的磁盘占用情况

格式:
du [OPTION]... [FILE]...

选项:
-0, --null 使用空字符而不是换行符结束输出的每一行
-a, --all 统计所有文件,而不仅仅是目录
--apparent-size 统计文件尺寸而不是磁盘占用空间,前者
-B, --block-size=SIZE 打印输出前,对尺寸进行缩放
-b, --bytes 等价于--apparent-size --block-size=1
-c, --total 生成总计信息
-D, --dereference-args 仅解引用命令行参数列出的文件的符号链接
-d, --max-depth=N 仅打印不超过N级子目录的统计信息
-h, --human-readable 使用便于阅读的方式打印输出,例如1K 234M 2G
-L, --dereference 解引用所有符号链接
-l, --count-links 对于硬链接,出现多次时,分别统计大小
-P, --no-dereference 默认,不解引用任何符号连接
-S, --separate-dirs 不包含子目录的大小
--si 类似于-h,但是使用1000而不是1024作为倍率
-s, --summarize 仅显示每个参数的统计信息
-t, --threshold=SIZE 如果为负数,则排除大小小于SIZE的条目;如果为正数,则排除大小大于SIZE的条目
--time 显示目录和文件的最后修改时间
--time-style=STYLE 时间显示格式,参考date命令的日期格式
-X, --exclude-from=FILE 排除FILE模式匹配的文件
exclude files that match any pattern in FILE

举例:

Shell
1
2
3
4
#显示最大的文件或目录
for i in G M K; do du -ah | grep [0-9]$i | sort -nr -k 1; done | head -n 11
#显示最大子目录
du -cks * | sort -rn | head -10
lsof

列出打开的文件
这里的文件可能是:普通文件、目录、特殊块文件、特殊字符文件、库、流、网络文件(套接字、NFS文件)
如果不提供任何选项lsof会列出当前活动进程打开的所有文件

格式:
lsof
  [ -?abChKlnNOPRtUvVX ] [ -A A ] [ -c c ] [ +c c ] [ +|-d d ]
  [ +|-D D ] [ +|-e s ] [ +|-f [cfgGn] ] [ -F [f] ] [ -g [s] ]
  [ -i [i] ] [ -k k ] [ +|-L [l] ] [ +|-m m ] [ +|-M ] [ -o [o]]
  [ -p s ] [ +|-r [t[m]] ] [ -s [p:s] ] [ -S [t] ] [ -T [t] ]
  [ -u s ] [ +|-w ] [ -x [fl] ] [ -z [z] ] [ -Z [Z] ] [ -- ] [names]

选项:
-a 各选项指定的条件进行逻辑与
-b 避免调用可能导致阻塞的内核函数,例如lstat/readlin/stat
-c c 选择执行的命令以c字符开始的进程,可指定多次(逻辑或)
+d s 列出打开的目录s及其直接包含的文件的实例
-d s 指定需要从输出中排除的文件描述符,逗号分隔,例如'cwd,1,3',可指定多次(逻辑或)
+D D 列出打开的目录D及其目录层次下任何文件的实例
-i i 列出所有Internet地址匹配i的文件,如果不指定i则列出所有网络文件
  Internet地址格式:[46][protocol][@hostname|hostaddr][:service|port]
  46指定IP地址版本
  protocol指定协议名称,例如TCP/UDP
  hostname指定主机名
  hostaddr指定主机地址
  service指定/etc/services中的服务名称
  port指定端口或者端口的列表
-l 禁止将UID转换为用户名
-n 禁止将网络地址转换为主机名
-P 禁止将端口号转换为知名端口
-N 选择NFS文件的列表
-p s包含或选择指定PID打开的文件,例如-p 1022,^3391
-R 在PPID列显示父进程ID
-U 选择UNIX domain Socket文件
-u 列出指定用户打开的文件
-- 用于指示选项的结束
names 需要被列出的文件的路径名

输出:
COMMAND 关联到进程的UNIX命令的前9个字符
PID 打开文件的进程的ID
TID 关联的任务ID
PPID 打开文件的进程的父进程的ID
PGID 进程组ID
USER 进程所属用户的ID或者名称
FD 显示文件描述符或者:
   cwd 当前工作目录
   err FD信息错误
   jld FreeBSD的jail目录
   ltx 共享库文本(代码或数据)
   Mxx HEX内存映射类型xx
   m86 DOS合并映射文件
   mem 内存映射文件
   mmap 内存映射设备
   pd 父目录
   rtd 根目录
   txt 程序文本(代码或数据)
   v86 VP/ix映射文件
  FD之后会跟随文件打开方式字符:
   r 读访问
   w 写访问
   u 读写访问
    空格表示模式未知且无锁定
   - 模式未知且有锁定
  打开方式后会跟随一个锁定方式字符:
   r 部分文件读锁定
   R 全部文件读锁定
   w 部分文件写锁定
   W 全部文件写锁定
   u 任意长度的读写锁定
   U 未知类型的锁定
    空格表示无锁定
TYPE 关联文件的节点类型:GDIR, GREG, VDIR, VREG,或者:
   IPv4 IPv4套接字
   IPv6 IPv6套接字
   ax25 Linux AX.25套接字
   inet Internet domain 套接字
   rte AF_ROUTE 套接字
   sock 未知domain的套接字
   unix UNIX domain套接字
   x.25 HP-UX x.25套接字
   BLK 特殊块文件
   CHR 特殊字符文件  
   DEL 已删除的Linux映射文件 
   DIR 目录
   DOOR VDOOR文件
   FIFO FIFO特殊文件
   KQUEUE BSD风格的内核事件队列文件
   LINK 符号链接
   MPB 多路复用的块文件
   MPC 多路复用的字符文件
   PIPE 管道
NAME 挂载点的名称、或者文件依存的文件系统或者字符、块设备名称;
   或者网络文件的本地/远程IP地址:localip:port -> remoteip:port
   或者本地或远程NFS的挂载点名称;

举例:

Shell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#查看占用8080端口的进程
lsof  -i  :8080
#列出所有TCP网络连接信息
lsof  -i tcp
#root打开的全部txt文件
lsof -a -u root -d txt
#如果umount文件系统失败,可以查看谁在使用
lsof /media/kssi
#列出alex打开的所有文件
lsof -u alex
#列出apache或者mysqld打开的文件
lsof -c mysqld -c apache
#列出alex执行的mysql打开的文件
lsof -u alex -c mysql
#列出进程打开的文件
lsof -p 1223,3328
fuser

找出使用文件或者套接字的进程
在默认显示模式下,每个文件名后面会有一个字母来表示访问类型:
c 当前目录
e 可执行文件
f 打开文件
F 打开文件以写入
r 根目录
m 内存映射文件或者共享库

格式:
fuser [-fuv] [-a|-s] [-4|-6] [-c|-m|-n space]
   [ -k [-i] [-M] [-w] [-SIGNAL] ] name ...
fuser -l
fuser -V

选项:
-a --all 显示命令行指定的所有文件,默认只会显示最少被一个进程使用的文件
-c -m --mount NAME 指定一个被挂载的文件系统,该文件系统所有文件被列出
-k --kill 杀死访问文件的进程,除非指定-SIGNAL,否则会使用SIGKILL信号,fuser不会杀死自己
-i --interactive 在杀死进程前要求用户确认
-l --list-signals 列出所有支持的信号名称
-w 仅仅杀死执行写访问的进程
-n --namespace SPACE 指定不同的命名空间:默认file,其它包括udp、tcp
-SIGNAL 杀死进程时发送的信号
-u --user 在PID后面附加用户名
-v --verbose 冗长模式
-4 --ipv4 仅搜索IPv4套接字
-6 --ipv6 仅搜索IPv6套接字

举例:

Shell
1
2
3
4
#杀死所有访问/home文件系统的进程
fuser -km /home
#查看使用631端口的进程
fuser -v 631/tcp
dstat

收集系统资源统计信息的综合性工具
该工具可以用来替换vmstat/iostat/ifstat

格式:
dstat [-afv] [options..] [delay [count]]

选项/输出:

-c --cpu 启用CPU统计:
      usr 用户态时间占比
      sys 内核态时间占比
      idl 空闲时间占比
      wai 等待时间占比
      hiq 硬件中断次数
      siq 软件中断次数

-C 0,3,total 包含CPU0、CPU3和总计的CPU使用情况

 

-d --disk 启用磁盘使用情况统计,单位字节

-D total,xvda 包含总计、xvda磁盘使用情况

 

-g, --page 启用换页统计情况
      in 换入的页个数
      out 换出的页个数

 

-i --int 启用中断次数的统计

 

-l --load 启用平均负载统计
      1m 一分钟平均负载
      5m 五分钟平均负载
      15m 十五分钟平均负载
所有类UNIX系统在内核中计算负载,完全空闲的计算机负载为0,单CPU的饱和负载为1,8核CPU的饱和负载为8。每个使用/等待CPU的进程导致负载+1,每个终结的进程导致负载-1,如果你发动1000个死循环线程,负载就会高达千级别。大部分UNIX系统仅仅统计Running或者Runnable(等待被调度)进程,但是Linux也将不可中断睡眠的进程(通常在等待磁盘活动完成)统计进来。这意味着,在Linux系统中,卡死的磁盘IO(例如NFS太慢、硬盘坏道、USB 1.0)可能导致负载畸高的同时CPU占用较低

当单CPU的负载达到0.7,需要警惕;持续大于1.0,需要尽快找到原因并降下来;大于5.0意味着系统问题严重,接近死机

在单CPU系统中,平均负载1.73 0.60 7.98意味着:

  1. 最近1分钟,系统超载73%。如果CPU每分钟内最多处理100进程,这意味着最近一分钟它需要处理的进程为173,需要再用一分钟才能处理完
  2. (CPU、磁盘、内存...)速度快1.73倍,它就可以处理完最近一分钟调度的工作
  3. 最近5分钟,系统平均有40%的时间空闲
  4. 最近15分钟,系统超载698%,7.98的可运行进程

 

-m --mem 启用内存统计
      used 已经使用的内存
      buff 系统缓冲区(块设备I/O缓冲)占用内存
      cach 已缓存(在内存中的页)的内存
      free 空闲的内存

 

-n --net 启用网络统计,单位字节
      recv 接收数据量
      send 发送数据量

-N eth0,total 包含eth0、总计的网络统计

 

-p --proc 启用进程统计
      run 处于可运行(不一定占用CPU)状态的占比
      blk 不可中断睡眠(阻塞)状态的占比
      new 新启动进程占比

 

-r, --io 启用I/O请求统计,针对所有块设备的IO请求次数
      read 读请求
      writ 写请求

 

-s, --swap
      used 已使用的交换分区
      free 空闲的交换分区

-S swap1,total 包含swap1、总计的交换分区统计

 

-t, --time 输出系统时间

-T, --epoch 输出1970到现在的秒数

 

-y, --sys 启用系统统计
      int 中断次数
      csw 上下文切换次数

 

--aio 启用异步I/O统计

 

--fs 启用文件系统统计

 

--ipc 启用进程间通信统计
      msg 消息队列
      sem 信号量
      shm 共享内存

 

--lock 启用文件锁定统计
      pos posix锁
      lck flock锁
      rea 读锁
      wri 写锁

 

-raw 启用原始套接字统计

--socket 启用套接字统计
      tot 统计
      tcp TCP
      udp UDP
      raw RAW
      frg IP分片

--tcp 启用TCP统计
      lis 处于监听状态的个数
      act 建立的连接个数
      syn 处于SYN阶段的连接个数
      tim 本端已关闭,正在等待网络上数据报的连接个数 
      clo 关闭的连接个数

--udp 启用UDP统计enable udp stats (listen, active)
      lis 处于监听状态的个数
      act 活动的个数

--unix 启用UNIX套接字统计

 

--list 列出内部外部插件的名称
-a --all 等价于-cdngy,默认开启此选项
-f, --full 完整格式,单独显示各网卡和硬盘
-v, --vmstat 等价于 -pmgdsc -D total
--float 强制显示浮点数
--integer 强制显示整数
--bw, --blackonwhite 如果Terminal背景为白色,使用该选项调整配色
--nocolor 禁用配色
--noheaders 禁用重复的表头显示
--noupdate 禁止立即刷新,如果delay大于1
--output file 输出CSV格式到文件

delay 刷新延迟,默认1秒
count 退出前刷新的次数,默认无限

示例:

Shell
1
2
3
4
# 各项系统指标,每分钟显示新行
dstat -tlcmsgdrnpy 60
# 网络相关指标
dstat -tn --socket --tcp --udp --unix 60
vmstat

显示虚拟内存的统计信息
输出:
procs组:
  r表示等待CPU时间的进程数
  b表示处于不可中断睡眠(等待I/O)的线程数
memory组:
  swpd交换到磁盘的块数
  free表示空闲内存块数
  buff表示用于缓冲区的块数
  cache表示用于系统缓存的块数
swap组:
  si表示每秒交换进内存的块数
  so表示每秒交换出内存的块数,通常不应该超过10
io组:
  bi表示每秒读出块数
  bo表示每秒写入块数
system组:
  in表示每秒中断数
  cs表示每秒上下文切换数
cpu组: 
  us表示运行用户代码(非内核)占比
  sy表示运行系统(内核)代码占比
  id表示空闲占比,wa表示等待I/O占比
  st在虚拟化时表示从虚拟机“偷来”的时间占比

注意:统计按块为单位,GNU/Linux一般为1024字节

pidstat

报告进程(任务)的统计信息

格式: pidstat options interval count

选项:

-C comm,仅仅显示其命令行包含指定字样的任务的统计信息
-d 报告磁盘I/O统计信息
-r 报告页面错误和内存使用
-s 报告栈使用情况
-u  报告CPU使用情况
-w 报告上下文切换情况
-I 在SMP环境下,提示任务的CPU用量应该被除以CPU总数
-l 显示进程的完整命令
-p 逗号分割,需要报告的PID
-T TASK|CHILD|ALL,TASK表示报告每个进程本身、CHILD表示报告进程+子进程,ALL表示同时报告TASK和CHILD
-t 同时显示进程的线程的统计信息

free 显示系统的空闲内存
iotop

显示磁盘使用最高的进程,动态刷新

输出列包括在采样周期内:每个进程/线程读写所占用的带宽、每个线程在等待换页、等待IO所消耗的时间百分比(相对于自己的总时间,因此可能有多个进程同时高达99%),每个进程的IO优先级(类型/级别)也会显示

同时输出的还包括统计信息:

总磁盘读写,进程/内核线程与内核块设备子系统之间的总计带宽
实际磁盘读写,内核块设备子系统与底层硬件(HDD/SSD)之间的实际带宽

由于IO重排序、缓存的存在,实际磁盘读写、总磁盘读写会不一样

快捷键:Left Right切换排序方式、r倒序显示、p切换进程/线程模式、o仅仅显示实际正在IO的进程、i调整IO优先级(ionice)

iostat

显示输入输出统计信息。该命令的数据源是/proc/diskstats:

Shell
1
2
3
4
5
6
7
cat /proc/diskstats
   8       0 sda 72447 130694 1438586 11132 14 0 8 88 0 10068 11148
   8       1 sda1 311 4798 7160 36 0 0 0 0 0 28 36
   8       2 sda2 71622 125896 1427320 11052 0 0 0 0 0 9956 10980
   8       3 sda3 364 0 2906 36 1 0 8 0 0 36 36
   8      16 sdb 12186 206560 907224 63264 6085 523283 4234488 2478428 0 74192 2541680
   8      17 sdb1 12008 206560 905800 63048 6028 523283 4234488 2474144 0 69692 2537180

一共11个字段,除了字段9之外,都从系统启动以来一直累加:

  1. rd_ios:读操作的次数。
  2. rd_merges:合并读操作的次数。如果两个读操作读取相邻的数据块时,可以被合并成一个,以提高效率
  3. rd_sectors:读取的扇区数量
  4. rd_ticks:读操作消耗的时间(以毫秒为单位)。每个读操作从__make_request()开始计时,到end_that_request_last()为止,包括了在队列中等待的时间
  5. wr_ios:写操作的次数
  6. wr_merges:合并写操作的次数
  7. wr_sectors:写入的扇区数量
  8. wr_ticks:写操作消耗的时间(以毫秒为单位)
  9. in_flight:当前未完成的I/O数量。在I/O请求进入队列时该值加1,在I/O结束时该值减1。是I/O请求进入队列时,而不是提交给硬盘设备时,因此不考虑IO请求合并
  10. io_ticks:该设备用于处理I/O的墙上时间,注意io_ticks与rd_ticks和wr_ticks的区别,rd_ticks和wr_ticks是把每一个I/O所消耗的时间累加在一起,因为硬盘设备通常可以并行处理多个I/O,所以rd_ticks和wr_ticks往往会比墙上大。而io_ticks表示该设备有I/O(即非空闲)的时间,不考虑I/O有多少,只考虑有没有。在实际计算时,in_flight)不为零的时候io_ticks保持计时,in_flight为零的时候io_ticks停止计时
  11. time_in_queue:对io_ticks的加权值,用当前的I/O数量in-flight乘以墙上时间。虽然该字段的名称是time_in_queue,但并不真的只是在队列中的时间,其中还包含了硬盘处理I/O的时间。iostat在计算avgqu-sz时会用到这个字段

更多信息参考:http://linuxperf.com/?p=156

选项:

-c 显示CPU利用情况报告
-d 显示设备利用情况报告
-g 限制指定设备组的统计信息
-h 让报告更加易读
-k 以KB为单位
-m 以MB为单位
-p 显示指定的块设备和它的分区的统计信息

输出:
rrqm/s wrqm/s
表示每秒被合并(OS把队列中的多个逻辑读写请求分组到单个物理读写)的读、写请求
r/s w/s
每秒发送到设备的读写请求数
rsec/s wsec/s 每秒读写的扇区数(扇区是磁盘读写的基本单位,磁盘表面的同心圆曰磁道,磁道的上512字节的弧段曰扇区。现代磁盘的扇区大小可能为4K。Windows下磁盘最小逻辑管理单位叫簇,由若干个扇区组成。NTFS文件系统默认簇大小为4K)
rkB/s wkB/s
每秒读写的KB数
avgrq-sz 
平均每次设备I/O操作的数据大小 (扇区)
avgqu-sz
在设备队列中等待的请求数(平均I/O队列长度)
await
平均每次设备I/O操作的等待的毫秒数
svctm
平均每次设备I/O操作的服务请求的毫秒数(排除队列等待时间),该指标没有价值,可以忽略
%util 
一秒中有百分之多少的时间用于I/O操作,或者说一秒中有多少时间I/O队列是非空的。对于串行处理请求的设备,此值接近100%意味着设备能力饱和;对于RAID阵列或现代SSD则不能体现出设备的性能限制

示例:

Shell
1
2
3
4
5
# 每秒刷新
iostat -xd 1
 
# 显示磁盘SDC的TPS、每秒读写KB数
iostat 1 -d -h -y -k -p sdc
top 

显示CPU占用最高的进程,动态刷新

命令:

d 刷新延迟 H 显示线程 B 粗体显示 z 彩色显示 
l 系统负载  t 处理器状态 1按核显示处理器状态 m 内存和交换文件
c 显示完整命令 i 显示空闲任务 R 反转排序  V树状显示

选项:

-PN1,N2... 仅仅显示指定进程
-H 显示每个线程

输出:

CPU状态:us非niced用户进程耗时,sy内核进程耗时,ni被niced用户进程耗时,id空闲的时间,wa等待IO操作完成消耗的时间,hi处理硬件中断的时间,si处理软件中断的时间,st当前vm被hypervisor偷去的时间

wa应该在绝大部分时间内都是0,它表示CPU花在等待IO的时间,如果长时间超过1%提示磁盘IO性能不足

其它:

关于系统负载(load average):

  1. 状态为运行(R)和不可中断睡眠(D)的进程,贡献系统负载
mpstat

报告CPU相关的统计信息

格式:

mpstat [ -A ] [ -u ] [ -V ] [ -I { keyword [,...] | ALL } ] [ -P { cpu [,...] | ON | ALL } ] [ interval [ count ] ]

选项:

-A 等价于 -u -I ALL -P ALL
-P 指定需要报告的CPU
-u 报告CPU用量

输出:

CPU CPU序号,all表示所有CPU的均值
%usr 执行用户空间代码消耗的CPU时间占比
%nice 执行用户空间并且使用nice优先级的代码耗时占比
%sys 执行内核空间代码消耗的CPU时间占比,不包含处理硬件/软件中断的时间
%iowait 系统中存在进行中的IO请求,同时CPU空闲的时间占比
%irq 处理硬件中断的CPU时间占比
%soft 处理软件中断的CPU时间占比
%steal  虚拟CPU消耗在非自愿等待的、同时Hypervisor用来执行其它虚拟处理器的时间占比
%guest 执行虚拟CPU的时间占比
%gnice 执行niced客户机的CPU时间占比
%idle 空闲,且没有进行中IO请求的时间占比

注意:

  1. %usr + %nice + %sys + %iwoait + %irq + %soft + %steal + %guest + %gnice + %idle = 100%
  2. %iowait不代表CPU不能工作,也不代表存在IO瓶颈。判定是否存在IO瓶颈,应当结合iostat的avserv/avwait/avque等指标
atop

交互式的系统负载监视器,它能够直观的监控最重要的系统硬件资源的使用情况,还能显示哪些进程应该为高资源占用负责

注意:

  1. 必须启用内核特性storage accounting才能按进程显示磁盘负载
  2. 必须安装netatop内核模块才能按进程显示网络负载

程序界面每10秒

htop

显示CPU占用最高的进程,动态刷新,比top提供更多的信息

状态条:

CPU:蓝色代表低优先级线程;绿色代表正常优先级线程;红色代表内核线程

MEM:绿色代表已使用内存页;蓝色代表缓冲(Buffer)页;黄色代表缓存(Cache)页

Load average:包含3个,分别为最近1/5/15分钟的平均负载。所谓负载使用浮点数表示,如果服务器具有4个核心,那么负载达到4.00相当于满载,如果负载达到20.00意味着严重超载,进程等待CPU时间将过长

选项:
-d 刷新间隔,单位秒
-C 不使用配色
-p --pid=PID,PID... 仅显示给定的PID
-s --sort-key COLUMN 指定排序列
-u --user=USERNAME 仅显示指定用户的进程

输出:
Command 完整的进程命令行
PID 进程ID
PPID 父进程ID
PGRP 进程组ID
SESSION (SESN) 进程会话ID
TTY_NR (TTY) 进程关联的中断
TPGID 控制进程的中断的前台进程组的ID
STATE (S) 进程状态:
  S 休眠进程(idle)
  R 运行中的进程
  D 不可中断的等待(I/O)
  Z 僵尸(等待父进程读取其退出转变港台)

PROCESSOR (CPU)  进程最后在哪个CPU执行
NLWP  进程包含的线程数量
NICE (NI)  进程的nice值,从19到-20(数字越小优先级越高)
PERCENT_CPU (CPU%)  进程占用的CPU百分比
UTIME (UTIME+)  用户态CPU执行时间
STIME (STIME+)  内核态CPU执行时间
TIME (TIME+)  用户态、内核态时间总和
CUTIME  子进程的用户态CPU执行时间
CSTIME  子进程的内核态CPU执行时间
PRIORITY (PRI)  内核给进程的内部优先级
PERCENT_MEM(MEM%)  进程占用的内存百分比,基于驻留集RES计算
M_SIZE (VIRT)  整个程序的虚拟内存大小,包含没有映射到内存的页。单位KB
M_RESIDENT (RES)  驻留集尺寸,实际占用物理内存大小
M_SHARE (SHR)  共享页的尺寸,即RES中与其它进程共享的部分
M_TRS (CODE)  进程代码段尺寸,即程序可执行代码的大小
M_LRS (LIB)  进程使用的库占用的尺寸
M_DRS (DATA)  进程数据段+栈的尺寸
M_DT (DIRTY)  进程脏页数量
ST_UID (UID)  进程所有者的UID
TARTTIME  进程启动以来流逝的时间
RCHAR (RD_CHAR)  进程已经读取的字节数
WCHAR (WR_CHAR)  进程已经写入的字节数
SYSCR (RD_SYSC)  read系统调用的次数
SYSCW (WR_SYSC)  write系统调用的次数
RBYTES (IO_RBYTES)  read调用读取的字节数
WBYTES (IO_WBYTES)  write调用写入的字节数
IO_READ_RATE (IORR)  read调用速率,单位KB/s
IO_WRITE_RATE (IOWR)  write调用速率,单位KB/s
IO_RATE (IO) 前两者之和,单位KB/s
CNCLWB (IO_CANCEL)  取消的write字节数

ps

报告一个当前进程的状态快照

格式:
ps [options]

选项:
简单进程选择:
-A -e 选择所有进程
-a 选择除了作为session leader的进程和未关联Terminal的进程
a  BSD风格的“仅当前用户的”约束
-d 选择除了作为session leader的进程
-N --deselect 选择所有不满足条件的进程
列表进程选择:
这些选项支持单个以空格或逗号分隔的参数,并且可以指定多次
-p --pid 按PID选择,100、-100、-p 100这三种语法都可以
-C 根据命令名称选择
-G --Group 根据真实GID选择
-g --group 根据有效GID选择
--ppid 根据父进程PID选择
-s --sid 根据会话ID选择
-t --tty 根据tty选择,-t -用于选择没有关联到任何终端的进程
-U 根据真实UID选择
-u 根据有效UID选择

输出格式控制:
-f 输出完整格式
-F 输出特别完整格式
v 显示虚拟内存信息
Z 显示寄存器信息
-o 使用用户自定义格式
--no-headers  不输出表头

自定义格式:

%cpu  CPU用量
%mem 内存用量
args  命令行及其参数,别名command

示例:

Shell
1
2
3
4
5
6
# 显示完整的命令行
ps -ef    # 标准语法
ps aux    # BSD语法
 
# 显示所有JVM的命令行
jcmd -l | awk '{system("ps --no-headers -p "$1 " -o command " ) }'
pstree

显示进程树

格式:

选项:

-a 显示命令行参数
-h 高亮当前进程及其祖先
-H PID 高亮指定进程及其祖先
-l  不要截断过长的行
-n 根据PID对输出排序
-p  显示PID,后面跟PID则仅仅显示子树

示例:

Shell
1
2
# 显示以进程24741为根节点的子树
pstree -an -p 24741
 exportfs

修改了NFS导出配置后,使用该命令生效:

Shell
1
2
3
4
5
# 执行导出
exportfs -ar
 
# 查看导出
exportfs -v

导出配置示例:

/etc/exports
Shell
1
2
3
/srv/nfs4          10.0.0.0/8(rw,sync,no_subtree_check,crossmnt,fsid=0)
/srv/nfs4/fast     10.0.0.0/16(rw,sync,no_subtree_check) 10.1.0.0/16(rw,sync,no_subtree_check)
/srv/nfs4/slow     10.0.0.0/16(rw,sync,no_subtree_check) 10.1.0.0/16(rw,sync,no_subtree_check)
iftop

显示网络使用最高的套接字,动态刷新

格式:
iftop -h | [-nNpblBP] [-i interface] 
[-f filter code] [-F net/mask] [-G net6/mask6]

选项:
-h 打印帮助
-n 不进行DNS查找
-N 不解析著名端口名
-p 运行在混杂模式,不直接发送给目标接口的流量也被统计
-P 启用端口显示
-l 显示并统计本地IPv6数据报,默认不显示
-b 不显示流量的bar图
-B 使用bytes/s作为单位而不是bits/sec
-i interface 监听指定网络接口上的流量
-f filter code 设置过滤器
-F net/mask 指定流量分析的IPv4网络范围
-G net6/mask6 指定流量分析的IPv6网络范围
-c config file 指定配置文件

输出:
顶部显示瞬时速度的标尺,其下面是占用网络带宽最高的套接字列表:

Shell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#按p可以显示或者隐藏端口号
#按1,2,3,4可以按对应的列排序,按<>分别根据源、目标排序
#按P暂停刷新,按o可以冻结当前顺序
#按f可以动态修改过滤器
#默认显示最近10秒流量占用最高的套接字
#从foo到bar最近1/10/40秒平均速率
foo.com  =>  bar.com      1Kb  500b   100b
                 <=       2Mb    2Mb    2Mb
                
#底部显示发送(TX)、接收(RX)和合计的信息
#包括bar图、累计(cum)、峰值(peak)以及1/10/40统计
TX:    cum: 27.5MB   peak: 141kb  rates: 2.67kb  4.87kb  18.3kb
RX:         2.18MB         129kb         1.66kb  2.19kb  13.7kb
TOTAL:      29.7MB         174kb         4.33kb  7.06kb  32.1kb

示例:

Shell
1
iftop -nNBPi eth0
dmesg 打印内核诊断信息,或者操控内核ring buffer
uptime 显示已经系统运行的时间
sysbench

一个跨平台、多线程、模块化的性能测试工具。可以测试:文件I/O性能、内存分配和传输速率、POSIX线程性能、数据库服务器性能等方面的内容

命令格式:

Shell
1
sysbench [common-options] --test=name [test-options] command

通用选项:

--num-threads 工作线程总数,默认1
--max-requests 最大请求次数,默认10000,0表示无限
--max-time 测试最大执行的秒数
--thread-stack-size 线程的栈大小,默认32K
--init-rnd 是否在测试启动前,从定时器初始化随机数生成器
--test 指定测试模式
--debug 打印调试信息
--validate 如果可能,验证测试结果
--percentile 保留测试数据的百分比,默认95%,意味着耗时最长的5%测试数据被丢弃
--batch 批量模式,周期性的产生测试结果
--batch-delay 两次执行之间延迟的秒数

测试模式:

cpu 通过寻找质数,来测试CPU性能
  --cpu-max-primes 寻找质数的最大数量
threads 用于测试内核在大量线程竞争一组互斥量时的调度性能
  --thread-locks 互斥量的数量,默认8
  --thread-yield  每次请求执行lock/yield/unlock循环的数量,默认1000
fileio 根据多种I/O工作负载,测试I/O性能。分为prepare、run两个阶段。prepare阶段创建一系列待测试文件
  --file-test-mode 测试模式:seqwr顺序写、seqrewr顺序重写、seqrd顺序读、rndrd随机读、rndwr随机写、rndrw随机读写
  --file-io-mode  I/O模式:sync同步、async异步、fastmmap快速内存映射、slowmmap内存映射
  --file-num 创建的文件数量,默认128
  --file-block-size 读写时的块大小,默认16K
  --file-total-size 总计文件大小,默认2G
  --file-async-backlog 每个线程可以有多少异步操作排队
  --file-fsync-freq 在多少次请求后,执行fsync()
  --file-fsync-all 是否在每次操作后执行fsync(),默认no
  --file-fsync-end 是否在测试结束后执行fsync(),默认yes
  --file-fsync-mode fsync模式:fsync、fdatasync
  --file-merged-requests 最多合并多少I/O请求,默认不合并

举例:

Shell
1
2
3
4
5
6
7
8
9
# CPU性能测试
sysbench --test=cpu --cpu-max-prime=1000000 --num-threads=8 run
# I/O性能测试
sysbench --num-threads=16 --test=fileio --file-total-size=3G --file-test-mode=rndrw prepare
sysbench --num-threads=16 --test=fileio --file-total-size=3G --file-test-mode=rndrw run
sysbench --num-threads=16 --test=fileio --file-total-size=3G --file-test-mode=rndrw cleanup
# MySQL数据插入
sysbench --mysql-host=127.0.0.1 --mysql-user=root --mysql-password=pswd --tables=1 \
    --table_size=100000000000 oltp_read_write prepare
fio

fio是测试IOPS的工具,用来对硬件进行压力测试和验证

安装:

Shell
1
2
3
4
5
6
wget https://codeload.github.com/axboe/fio/zip/master
unzip master
rm -rf master
cd fio-master/
./configure
make && make install

格式: fio [options] [jobfile]...

示例:

Shell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
filename=/dev/sdb1   # 测试文件名称,通常选择需要测试的盘的data目录
direct=1             # 测试过程绕过机器自带的buffer。使测试结果更真实
rw=randwrite         # 测试随机写的I/O
rw=randrw            # 测试随机写和读的I/O
bs=16k               # 单次io的块文件大小为16k
bsrange=512-2048     # 同上,提定数据块的大小范围
size=5G              # 本次的测试文件大小为5g,以每次4k的io进行测试
numjobs=30           # 本次的测试线程为30个
runtime=1000         # 测试时间1000秒,如果指定则将5g文件分4k每次写完即结束
ioengine=psync       # io引擎使用psync方式
rwmixwrite=30        # 在混合读写的模式下,写占30%
group_reporting      # 关于显示结果的,汇总每个进程的信息
lockmem=1G           # 只使用1g内存进行测试
zero_buffers         # 用0初始化系统buffer
nrfiles=8            # 每个进程生成文件的数量
 
# 顺序读
fio -filename=/dev/rbd1 -direct=1 -iodepth 1 -thread -rw=read -ioengine=psync -bs=16k -size=512M -numjobs=30 -runtime=60 -group_reporting -name=test
# 顺序写
fio -filename=/dev/rbd1 -direct=1 -iodepth 1 -thread -rw=write -ioengine=psync -bs=16k -size=512M -numjobs=30 -runtime=60 -group_reporting -name=test
#随机读
fio -filename=/dev/rbd1 -direct=1 -iodepth 1 -thread -rw=randread -ioengine=psync -bs=16k -size=512M -numjobs=30 -runtime=60 -group_reporting -name=test
# 随机写
fio -filename=/dev/rbd1 -direct=1 -iodepth 1 -thread -rw=randwrite -ioengine=psync -bs=16k -size=512M -numjobs=30 -runtime=60 -group_reporting -name=test
# 混合随机读写
fio -filename=/dev/rbd1 -direct=1 -iodepth 1 -thread -rw=randrw -rwmixread=70 -ioengine=psync -bs=16k -size=512M -numjobs=30 -runtime=60 -group_reporting -name=test -ioscheduler=noop
iperf3

网络吞吐量测试工具

格式:

Shell
1
2
3
4
# 服务器
iperf3 -s [ options ]
# 客户端
iperf3 -c server [ options ]

示例:

Shell
1
2
3
4
# 启动一个服务器
iperf3 -s
# 连接到服务器进行网速测试
iperf3 -c 10.0.1.1
sysdig 参考使用Sysdig进行系统性能分析
开发相关命令
 命令 说明 
pkg-config

参考Linux编程知识集锦

ldconfig

参考Linux编程知识集锦

ldd

参考Linux编程知识集锦

objdump

参考Linux编程知识集锦

gcc

参考Linux编程知识集锦

gdb

参考Linux编程知识集锦

gdbserver

参考Linux编程知识集锦

adb 参见Android知识集锦
keytool 参见Android知识集锦
jarsigner 参见Android知识集锦
apktool 参见Android知识集锦
dex2jar 参见Android知识集锦
cmake 参见CMake学习笔记
readelf

参考Linux编程知识集锦

多媒体命令
命令 说明
ffmpeg

ffmpeg是一个高性能的音视频编码器,它能够进行文件格式转换,也能够从源捕获音视频。ffmpeg能够任意的转换采样率、实时改变视频尺寸

ffmpeg读取任意数量的输入文件(可以是普通文件、管道、网络流、输入设备),写出到任意数量的输出文件中。每个文件可以是不同类型的视频、音频、字幕、附件、数据,但是受限于容器格式,不一定所有文件都支持。输入文件和输出文件的对应关系,可以自动映射,也可以利用-map选项手工映射。你应该先指定所有输入文件,然后开始指定输出文件

某些选项需要引用输入文件,你可以使用从0开始的索引引用之

基本流程

转码的处理过程如下:

输入文件 ⇨ (demuxer) ⇨ 解码后的数据包 ⇨ (decoder ) ⇨ 解码后的帧 
                                            ⇨ (encoder) ⇨ 编码后的数据包 ⇨ (muxer) ⇨ 输出文件

ffmpeg调用libavformat库(其中包含demuxers)来读取输入文件,并获得其中的编码数据包。如果有多个输入文件,ffmpeg会尝试跟踪任意输入流中最低的时间戳,以确保这些文件同步

编码数据包随后被送给decoder(除非为目标流选择流streamcopy),decoder产生非压缩的帧(原始video / PCM 音频)。这些非压缩帧可能被过滤器处理

过滤器处理过后,帧被传递给encoder,然后送给muxer,最终写到目标文件中

过滤器

在重新编码解码帧之前,ffmpeg可以对原始音频、视频进行处理,这通过调用libavfilter库完成。若干个过滤器链条组成一个filter graph。过滤器图被分为简单(simple)、复杂(complex)两类

简单过滤器图仅仅有一个输入、一个输出,且它们的类型相同。简单过滤器图通过-filter选项,在每个流上设置(-vf、-af分别对应视频、音频过滤)。简单过滤器图示例:输入 ⇨ 反交错  ⇨ 缩放  ⇨ 输出

某些过滤器会改变帧属性,但是不改变其内容。例如fps过滤器,它改变帧的数量,但是不会操作帧内容。又例如setpts过滤器,仅仅设置时间戳

复杂过滤器图可以有N个输入、N个输出。这种过滤器图通过-filter_complex(-lavfi)选项配置,此选项是全局的。复杂过滤器图的例子如overlay,它可以把两个视频重叠输出

流拷贝

设置 -codec copy,则仅仅从demux输入文件,然后mux到输出文件中。流拷贝非常快,但是由于诸多因素可能不正常工作

流选择

默认的ffmpeg仅仅包含每个类型(视频、音频、字幕)中的单个输入流,并把它们输出到每个输出文件中。如果有多个同类型的输入流,它会选择其中最好的:

  1. 对于视频:选择最高分辨率
  2. 对于音频:选择通道数最多的
  3. 对于字幕:选择第一个

要禁用上面这种默认特性,选用-vn/-an/-sn/-dn选项,或者通过-map进行细粒度控制

命令格式

Shell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
ffmpeg [options] [[infile options] -i infile]... {[outfile] outfile}...
 
# 示例
# 获取本地摄像头视频流,以MPEG1编码后通过HTTP发送
ffmpeg -s 640x480 -f video4linux2 -i /dev/video0 -f mpegts -codec:v mpeg1video -b 800k -r 30 http://127.0.0.1:8800/12345
# 把MP4转换为vp8编码格式,加快编码速度
ffmpeg -i Lightheaded.mp4 -c:v vp8 -c:a libopus -speed 4 lightheaded.webm
# 缩放视频帧,iw、ih分别表示输入宽度、高度
ffmpeg -i Lightheaded.webm -vf scale=iw/2:ih/2 Lightheaded1.webm
 
# 裁剪视频中352x288大小的区域,此区域的左上角坐标为256x64,跳过开头的一分钟
ffmpeg -i lightheaded.webm -c:v vp8 -vf "crop=352:288:256:64" -ss 60 lightheaded1.webm
# 实时预览上述裁剪的效果
ffplay -i lightheaded.webm -vf "crop=352:288:256:64" -ss 60
 
# 同时指定多个过滤器
-vf "scale=iw/2:ih/2, crop=352:288:64:64"
 
# 基于H.264编码
ffmpeg -f video4linux2 -i /dev/video0 -framerate 15 -video_size 640x480
                        # 使用x264库作为编码器              # 使用Baseline Profile
       -pix_fmt yuv420p -c:v libx264 -b:v 600k -bufsize 600k -vprofile baseline
       # 零延迟优化
       -tune zerolatency -f rawvideo -   # 输出原始视频(没有容器封装)到标准输出

辅助类选项

-buildconf 显示此软件的构建选项
-formats 显示支持的文件格式,例如mp3 mp4
-muxers 显示支持的混流器
-demuxers 显示支持的分流器
-devices  显示支持的设备类型,例如video4linux2(本质上是一系列驱动和API标准)
-codecs 显示支持的编码算法
-decoders 显示可用的解码器
-encoders 显示可用的编码器
-bsfs 显示可用的比特流过滤器
-protocols 显示支持的输入输出协议,例如http rtsp rtmp
-filters 显示支持的过滤器
-pix_fmts 显示支持的像素格式
-layouts 显示支持的音频通道布局
-sample_fmts 显示支持的音频采样
-colors 显示可用的颜色名称及其HEX代码
-sources  显示可用输入设备列表
-hwaccels 显示可用的硬件加速方式

全局选项

-loglevel loglevel 设置日志级别,等价于 -v。合法值quiet,panic,fatal,error,warning,info,verbose,debug,trace
-report 生成一个报告
-hide_banner 禁止打印ffmpeg的banner
-max_alloc bytes 单个分配的块的最大尺寸
-y  如果输出文件存在,覆盖之
-n 绝不覆盖已经存在的输出文件,如果目标文件存在则退出
-ignore_unknown 忽略未知媒体类型
-filter_threads 非复杂性过滤线程数量
-filter_complex_threads 复杂性过滤线程数量
-stats 在编码时打印进度/统计信息
-max_error_rate 最大错误率,0-1之间
-bits_per_raw_sample number 每个原始采样的对应的比特数
-vol volume 改变音量,255是正常音量
-speed N 加快编码速度,速度越快质量越差
-progress url  发送进度信息到指定的URL
-stdin 允许基于标准输入的交互,-nostdin明确的禁用之

文件级选项

-f fmt 适用IO。强制文件格式,例如mpegts
-i url 适用I。输入文件的URI
-c[:stream_specifier] codec  适用IO,可针对单个流。指定使用的编码算法,等价于 -codec 
-pre preset 预设名称
-stream_loop 适用I。输入循环次数,-1表示无限循环
-map_metadata outfile[,metadata]:infile[,metadata] 根据源文件为目标文件设置元数据
-t duration 适用IO。录制或者转码指定时长的音频/视频
-to time_stop 适用O。停止录制或者转码的时间点(position)
-fs limit_size 适用O。按字节设置文件最大尺寸
-ss time_off 适用IO。设置开始时间偏移。指定秒数或者 hh:mm:ss[.xxx]
-sseof time_off 适用IO。设置相对于EOF的开始时间偏移。0为EOF时间点,数字越小越靠前
-itsoffset offset  适用I。设置输入文件的时间偏移
-seek_timestamp 使用-ss时允许基于时间戳进行seek
-timestamp time 适用O。在容器中设置录制时间戳,now表示当前时间
-metadata string=string 添加元数据
-target type 适用O。目标类型,例如vcd、svcd、dvd、dv、dv50
-frames framecount 适用O,可针对单个流。设置输出帧的最大数量,超过数量后不再输出
-filter filter_graph 适用O,可针对单个流。设置流的filtergraph
-filter_script 适用O,可针对单个流。从文件读取filtergraph脚本
-pre[:stream_specifier] preset_name 适用O,可针对单个流。为匹配的流指定预设。这样可以快捷的调整处理速度。可选值ultrafast,superfast, veryfast, faster, fast, medium, slow, slower, veryslow, placebo
-tune 根据输入类型来优化输出。可选值film, animation, grain, stillimage, psnr, ssim, fastdecode, zerolatency
-attach filename  适用O。附加文件到输出,少数容器例如MKV支持,可以附加字幕
-discard  适用I。可以在混流器中丢弃某些流或者某些帧

视频选项

-vframes number 适用O。输出视频帧数量,等价于-frames:v
-r rate 适用IO,可针对单个流。设置帧率,可以指定HZ值、fraction、所写
-s [:stream_specifier] size 适用IO,可针对单个流。设置帧大小,WxH或者缩写,例如640x480
-aspect [:stream_specifier] 适用O,可针对单个流。aspect 设置纵横比,例如16:9 1.3333
-bits_per_raw_sample number  每个原始采样的对应的比特数
-vn 禁用视频录制,即丢弃输入的视频部分
-vcodec codec 适用O。强制使用编码算法,等价于-codec:v。取值copy则不进行重新编码
-vf filter_graph 适用O。设置视频过滤器
-b bitrate 视频比特率,等价于 -b:v
-dn 禁用数据
-pix_fmt[:stream_specifier] format (input/output,per-stream) 设置像素格式,如果指定的格式不被支持,ffmpeg会打印警告并选取编码器的最佳像素格式
+pix_fmt 类似上面,但是如果像素格式不支持,会退出
-force_key_frames[:stream_specifier] time[,time...] 适用O,可针对单个流。在指定的时间戳强制输出关键帧
-force_key_frames[:stream_specifier] expr:expr 适用O,可针对单个流。在指定的时间戳强制输出关键帧
-hwaccel[:stream_specifier] hwaccel 适用I,可针对单个流。选择硬件加速机制。取值:none不进行硬件加速;auto自动选择硬件加速方法;vda使用Apple的VDA硬件加速;vdpau使用Unix下的VDPAU硬件加速;dxva2使用DirectX硬件加速;使用Intel的QuickSync硬件加速
-hwaccel_device[:stream_specifier] hwaccel_device 适用I,可针对单个流。选择硬件加速设备。

音频选项

-aframes number 适用O。输出音频帧数量
-aq quality 适用O。设置音频质量(依赖于codec)
-ar rate 适用IO,可针对单个流。设置采样频率,单位Hz
-ac channels 设置音频通道数
-an 禁用音频,即丢弃输入的音频部分
-acodec codec 强制使用编码算法。取值copy则不进行重新编码
-vol 改变音量,255是正常音量
-af filter_graph 设置音频过滤器
-ab bitrate 音频比特率,等价于-b:a

字幕选项
-s size 设置帧大小,WxH或者缩写
-sn 禁用字幕
-scodec codec 强制使用编码算法
-stag fourcc/tag 强制字幕tag/fourcc
-fix_sub_duration 修复字幕持续时间
-canvas_size size 设置画布大小,WxH或者缩写
-spre preset  设置字幕预设

发行版特殊命令
命令   说明
rpm Redhat及其衍生版本下的包管理器,详见:CentOS知识集锦
yum  基于rpm的便捷的软件包管理工具,详见:CentOS知识集锦
apt-get APT包处理工具,详见:Ubuntu知识集锦
update-alternatives

属于dpkg的实用工具,能够维护基于符号链接确定的“默认命令”

在同一个Debian系统中安装多个相同或相似的功能是允许的,例如可以安装多个文本编辑器。但是对于程序来说,它却不知道选择哪个编辑器

Debian的备选系统(Alternatives system)用于解决此问题,系统中一个一般性的名字被多个提供可替换功能的文件共享,备选系统和管理员共同决定某个时刻到底哪个文件生效。例如ed和nvi同时安装到系统中,则备选系统默认会将一般性名字/usr/bin/editor指向nvi,管理员可以覆盖此默认值

一般性名字并非直接指向选中备选的符号链接,它直接指向的是备选目录中的文件,后者指向实际的备选文件

有时候保持一组备选的同步选中很有用,假设你安装了多个版本的vi,则man页/usr/share/man/man1/vi应该指向/usr/bin/vi所指向的vi版本。update-alternatives可以使用master/slave链接来处理这个问题。如果master变更,则关联的slave会相应的变更(改变备选)。master + 加上它关联的slaves构成链接组(link group)

每个链接组必然处于两种状态之一:

  1. 自动:当包安装或移除时,备选系统自动决定是否更新链接
  2. 手工:链接必须由管理员通过该命令手工变更

每个备选都具有优先级(priority),在自动模式下,链接组成员将指向最高优先级的备选

命令格式

Shell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
# 安装一组备选到系统中
# link master link的一般性名称
# name 位于备选目录中的符号链接的名称
# path master link引入的备选的所在位置
# priority 优先级
# --slave slave link列表,可以指定多次
--install link name path priority [--slave link name path]...
# 示例:
# 将gcc的备选设置为gcc-5,g++自动跟随着变更
update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-5 1 \
                    --slave /usr/bin/g++ g++ /usr/bin/g++-5
 
 
# 将path设置为name的一个备选,name为备选目录中的名称
--set name path
 
# 移除一个备选,以及它关联的slave links,name为备选目录中的名称
--remove name path
 
# 移除所有备选
--remove-all name
 
# 针对所有备选调用 --config
--all
 
# 将name的备选的链接组设置为自动模式。这导致最高优先级的备选对应的
# master + slaves链接被启用
--auto name
 
# 显示链接组的信息
--display name
# 类似,输出易于机器解析
--query name
 
# 列出所有链接组及其状态
--get-selections
# 示例:
sudo update-alternatives --get-selections
# c89                            auto     /usr/bin/c89-gcc
# c99                            auto     /usr/bin/c99-gcc
# cc                             auto     /usr/bin/gcc
# go                             auto     /usr/bin/gccgo-go
 
# 显示链接组的所有目标
--list name
# 示例:
# update-alternatives --list gcc
# /usr/bin/gcc-4.8
# /usr/bin/gcc-4.9
# /usr/bin/gcc-5
 
 
# 显示链接组的所有备选,允许用户交互式的选中备选
--config name
JVM相关命令
命令 说明
jps 显示指定系统内所有的HotSpot虚拟机进程
jstat 用干收集HotSpot虚拟机各方面的运行数据
jinfo 实时地査看和调整虚拟机的各项参数
jmap 生成虚拟机的内存转储快照
jhat 分析 heapdump 文件
jstack 显示虚拟机的线程快照
jcmd 1.7引入的通用命令行工具

 

← CSS知识集锦
C++学习笔记 →

Leave a Reply Cancel reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">

Related Posts

  • SVN知识集锦
  • Linux进程间通信
  • Linux运行级别和启动顺序
  • Linux目录层次和配置文件
  • Linux知识集锦

Recent Posts

  • Investigating and Solving the Issue of Failed Certificate Request with ZeroSSL and Cert-Manager
  • A Comprehensive Study of Kotlin for Java Developers
  • 背诵营笔记
  • 利用LangChain和语言模型交互
  • 享学营笔记
ABOUT ME

汪震 | Alex Wong

江苏淮安人,现居北京。目前供职于腾讯云,专注容器方向。

GitHub:gmemcc

Git:git.gmem.cc

Email:gmemjunk@gmem.cc@me.com

ABOUT GMEM

绿色记忆是我的个人网站,域名gmem.cc中G是Green的简写,MEM是Memory的简写,CC则是我的小天使彩彩名字的简写。

我在这里记录自己的工作与生活,同时和大家分享一些编程方面的知识。

GMEM HISTORY
v2.00:微风
v1.03:单车旅行
v1.02:夏日版
v1.01:未完成
v0.10:彩虹天堂
v0.01:阳光海岸
MIRROR INFO
Meta
  • Log in
  • Entries RSS
  • Comments RSS
  • WordPress.org
Recent Posts
  • Investigating and Solving the Issue of Failed Certificate Request with ZeroSSL and Cert-Manager
    In this blog post, I will walk ...
  • A Comprehensive Study of Kotlin for Java Developers
    Introduction Purpose of the Study Understanding the Mo ...
  • 背诵营笔记
    Day 1 Find Your Greatness 原文 Greatness. It’s just ...
  • 利用LangChain和语言模型交互
    LangChain是什么 从名字上可以看出来,LangChain可以用来构建自然语言处理能力的链条。它是一个库 ...
  • 享学营笔记
    Unit 1 At home Lesson 1 In the ...
  • K8S集群跨云迁移
    要将K8S集群从一个云服务商迁移到另外一个,需要解决以下问题: 各种K8S资源的迁移 工作负载所挂载的数 ...
  • Terraform快速参考
    简介 Terraform用于实现基础设施即代码(infrastructure as code)—— 通过代码( ...
  • 草缸2021
    经过四个多月的努力,我的小小荷兰景到达极致了状态。

  • 编写Kubernetes风格的APIServer
    背景 前段时间接到一个需求做一个工具,工具将在K8S中运行。需求很适合用控制器模式实现,很自然的就基于kube ...
  • 记录一次KeyDB缓慢的定位过程
    环境说明 运行环境 这个问题出现在一套搭建在虚拟机上的Kubernetes 1.18集群上。集群有三个节点: ...
  • eBPF学习笔记
    简介 BPF,即Berkeley Packet Filter,是一个古老的网络封包过滤机制。它允许从用户空间注 ...
  • IPVS模式下ClusterIP泄露宿主机端口的问题
    问题 在一个启用了IPVS模式kube-proxy的K8S集群中,运行着一个Docker Registry服务 ...
  • 念爷爷
      今天是爷爷的头七,十二月七日、阴历十月廿三中午,老人家与世长辞。   九月初,回家看望刚动完手术的爸爸,发

  • 6 杨梅坑

  • liuhuashan
    深圳人才公园的网红景点 —— 流花山

  • 1 2020年10月拈花湾

  • 内核缺陷触发的NodePort服务63秒延迟问题
    现象 我们有一个新创建的TKE 1.3.0集群,使用基于Galaxy + Flannel(VXLAN模式)的容 ...
  • Galaxy学习笔记
    简介 Galaxy是TKEStack的一个网络组件,支持为TKE集群提供Overlay/Underlay容器网 ...
TOPLINKS
  • Zitahli's blue 91 people like this
  • 梦中的婚礼 64 people like this
  • 汪静好 61 people like this
  • 那年我一岁 36 people like this
  • 为了爱 28 people like this
  • 小绿彩 26 people like this
  • 杨梅坑 6 people like this
  • 亚龙湾之旅 1 people like this
  • 汪昌博 people like this
  • 彩虹姐姐的笑脸 24 people like this
  • 2013年11月香山 10 people like this
  • 2013年7月秦皇岛 6 people like this
  • 2013年6月蓟县盘山 5 people like this
  • 2013年2月梅花山 2 people like this
  • 2013年淮阴自贡迎春灯会 3 people like this
  • 2012年镇江金山游 1 people like this
  • 2012年徽杭古道 9 people like this
  • 2011年清明节后扬州行 1 people like this
  • 2008年十一云龙公园 5 people like this
  • 2008年之秋忆 7 people like this
  • 老照片 13 people like this
  • 火一样的六月 16 people like this
  • 发黄的相片 3 people like this
  • Cesium学习笔记 90 people like this
  • IntelliJ IDEA知识集锦 59 people like this
  • 基于Kurento搭建WebRTC服务器 38 people like this
  • Bazel学习笔记 38 people like this
  • PhoneGap学习笔记 32 people like this
  • NaCl学习笔记 32 people like this
  • 使用Oracle Java Mission Control监控JVM运行状态 29 people like this
  • 基于Calico的CNI 27 people like this
  • Ceph学习笔记 27 people like this
  • Three.js学习笔记 24 people like this
Tag Cloud
ActiveMQ AspectJ CDT Ceph Chrome CNI Command Cordova Coroutine CXF Cygwin DNS Docker eBPF Eclipse ExtJS F7 FAQ Groovy Hibernate HTTP IntelliJ IO编程 IPVS JacksonJSON JMS JSON JVM K8S kernel LB libvirt Linux知识 Linux编程 LOG Maven MinGW Mock Monitoring Multimedia MVC MySQL netfs Netty Nginx NIO Node.js NoSQL Oracle PDT PHP Redis RPC Scheduler ServiceMesh SNMP Spring SSL svn Tomcat TSDB Ubuntu WebGL WebRTC WebService WebSocket wxWidgets XDebug XML XPath XRM ZooKeeper 亚龙湾 单元测试 学习笔记 实时处理 并发编程 彩姐 性能剖析 性能调优 文本处理 新特性 架构模式 系统编程 网络编程 视频监控 设计模式 远程调试 配置文件 齐塔莉
Recent Comments
  • qg on Istio中的透明代理问题
  • heao on 基于本地gRPC的Go插件系统
  • 黄豆豆 on Ginkgo学习笔记
  • cloud on OpenStack学习笔记
  • 5dragoncon on Cilium学习笔记
  • Archeb on 重温iptables
  • C/C++编程:WebSocketpp(Linux + Clion + boostAsio) – 源码巴士 on 基于C/C++的WebSocket库
  • jerbin on eBPF学习笔记
  • point on Istio中的透明代理问题
  • G on Istio中的透明代理问题
  • 绿色记忆:Go语言单元测试和仿冒 on Ginkgo学习笔记
  • point on Istio中的透明代理问题
  • 【Maven】maven插件开发实战 – IT汇 on Maven插件开发
  • chenlx on eBPF学习笔记
  • Alex on eBPF学习笔记
  • CFC4N on eBPF学习笔记
  • 李运田 on 念爷爷
  • yongman on 记录一次KeyDB缓慢的定位过程
  • Alex on Istio中的透明代理问题
  • will on Istio中的透明代理问题
  • will on Istio中的透明代理问题
  • haolipeng on 基于本地gRPC的Go插件系统
  • 吴杰 on 基于C/C++的WebSocket库
©2005-2025 Gmem.cc | Powered by WordPress | 京ICP备18007345号-2