| 快捷键 | 用途 |
| ctrl + z |
暂停当前程序,回到shell,注意当前任务不会被终止,只是被挂起(在jobs命令的输出中显示为Stopped)。 注意:挂起的任务不再参与进程调度,要让一个任务在后台持续运行,可以使用 & 后缀调用一个任务的命令行,或者在挂起后对其作业号运行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 | 向后删除一个单词 |
#下面的命令将在后台运行 ./command.sh & #下面的命令将不挂掉的在后台运行,标准输出被重定向到nohup.out,即使当前终端退出任然继续运行 #nohup命令可以忽略所有挂断(SIGHUP)信号 nohup ./command.sh & #忽略标准输出、错误。 0 1 2 分别表示标准输入、输出、错误,2>&1表示把标准错误重定向到标准输出,而前者已经重定向到空设备 nohup ./command > /dev/null 2>&1 &
# 列出当前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 -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 |
拷贝文件到目标文件,或者拷贝若干文件到目录 选项: 举例: 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 |
文件移动命令,移动文件的位置,移动多个文件到目录中,或者将目录重命名 该命令的行为:
进程打开文件后,系统会返回文件描述符给它。不管何种情况下,mv都不会导致这些已经打开的文件描述符失效。也就是mv不影响已经打开文件的进程使用文件 格式: 选项: 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 |
删除文件或者目录。默认情况下,该命令不会执行目录删除 格式: 选项: 举例: 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 |
删除空目录 格式: 选项: 举例: 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 |
创建目录或者目录树 格式: 选项: 举例: cd ~/Test mkdir -m 777 tmp #创建一个权限大开的目录 #在Ubuntu14上,新创建的目录权限为775 mkdir -p dir/sub #自动创建缺少的父目录 |
| chmod | 修改文件权限,参见:Linux文件和权限 |
| namei |
显示指定路径上,所有节点的权限: 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文件系统上的文件属性 格式: 选项: 模式: mode:+-=效果类似于chmod,后面可以附加以下标记位: a:文件只能被附加内容 举例: cd ~/Test touch file.tar.gz #添加一个压缩属性 chattr +c file.tar.gz #lsattr显示: #--------c----e-- ./file.tar.gz |
| lsattr |
列出Linux文件系统上文件的属性 格式: 选项: 举例: cd ~ ls Test #列出Test下文件的属性 #输出--------c----e-- Test/file.tar.gz ls -d Test #列出目录Test本身的属性 #输出-------------e-- Test |
| ln |
创建文件链接,TARGET为已经存在的被链接的文件 格式: 选项: 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 ~/ -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 * #仅显示类型,不显示名称 file --brief 1.txt #显示文件的MIME类型 file --mime 1.txt |
| 命令 | 说明 |
| date |
打印日期和时间到 stdout 格式: 选项: 日期时间格式: 举例:
#注意格式的+号 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 |
查看特定时区的当前时间 举例: #显示中国标准时间 zdump PRC |
| time |
输出统计出来的命令执行的时间 举例: time ls > /dev/null #输出内容: #real 0m0.002s 真实世界的时间 #user 0m0.001s 用户态时间 #sys 0m0.002s 内核态时间 |
| cal | 从 stdout 中输出一个格式比较整齐的日历 |
| sleep | 指定需要暂停的秒数并休眠当前进程 |
| usleep | Microsleep 睡眠微秒 |
| 命令 | 说明 |
| xargs |
从标准输入解析并执行命令行 xargs从标准输入读取数据,使用空白符或者换行符分隔成多个条目(标准输入的空白行被忽略),并执行命令 格式: 选项: 退出状态: 举例: #查找目录/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 |
在修改的环境下(即一系列修改后的环境变量)运行一个程序 格式: 选项: |
| printenv | 显示出所有的环境变量 |
| which | 给出命令的完整路径 |
| locate |
给出指定文件的完整位置,示例: locate nginx.conf # /usr/conf/nginx.conf |
| whereis | 给出命令的完整路径、man页的完整路径 |
| chroot | 改变根目录来运行某个命令 |
| pivot_root |
改变根文件系统,将当前进程的根文件系统移动到其它目录,并将另外一个目录作为新的根文件系统 格式: pivot_root new_root put_old 示例: cd new_root pivot_root . put_old exec chroot . command 需要注意,chroot必须在新、旧根目录都可用。pivot_root可能不会自动为当前Shell chroot |
| man |
查看系统手册,可以查看陈故乡、工具、编程函数等各类对象的手册。 格式: man [section] page # 示例 man 2 clone 手册是分为多个段(Section)的,各个段中可以具有名字相同的page。当你在网络上看到namespaces(7)这样的Man Page链接时,就知道目标是在段7的namespaces页面。 段的定义如下:
|
| 命令 | 说明 |
| at | 作业控制命令, 用来在指定时间执行给定的命令集合 |
| crontab |
维护某个用户的CRON守护程序列表。 格式: 选项: 桌面应用支持: 守护程序脚本中需要添加:export DISPLAY=:0.0 模拟执行: 如果你的脚本在命令行中运行正常,但是在crontab中不能运行,可能是两种环境下的环境变量有差异。参考下面的方法立即模拟crontab的执行: 首先导出crontab的环境变量: * * * * * /usr/bin/env > /root/cron-env 然后模拟执行: /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 高亮显示两次运行的结果变化 示例: # 持续监控软中断 watch -d -n 1 'cat /proc/softirqs' |
| fg | 将后台中的命令调至前台继续运行。如果后台中有多个命令,可以用 fg %jobnumber将选中的作业调到前台 |
| bg | 将作业调度到后台执行,如果有多个后台作业处于暂停(ctrl + z将导致暂停)状态,可以用bg %jobnumber将选中的作业调度执行 |
| 命令 | 说明 |
| sort |
将文件的每一行作为一个单位,按ASCII顺序进行比较,并按升序输出 格式: 选项: 举例: #使用第二列排序,分隔符为冒号 sort -n -k 2 -t : readme.txt |
| cat,tac |
输出文件的完整内容 tac从文件的结尾列出文件 |
| tee |
读取标准输入,并将内容输出到文件和标准输出 格式:tee [OPTION]... [FILE]... 选项: -a, --append 附加内容到输出文件尾部,而不是覆盖它的内容 |
| more, less |
分页显示文本文件或stdout more命令逐页的显示文本的内容,它在启动时读取整个文件的全部内容,按Space键可以向后翻页 less更加强大,它和more一样支持份也显示,但是支持PageUp、PageDown进行前后翻页,并且支持搜索。在提示符(:)后输入:
|
| rev | 把每一行中的内容反转,并且输出到 stdout 上 |
| uniq |
过滤器,将会删除一个已排序文件中的重复行.这个命令经常出现在 sort 命令的管道后 选项: -c 在输出行前面加上每行在输入文件中出现的次数 举例 #输出3文件的内容,排序、去重、输出到final.list cat list-1 list-2 list-3 | sort | uniq > final.list |
| expand, unexpand | expand 将会把每个tab 转化为一个空格;unexpand功能相反 |
| dos2unix | 转换换行符的格式 |
| cut |
从文件中提取特定字段(列) 选项: 举例: #按空格分隔字段,提取第1、3、11、12个字段 uname -a | cut -d" " -f1,3,11,12 |
| paste | 将多个文件,以每个文件一列的形式合并到一个文件 |
| join |
能够操作2个文件,它可以将那些具有特定标记域的行合并起来,并且将结果输出到stdout |
| head | 将一个文件的头( 默认为10 行)打印到 stdout 上 |
| tail |
将一个文件的尾( 默认为10 行)打印到 stdout 上 选项: -f 继续显示添加到文件中的行 |
| grep |
使用正则表达式的多用途文本搜索工具 格式: 选项: -e PATTERN, --regexp=PATTERN 指定匹配的PATTERN -c, --count 取消正常输出,仅显示输入文件中匹配的行总数 -b, --byte-offset 在每行前打印基于文件的行首的偏移量,如果指定-o则打印匹配部分的偏移量 -a, --text 将二进制文件作为文本处理 --line-buffered 使用输出缓冲 上下文行控制: -A NUM, --after-context=NUM 打印匹配行后面的NUM行 举例: 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 举例: # 搜索,并且仅仅输出匹配的部分 echo 1.1.1 | egrep -oh '[0-9]+.[0-9]+.[0-9]+' |
| wc |
可以统计文件或 I/O 流中的单词数量 选项: |
| tr |
读取标准输入,转换或者删除字符,并打印到标准输出 格式: 选项: 举例: #把花括号替换为圆括号
tr '{}' '()'
#删除全部空格
tr -d ' '
#把小写转换为大写
tr 'a-z' 'A-Z'
#使用问号替换所有显示字符,*表示让SET2长度自动扩充到与SET1一致
tr -c '[:print:][:cntrl:]' '[?*]'
#使用#代替空白符,连续出现的空白符被合并为1个
tr -s '[:space:]' '[#*]'
|
| fold | 将输入按照指定宽度进行折行 |
| fmt | 简单的文件格式化器,通常用在管道中,将一个比较长的文本行输出进行折行 |
| col | 来滤除标准输入的反向换行符号 |
| column |
将“列类型”的文本转化为“易于打印”的表格式进行输出 可以用来按列对齐,例如: sudo iptables -L -nv -t filter | column -t -s " " |
| colrm | 列删除过滤器。 这个工具将会从文件中删除指定的列并且写到文件中 |
| nl | 计算行号过滤器,在输出中添加前缀的行号 |
| pr | 格式化打印过滤器. 这个命令会将文件(或stdout)分页 |
| gettext | 将程序的输出翻译或者本地化为不同国家语言 |
| iconv | 将文件转化为不同编码格式(字符集) |
| strings | 在二进制或数据文件中找出可打印字符 |
| diff |
以一行接一行的形式来比较目标文件 格式: 参数: 退出码: |
| jq |
命令行JSON处理器,能够选取、迭代、reduce、修改JSON文档 格式:jq [options...] filter [files...] 选项: --seq 使用MIME类型application/json-seq来分隔jq输入输出的JSON文档,这意味着JSON记录前后分别有ASCII字符RS、LF。无法解析的输入JSON被忽略,同时忽略所有后续输入,直到RS出现 过滤器: 每个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]} 内置操作符和函数: + 数字加、数组连接、字符串连接 格式化和转义: @text 调用tostring |
AWK编程语言的GNU实现。
# 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 ...
# 读取文件的第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直接被修改,返回值是替换的子串数量 示例: 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) |
| systime() | 返回UNIX纪元到现在的秒数 |
| 其它函数 | |
| close(expr) |
关闭由print、printf、getline打开的文件或管道,关闭成功返回0 如果打算写一个文件,并稍后在同一个程序中读取文件,则 close 语句是必需的 |
| system(cmd) |
执行cmd参数给出的系统命令,返回退出状态。示例: jcmd -l | awk '{system("ps --no-headers -p "$1 " -o command " ) }'
|
| getline |
逐行读取外部文件的内容。示例: { while( "cat /etc/passwd" | getline ){ print $0; }; close("/etc/passwd"); }
# 或者 getline < "/etc/passwd"
|
| exit | 提前结束处理,不再处理后续的记录。如果awk位于管道中间,后续命令获得处理机会 |
Awk程序通常是读取一个个记录(默认每行是一个记录),并寻找到其中匹配pattern的行,执行指定的动作:
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的那两个首尾行。
你可以对记录中的字段,进行各种运算:
{ print $1, $2 * $3 }
$2 * $3 > 50 { printf("$%.2f for %s\n", $2 * $3, $1) }
pattern可以通过逻辑操作符进行组合,包括:&&、||和!,支持使用括号:
!($2 < 4 && $3 < 20)
字符串拼接语法 —— 直接连续写多个字符串(或变量)即可,不需要操作符,空格被忽略:
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分支结构:
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循环结构:
while (i <= $3) { i = i + 1 }
for循环结构:
{
for (i = 1; i <= $3; i = i + 1)
printf("\t%.2f\n", $1 * (1 + $2) ^ i)
}
{ line[NR] = $0 } # 记录每个输入行,将其存为数组元素
# 逆序打印
END {
i = NR
while (i > 0) {
print line[i]
i = i - 1
}
}
sed是流式文本编辑器,该命令用于在输入流(文件或者管道输入)上执行基本的文本转换,该命令只会对输入进行一次逐行的顺序的处理,因而效率较高。
sed [OPTION]... {script-only-if-no-other-script} [input-file]...
-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字符来划分行
[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中有/,可以用;代替/
# 替换文本中每行的所有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文件名 格式: 选项: 举例: # 将/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等格式 格式: 子命令: 选项: 举例: #把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 |
跨平台的文件归档和压缩工具 举例: # 从标准输入读取数据并压缩 docker save busybox:1.30.1 | gzip -c > busybox.tar.gz # 解压缩到标准输出 gunzip -c busybox.tar.gz |
| cpio |
从归档文件拷贝出、拷贝到归档文件 拷出模式: 将文件拷贝到归档文件中,从stdin读取一系列文件名(每个一行),然后将归档文件写出到标准输出 拷入模式: 从归档文件拷贝文件,或者列出归档文件的内容 选项: -d 如果必要,创建需要的目录 |
| 命令 | 说明 |
| factor | 分解质因数,空格分隔结果 |
| bc | 支持浮点运算 |
| expr |
通用求值表达式:通过给定的操作(参数必须以空格分开)连接参数进行算术操作、比较操作、字符串操作或者是逻辑操作 举例: expr 5 + 3 a=`expr 5 + 3` #等价于 $((5+3)) |
| seq |
打印一系列连续的数字 格式: # 从1开始,LAST结束 seq [OPTION]... LAST # 从FIRST开始,LAST结束 seq [OPTION]... FIRST LAST # 从FIRST开始,LAST结束,步长INCREMENT seq [OPTION]... FIRST INCREMENT LAST |
| 命令 | 说明 |
| host |
DNS查找工具,用于进行域名和IP地址的双向转换 格式: 选项: 举例: #查询域名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 调试模式 示例: # 通过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缓存 格式: 选项: 举例: #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扫描器 选项: 举例: #通过eth1网卡执行扫描,并显示其中IP地址为192.168.0.232的条目 #该命令可以用于IP查重 sudo arp-scan -I eth1 -l | grep 192.168.0.232 |
| traceroute |
跟踪到目的主机的路由信息 格式: 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]
选项: 举例: 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三种类型的封包 格式: 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指定的次数,然后打印统计信息并退出 |
| ping |
发送因特网控制报文协议(ICMP)的ECHO_REQUEST数据报到网络上的主机 选项: 举例: ping -f blog.gmem.cc |
| whois | 执行DNS注册信息查询 |
| curl |
向服务器传输、从服务器读取数据。支持DICT, FILE, FTP, FTPS, GOPHER, HTTP, HTTPS, IMAP, IMAPS, LDAP, LDAPS, POP3, 格式: curl [options] [URL...] 选项: # 显示进度条 content_type MIME类型 -s 安静模式,不显示进度和错误信息 示例: # 输出响应到控制台
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站点上取得或下载文件 格式: 基本选项: 举例: #下载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 |
显示或修改内核路由表信息 格式: 选项: 举例: #添加一个普通的环回条目,使用子网掩码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 输出: Metric 到目标的“距离”,使用hops计数表示 |
| netcat nc |
通过TCP和UDP在网络中读写数据 示例: # 端口扫描:扫描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命令实例的生命周期分为以下阶段:
格式: socat [options] <address> <address> -d 打印更多信息,指定-d多次,则信息更详细,最多4个 地址规格: 地址类型关键字:[地址参数1:地址参数...][,地址选项1,地址选项2...] 地址类型关键字大小写不敏感,对于某些地址类型,关键字可以省略 如果地址规格以数字开头,则被假设为FD(原始文件描述符)地址,如果在第一个:或,之前出现 /,则假设关键字为GOPEN(一般性文件打开) 地址类型: CREATE:<filename> 以create()打开指定的路径,并使用FD进行写(以create打开的不支持读)操作 示例: # 从文件读取信息 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 |
显示当前网络的统计和信息, 比如网络连接、路由表、网卡统计、组播关系 格式: 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]
子命令描述: 选项: 输出: --- 默认输出 --- 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) Active UNIX domain Sockets --- --route输出 --- 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 目标网络或者主机 --- --groups输出 --- 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 参与组播的网络接口 举例: #列出所有处于监听状态的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 选项: -A 以ASCII形式打印每个包(除去连接层头部) 关于表达式 关于iptables: 对于出站流量来说,tcpdump是最后一个看见流量的软件,也就是说,只要tcpdump看到流量,就说明本机没有软件层次上的防火墙措施。如果iptables DROP掉了包,则tcpdump不会抓到包 iptables ⇨ tcpdump ⇨ 网络接口 ⇨网线 对于入站流量来说,tcpdump是第一个看见流量的软件 网线 ⇨ 网络接口 ⇨ tcpdump ⇨ netfilter/iptables 举例: # 要在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客户端 格式: 描述: 选项: GatewayPorts yes 否则总是绑定到127.0.0.1 -t 强制分配伪终端 端口转发功能: SSH客户端支持三种端口转发(SSH隧道): -L 本机网络接口:本机端口:远程网络接口:远程端口。正向转发,本机可以通过本机端口访问远程服务 注意: PermitRootLogin yes 举例: # 基于公钥认证机制登陆
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密码 执行下面的命令安装此工具: sudo apt-get install sshpass 示例: sshpass -p password ssh root@host |
| scp |
安全拷贝(远程文件拷贝) 格式: 描述: Windows下可以安装WinSSHD以支持SCP。 选项: 举例: # 将远程文件复制到本机当前目录(注意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协议进行通信 选项: 交互式命令: 举例: # 使用公钥认证,连接到交互式客户端 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 |
执行网络探测与端口扫描 格式: 目标选项: 其它选项: 举例: #对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 |
查看或者配置网络接口 描述: 格式: 选项: 举例: #设置eth1的广播地址 ifconfig eth1 broadcast 192.168.0.255 #设置eth0的IP地址 ifconfig eth0 192.168.0.90 #停用eth1 ifconfig eth1 down |
| ip |
显示或者配置路由、网卡、策略路由或者隧道 关于Linux路由的更多知识,参考:Linux网络知识集锦 格式: # 如果不清楚对象支持哪些命令,可以 ip object help
ip [ OPTIONS ] OBJECT { COMMAND | help }
ip [ -force ] -batch filename
选项: 对象: 举例: # 给网络接口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 |
管理路由表 格式: # 列出或刷新选择器匹配的路由
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 ]
路由类型:
示例: # 添加一个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:
每个RPDB条目都包含一些额外的属性,例如每个规则都有向路由表的指针。NAT和masquerading规则包含一个属性,用于选择转换/掩码的IP地址。 RPDB包含以下几种类型的规则:
格式: ip [ OPTIONS ] rule { COMMAND | help }
ip rule [ list | add | del | flush ] SELECTOR ACTION
其中SELECTOR可以是(以下项中的多个):
其中ACTION可以是:
ACTION后面可以跟着SUPPRESSOR:[ suppress_prefixlength NUMBER ] [ suppress_ifgroup GROUP ] 示例: # 添加一个规则,匹配标记为1的封包,到100表中查找 ip rule add fwmark 1 lookup 100 |
| bridge |
显示/操控网桥地址和设备 举例: # 显示所有连接到网桥的网络接口(端口,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] 子命令: 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
示例: # 停止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 |
获取无线网络的详细信息 举例: iwlist wlan1 scan |
| wpa_cli |
WPA命令行客户端 举例: # 查看当前无线网络的详细信息 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时,速度极快 应用场景:
子命令: # 创建具有指定名称、指定类型的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 指定条目的超时 IPSet类型: bitmap:ip 使用一段内存存储IPv4主机或网络地址,最多存储65536个条目 在iptables中使用: 你可以使用匹配扩展set来引用IPSet: 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内核的连接跟踪子系统,例如:
连接跟踪系统在内部,维护两个表:
格式: # 列出 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联用 过滤器参数: -s, --orig-src IP_ADDRESS 最初通信方向的源地址 TCP过滤参数: --sport, --orig-port-src 最初通信方向的源端口 UDP过滤参数: --sport, --orig-port-src 最初通信方向的源端口 ICMP过滤参数: --icmp-type TYPE ICMP类型 示例: # 以 /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更加高级 格式: pen options [host:]port h1[:p1[:maxc1[:hard1[:weight1[:prio1]]]]] [h2[:p2[:maxc2[:hard2[:weight2[:prio2]]]]]] ... 选项: -C 指定控制端口,此端口接收发送给LB的命令 示例: # 监听所有网络接口的18000,转发给目标主机的8000,在前台运行,启动调试日志 pen -fd 0.0.0.0:18000 172.27.170.143:8000 |
| snmp |
snmp包提供了若干命令,它们的格式如下: 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协议的版本 命令举例: #执行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内容并保存到磁盘 安装: sudo add-apt-repository ppa:oreste-notelli/ppa sudo apt-get update sudo apt-get install justniffer 格式: 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 日志格式: %close.originator([not applicable string]) 时间戳格式: 举例: # 嗅探针对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的串口信息。 格式: 选项: |
| ethtool |
查看以太网接口的信息,例如连接速度。示例: ethtool eth0 ethtool eth0 | grep Speed |
| 命令 | 说明 |
| users | 显示所有的登录的用户 |
| last | 显示最近登陆的用户列表 |
| groups | 列出用户(如果不指定用户则默认当前用户)和他所属于的组,例如groups alex |
| id |
显示用户标识符信息,举例: id alex #输出,gid显示了用户的主要组(Primary group),默认主要组和用户名相同 #uid=1000(alex) gid=1000(alex) groups=1000(alex),4(adm),27(sudo) |
| useradd |
创建一个新用户或更新默认新用户信息 格式: 选项: -b 指定基目录,基目录/账户名就是家目录,基目录默认/home |
| userdel |
删除用户 选项: |
| usermod |
修改用户帐号。 可以修改密码、 组身份、 截止日期等。修改后的用户可能需要重新登录才能生效 选项: 示例: # 把alex附加到ssl-cert组 sudo usermod -a -G ssl-cert alex |
| gpasswd |
管理配置文件/etc/group和/etc/gshadow # 从ssl-cert组中删除alex sudo gpasswd -d alex ssl-cert |
| groupmod | 修改指定组 |
| newgrp | 修改当前用户的GID |
| passwd |
设置、修改、或者删除用户的密码。普通用户只能修改自己的密码,root则可以修改任何用户的密码。 格式: 选项: 举例: # 修改root密码 sudo passwd root # 系统会提示输入新密码Enter new UNIX password: |
| who | 显示本系统上的登陆用户 |
| w |
显示哪些人登录了,他们在做什么 格式: w [options] user [...] 示例: # 第一行:当前时间,系统运行时间,登录用户数,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 |
查找或杀死进程 格式: 选项: 退出状态: 举例: #立即杀死所有MySQL和Java进程 sudo pkill -9 '(mysql|java)' #列出MySQL进程的PID和命令行路径 pgrep -a mysql |
| service |
启动或停止一个System V系统服务(/etc/init.d中的脚本)或者Upstart Job(/etc/init中的配置文件) 格式: 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 |
监控进程、程序、文件的状态。可以完成自动重启 |
| chkconfig |
新近的Ubuntu版本已经不支持该命令,使用update-rc.d命令代替之 显示和管理在启动过程中所开启的服务,该命令提供简单的方式管理/etc/rc[0-6].d目录中的符号链接 格式: 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 选项: |
| sysv-rc-conf |
提供图形界面来管理System V风格的启动脚本: sudo apt-get install sysv-rc-conf sudo sysv-rc-conf |
| update-rc.d |
安装或者移除System V风格的初始化脚本的符号链接 格式: 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 ] 选项: |
| initctl |
管理Upstart任务,通过此命令管理员可以与基于Upstart的init进程交互。某些发行版中,此命令可以和service替换使用,例如initctl start srv 效果等同于service srv start 格式: initctl [OPTION]... COMMAND [OPTION]... ARG... 子命令: |
| systemctl |
控制和管理基于Systemd的服务,以及Systemd init机制本身。 格式: # NAME 服务的名称,必须是unitName.unitType,例如mysql.service # 如果unitType为service,则.unitType部分可以省略 systemctl [OPTIONS...] COMMAND [NAME...] 子命令: 示例: # 列出所有正在运行的单元 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。如果:
所有用户被授权访问自己私有的日志。默认的仅仅root和systemd-journal组的用户能够访问系统日志、其它用户的日志 格式:journalctl [OPTIONS...] [MATCHES...] 选项: 示例: # 显示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 |
分析系统的启动耗时 示例: # 查看启动耗时的概要信息
systemd-analyze
# 查看每个服务的启动耗时信息,按照耗时从高到低排列
systemd-analyze blame
|
| hostnamectl |
查看或者设置主机名信息 示例: # 设置主机名 sudo hostnamectl set-hostname |
| localectl |
进行本地化配置 示例: # 设置语言和编码方式 sudo localectl set-locale LANG=en_GB.utf8 # 设置键盘映射方式 sudo localectl set-keymap en_GB |
| timedatectl |
时区、日期、时间设置 示例: # 列出所有可用时区 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 |
时钟同步命令 示例: # 查看 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 |
查看当前登录的用户或会话 示例: # 显示登录的会话 loginctl list-sessions # 显示登录的用户 loginctl list-users |
| su |
改变用户身份,以另外一个账户登录,如果不加参数,则改变为root 格式: |
| sudo |
以root或其他用户身份来执行一个命令。只能应用于程序,不能应用于Bash内置命令,例如:sudo cd /var/lib/mysql不会达到预期效果。 格式: 选项: 举例: # 以root身份执行命令,不永久提升 sudo ls /dev # 永久提升当前用户为root,不执行命令 sudo -i exit #需要退出root的登陆才能返回当前用户 |
| mount |
挂载一个文件系统, 通常都用来安装外部设备, 比如软盘或CDROM。Unix系统中所有可访问的文件,都组织在单棵树中,这棵树的根叫做 / 。树中的文件可以分布在多个设备上。mount命令的职责就是将设备附到文件系统树的某个节点上。 大部分设备都由特殊的设备文件来代表。例外情况如NFS,它由gmem.cc:/dir这样的URI表示。引用设备文件时,也可以使用LABEL或UUID。 注意:
绑定挂载 从内核2.4开始,允许将文件系统树的某一部分,重新挂载到另外一个位置: mount --bind olddir newdir 在fstab中,进行绑定挂载的格式是:/olddir /newdir none bind 执行绑定挂载后,olddir的内容可以在newdir处访问,它们一模一样。 绑定挂载也可以用来挂载单个文件。 默认情况下,绑定挂载不会处理子挂载,也就是说,/olddir的某个子目录被作为挂载点的情况,其内容无法体现在/newdir中,要解决此问题,可以使用: mount --rbind olddir newdir 移动操作 从2.5.1开始,支持将一个挂载的子树移动到另外一个位置: mount --move olddir newdir 注意olddir必须是一个挂载点 共享子树 从2.6.15开始,可以将挂载、及其子挂载标记为shared, private, slave 或 unbindable。可以在容器技术中使用: mount --make-shared mountpoint 格式: 选项: -a --all 挂载所有fstab中包括的所有文件系统 举例: #把第一块硬盘的第3个分区挂载为/kssi mount /dev/hda3 /kssi #挂载一个iso镜像文件 mount -o loop /home/alex/unbunt-14.02.iso /mnt/cdrom |
| umount |
卸载一个当前已经 mount 的文件系统 举例: #根据设备路径卸载 umount /dev/hda3 #根据挂载目录卸载 umount /kssi |
| getconf |
查询系统配置变量 格式: 选项: 举例: #获取内存页的大小 getconf PAGESIZE |
| mkswap | 创建一个交换分区或文件,随后必须马上使用swapon来启用 |
| swapon | 启用/禁用交换分区或文件,通常在启动和关机的时候才有效 |
| swapoff | |
| mke2fs | 创建ext2文件系统 |
| tune2fs | 调整ext2文件系统。 可以用来修改文件系统参数 |
| dumpe2fs | 打印非常详细的文件系统信息 |
| tune2fs |
显示或调整ext2/ext3/ext4文件系统的参数 举例: #查看硬盘分区的块大小 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,存储内核镜像、一部分启动时需要的辅助文件 格式: fdisk [-uc] [-b sectorsize] [-C cyls] [-H heads] [-S sects] device fdisk -l [-u] [device...] fdisk -s partition... 选项: -b sectorsize 指定磁盘的扇区大小 示例 - 在线修改分区表: # 这个例子中,我们希望扩展根分区的大小
# 目标机器是一台虚拟机,我们首先扩展了它的磁盘尺寸
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:显示目前资源限制的设定 |
| lsmod | 列出所有安装的内核模块 |
| insmod | 强制一个内核模块的安装 |
| rmmod | 强制卸载一个内核模块 |
| modinfo | 输出一个可装载的内核模块的信息 |
| modprobe |
从Linux内核中添加或者删除模块。该命令智能的进行模块的安装/卸载,为了便利,不区分模块名字中的-和_。该命令会查找/lib/modules/`uname -r` 目录,找到所有模块和相关文件 格式: 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] 选项: 注意,重启后效果消失。要永久修改内核模块加载,使用/etc/modules文件 |
| sync | 强制写入所有需要更新的 buffer 上的数据到硬盘上 |
| ldd | 显示一个可执行文件的共享库的依赖关系 |
| rsync |
可以在多台主机之间进行文件同步 格式: # 本地同步 rsync [OPTION...] SRC... [DEST] # 远程同步 rsync [OPTION...] [USER@]HOST:SRC... [DEST] # PULL rsync [OPTION...] SRC... [USER@]HOST:DEST # PUSH 选项: -a 归档模式,等价于-rlptgoD 示例: # 使用密钥登陆到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 格式: 选项: |
| logrotate | 管理系统的日志文件。可以在合适的时候轮换、压缩、删除 |
| strip | 从可执行文件中去掉调试符号引用。这样做可以减小尺寸, 但是就不能调试了 |
| lscpu |
打印CPU架构相关信息,示例: # 显示CPU当前的时钟频率 lscpu | grep MHz |
| lshw | 打印硬件信息 |
| dmidecode |
解码DMI(即SMBIOS,System Management BIOS)信息为人类可读的格式。DMI表包含了系统硬件信息,包括序列号、BIOS版本 信息依据DMI类型分段输出到屏幕上 |
| sysctl |
在运行时配置内核参数,这些内核参数位于/proc/sys/ 格式: 选项: 举例: sysctl -a sysctl -n kernel.hostname sysctl -w kernel.domainname="example.com" |
| dpkg-reconfigure |
重新配置一个已经安装的包,举例: # 重新配置数字证书,可以禁用某些证书 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 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),举例: 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协议的扩展,为屏幕根窗口提供改变大小、旋转、反射效果的能力,同时支持设置刷新率,举例: # 查询当前连接到的显示器,显示分辨率和刷新率等信息 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 |
转换并拷贝文件,该命令根据参数转换数据的格式,并且把输入文件写出到输出文件中 参数: CONVS符号: FLAG符号: 举例: # 导出整个磁盘为镜像文件,注意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 # 写swap分区 sudo dd if=/dev/zero of=/swapfile bs=1M count=1024 |
| cpufreq-info |
检索cpufreq内核信息 选项: 示例: cpufreq-info -p # 800000 2901000 userspace cpufreq-info -g # conservative ondemand userspace powersave performance |
| cpufreq-set |
修改CPU频率设置的小工具 选项: 注意:设置在重启后丢失,要持久化,可以修改/etc/init.d/cpufrequtils 脚本 示例: # 设置为最大性能 sudo cpufreq-set -g performance # 设置为省电模式 sudo cpufreq-set -g powersave # 设置0号CPU的频率 sudo cpufreq-set -f 2901000 |
| nsenter |
在其它进程的命名空间中,执行程序。可进入的命名空间包括:mount、UTS、IPC、network、PID、user。 格式: # 如果不指定program,则运行${SHELL},默认/bin/sh
nsenter [options] [program [arguments]]
选项: -t 进入哪个PID的命名空间 |
| unshare |
运行应用程序,且不共享父进程的某些命名空间。 格式: unshare [options] program [arguments] 选项: -m 取消共享mount命名空间 |
| 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: 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 |
|_ _ _ _ _ _ _ _ _ _ _ _ |_ _ _ _ _ _ _ _ _ _ _ _ _ _ |_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _|
命令: # 列出可作为物理卷的设备 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的用户空间工具,可以实现低级别的逻辑卷管理 格式: # 为指定的设备销毁非活动表槽(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]
示例: # 创建空白文件 # 声明大小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 |
使用列表的形式显示文件系统的使用状况 格式: 选项: 输出: 举例: 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 |
估算磁盘使用状况。该命令会递归的统计目录下每个文件的磁盘占用情况 格式: 选项: 举例: #显示最大的文件或目录 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 |
列出打开的文件 格式: 选项: 输出: 举例: #查看占用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 |
找出使用文件或者套接字的进程 格式: 选项: 举例: #杀死所有访问/home文件系统的进程 fuser -km /home #查看使用631端口的进程 fuser -v 631/tcp |
| dstat |
收集系统资源统计信息的综合性工具 格式: 选项/输出: -c --cpu 启用CPU统计: -C 0,3,total 包含CPU0、CPU3和总计的CPU使用情况
-d --disk 启用磁盘使用情况统计,单位字节 -D total,xvda 包含总计、xvda磁盘使用情况
-g, --page 启用换页统计情况
-i --int 启用中断次数的统计
-l --load 启用平均负载统计 当单CPU的负载达到0.7,需要警惕;持续大于1.0,需要尽快找到原因并降下来;大于5.0意味着系统问题严重,接近死机 在单CPU系统中,平均负载1.73 0.60 7.98意味着:
-m --mem 启用内存统计
-n --net 启用网络统计,单位字节 -N eth0,total 包含eth0、总计的网络统计
-p --proc 启用进程统计
-r, --io 启用I/O请求统计,针对所有块设备的IO请求次数
-s, --swap -S swap1,total 包含swap1、总计的交换分区统计
-t, --time 输出系统时间 -T, --epoch 输出1970到现在的秒数
-y, --sys 启用系统统计
--aio 启用异步I/O统计
--fs 启用文件系统统计
--ipc 启用进程间通信统计
--lock 启用文件锁定统计
-raw 启用原始套接字统计 --socket 启用套接字统计 --tcp 启用TCP统计 --udp 启用UDP统计enable udp stats (listen, active) --unix 启用UNIX套接字统计
--list 列出内部外部插件的名称 delay 刷新延迟,默认1秒 示例: # 各项系统指标,每分钟显示新行 dstat -tlcmsgdrnpy 60 # 网络相关指标 dstat -tn --socket --tcp --udp --unix 60 |
| vmstat |
显示虚拟内存的统计信息 注意:统计按块为单位,GNU/Linux一般为1024字节 |
| pidstat |
报告进程(任务)的统计信息 格式:pidstat options interval count 选项: -C comm,仅仅显示其命令行包含指定字样的任务的统计信息 |
| free | 显示系统的空闲内存 |
| iotop |
显示磁盘使用最高的进程,动态刷新 输出列包括在采样周期内:每个进程/线程读写所占用的带宽、每个线程在等待换页、等待IO所消耗的时间百分比(相对于自己的总时间,因此可能有多个进程同时高达99%),每个进程的IO优先级(类型/级别)也会显示 同时输出的还包括统计信息: 总磁盘读写,进程/内核线程与内核块设备子系统之间的总计带宽 由于IO重排序、缓存的存在,实际磁盘读写、总磁盘读写会不一样 快捷键:Left Right切换排序方式、r倒序显示、p切换进程/线程模式、o仅仅显示实际正在IO的进程、i调整IO优先级(ionice) |
| iostat |
显示输入输出统计信息。该命令的数据源是/proc/diskstats: 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之外,都从系统启动以来一直累加:
更多信息参考:http://linuxperf.com/?p=156 选项: -c 显示CPU利用情况报告 输出: 示例: # 每秒刷新 iostat -xd 1 # 显示磁盘SDC的TPS、每秒读写KB数 iostat 1 -d -h -y -k -p sdc |
| top |
显示CPU占用最高的进程,动态刷新 命令: d 刷新延迟 H 显示线程 B 粗体显示 z 彩色显示 选项: -PN1,N2... 仅仅显示指定进程 输出: CPU状态:us非niced用户进程耗时,sy内核进程耗时,ni被niced用户进程耗时,id空闲的时间,wa等待IO操作完成消耗的时间,hi处理硬件中断的时间,si处理软件中断的时间,st当前vm被hypervisor偷去的时间 wa应该在绝大部分时间内都是0,它表示CPU花在等待IO的时间,如果长时间超过1%提示磁盘IO性能不足 其它: 关于系统负载(load average):
|
| mpstat |
报告CPU相关的统计信息 格式: mpstat [ -A ] [ -u ] [ -V ] [ -I { keyword [,...] | ALL } ] [ -P { cpu [,...] | ON | ALL } ] [ interval [ count ] ] 选项: -A 等价于 -u -I ALL -P ALL 输出: CPU CPU序号,all表示所有CPU的均值 注意:
|
| atop |
交互式的系统负载监视器,它能够直观的监控最重要的系统硬件资源的使用情况,还能显示哪些进程应该为高资源占用负责 注意:
程序界面每10秒 |
| htop |
显示CPU占用最高的进程,动态刷新,比top提供更多的信息 状态条: CPU:蓝色代表低优先级线程;绿色代表正常优先级线程;红色代表内核线程 MEM:绿色代表已使用内存页;蓝色代表缓冲(Buffer)页;黄色代表缓存(Cache)页 Load average:包含3个,分别为最近1/5/15分钟的平均负载。所谓负载使用浮点数表示,如果服务器具有4个核心,那么负载达到4.00相当于满载,如果负载达到20.00意味着严重超载,进程等待CPU时间将过长 选项: 输出: PROCESSOR (CPU) 进程最后在哪个CPU执行 |
| ps |
报告一个当前进程的状态快照 格式: 选项: 输出格式控制: 自定义格式: %cpu CPU用量 示例: # 显示完整的命令行
ps -ef # 标准语法
ps aux # BSD语法
# 显示所有JVM的命令行
jcmd -l | awk '{system("ps --no-headers -p "$1 " -o command " ) }'
|
| pstree |
显示进程树 格式: 选项: -a 显示命令行参数 示例: # 显示以进程24741为根节点的子树 pstree -an -p 24741 |
| exportfs |
修改了NFS导出配置后,使用该命令生效: # 执行导出 exportfs -ar # 查看导出 exportfs -v 导出配置示例: /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 |
显示网络使用最高的套接字,动态刷新 格式: 选项: 输出: #按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
示例: iftop -nNBPi eth0 |
| dmesg | 打印内核诊断信息,或者操控内核ring buffer |
| uptime | 显示已经系统运行的时间 |
| sysbench |
一个跨平台、多线程、模块化的性能测试工具。可以测试:文件I/O性能、内存分配和传输速率、POSIX线程性能、数据库服务器性能等方面的内容 命令格式: sysbench [common-options] --test=name [test-options] command 通用选项: --num-threads 工作线程总数,默认1 测试模式: cpu 通过寻找质数,来测试CPU性能 举例: # 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的工具,用来对硬件进行压力测试和验证 安装: wget https://codeload.github.com/axboe/fio/zip/master unzip master rm -rf master cd fio-master/ ./configure make && make install 格式:fio [options] [jobfile]... 示例: 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 |
网络吞吐量测试工具 格式: # 服务器 iperf3 -s [ options ] # 客户端 iperf3 -c server [ options ] 示例: # 启动一个服务器 iperf3 -s # 连接到服务器进行网速测试 iperf3 -c 10.0.1.1 |
| sysdig | 参考使用Sysdig进行系统性能分析 |
| 命令 | 说明 |
| pkg-config | |
| ldconfig | |
| ldd | |
| objdump | |
| gcc | |
| gdb | |
| gdbserver | |
| adb | 参见Android知识集锦 |
| keytool | 参见Android知识集锦 |
| jarsigner | 参见Android知识集锦 |
| apktool | 参见Android知识集锦 |
| dex2jar | 参见Android知识集锦 |
| cmake | 参见CMake学习笔记 |
| readelf |
| 命令 | 说明 |
| 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) 每个链接组必然处于两种状态之一:
每个备选都具有优先级(priority),在自动模式下,链接组成员将指向最高优先级的备选 命令格式 # 安装一组备选到系统中
# 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
|
| 命令 | 说明 |
| jps | 显示指定系统内所有的HotSpot虚拟机进程 |
| jstat | 用干收集HotSpot虚拟机各方面的运行数据 |
| jinfo | 实时地査看和调整虚拟机的各项参数 |
| jmap | 生成虚拟机的内存转储快照 |
| jhat | 分析 heapdump 文件 |
| jstack | 显示虚拟机的线程快照 |
| jcmd | 1.7引入的通用命令行工具 |
Leave a Reply to G Cancel reply