技能篇:开发必备linux命令大全-稳赚不亏(下)
6 网络数据抓取
tcpdump
- tcpdump 是一个运行在命令行下的抓包工具。它允许用户拦截和显示发送或收到过网络连接到该计算机的TCP/IP和其他数据包。tcpdump 适用于大多数的类Unix系统操作系统;tcpdump 命令格式为:
# tcpdump [ -adeflnNOpqStvx ] [ -c 数量 ] [ -F 文件名 ]
[ -i 网络接口 ] [ -r 文件名] [ -s len ]
[ -T 类型 ] [ -w 文件名 ] [ 表达式 ]
选项参数
-a 将网络地址和广播地址转变成名字
-d 将匹配信息包的代码以人们能够理解的汇编格式给出
-dd 将匹配信息包的代码以c语言程序段的格式给出
-ddd 将匹配信息包的代码以十进制的形式给出
-e 在输出行打印出数据链路层的头部信息,包括源mac和目的mac,以及网络层的协议
-f 将外部的Internet地址以数字的形式打印出来
-l 使标准输出变为缓冲行形式
-n 指定将每个监听到数据包中的域名转换成IP地址后显示,不把网络地址转换成名字
-nn: 指定将每个监听到的数据包中的域名转换成IP、端口从应用名称转换成端口号后显示
-t 在输出的每一行不打印时间戳
-v 输出一个稍微详细的信息,例如在ip包中可以包括ttl和服务类型的信息
-vv 输出详细的报文信息
-c 在收到指定的包的数目后,tcpdump就会停止
-F 从指定的文件中读取表达式,忽略其它的表达式
-i 指定监听的网络接口
-p: 将网卡设置为非混杂模式,不能与host或broadcast一起使用
-r 从指定的文件中读取包(这些包一般通过-w选项产生)
-w 直接将包写入文件中,并不分析和打印出来
-s len len 表示从一个包中截取的字节数。0表示包不截断,抓完整的数据包。默认的话 tcpdump 只显示部分数据包,默认68字节
-T 将监听到的包直接解释为指定的类型的报文,常见的类型有rpc (远程过程调用)和snmp(简单网络管理协议)
-X 告诉tcpdump命令,需要把协议头和包内容都原原本本的显示出来(tcpdump会以16进制和ASCII的形式显示),这在进行协议分析时是绝对的利器。
- 「表达式选项」 大体可以分成三种过滤条件,“类型”、“方向”和“协议”,这三种条件的搭配组合就构成了我们的过滤表达式
○ 「类型关键字」:主要包括host,net,port, 例如 host 210.45.114.211,指定主机 210.45.114.211,net 210.11.0.0 指明210.11.0.0是一个网络地址,port 21 指明端口号是21
○ 「传输方向的关键字」:主要包括src , dst ,dst or src, dst and src ,这些关键字指明了传输的方向。举例说明,src 210.45.114.211 ,指明ip包中源地址是210.45.114.211, dst net 210.11.0.0 指明目的网络地址是210.11.0.0
○ 「协议的关键字」:主要包括 ether,ip,ip6,arp,rarp,tcp,udp等类型,及这几个的包的协议内容。如果没有指定任何协议,则tcpdump将会监听所有协议的(更具体的请自行查看官方文档)
第一行:“tcpdump: verbose output suppressed, use -v or -vv for fullprotocol decode”;提示使用选项 -v 和 -vv,可以看到更全的输出内容
第二行“listening on eth0, link-type EN10MB (Ethernet), capture size 65535bytes”;我们监听的是通过 eth0 这个NIC设备的网络包,且它的链路层是基于以太网的,要抓的包大小限制是65535字节。包大小限制值可以通过-s选项来设置
第三行”12:40:33.569037 00:19:e0:b5:10:94 > 00:1a:a0:31:39:d4, ethertypeIPv4 (0x0800),”12:40:33.569037 分别对应着这个包被抓到的“时”、“分”、“秒”、“微妙”。00:19:e0:b5:10:94 > 00:1a:a0:31:39:d4 表示MAC地址 00:19:e0:b5:10:94 发送到MAC地址为 00:1a:a0:31:39:d4 的主机,ethertype IPv4 (0x0800)表示Ethernet帧的协议类型为ipv4(即代码为0x0800)
第四行”length 66: 210.45.123.249.27236 > 172.16.0.11.1111: Flags [S],seq 1624463808;length 66表示以太帧长度为66。210.45.123.249.27236 表示这个包的源IP为210.45.123.249,源端口为27236,’>’表示数据包的传输方向, 172.16.0.11.1111, 表示这个数据包的目的端ip为172.16.0.11,目标端口为1111,1111端口是我的一个web服务器监听端口。Flags是[S],表明是syn建立连接包(即三次握手的第一次握手),seq1624463808 序号为1624463808,这个其实就是TCP三次握手的第一次握手:client(210.45.123.249)发送syn请求建立连接包
第五行” win 8192, options [mss 1460,nop,wscale 2,nop,nop,sackOK], length 0”win 8192 表示窗口大小为8192字节。options[mss 1460,nop,wscale 2,nop,nop,sackOK]为tcp首部可选字段mss 1460表示mss是发送端(客户端)通告的最大报文段长度,发送端将不接收超过这个长度的TCP报文段(这个值和MTU有一定关系)。nop是一个空操作选项, wscale指出发送端使用的窗口扩大因子为2, sackOK 表示发送端支持并同意使用SACK选
- tcpdump 示例
~~ 只查目标机器端口是21或80的网络包,其他端口不关注
# tcpdump -i eth0 -c 10 'dst port 21 or dst port 80'
~~ 想获取172.16.10.11 和 google.com之间建立TCP三次握手中带有SYN标记位的网络包.
# tcpdump -i eth0 'host 172.16.0.11 and host google.com and tcp[13]&2!=0' -c 3 -nn
- 最后一命令的 tcp[13]&2!=0 可能有点怪,这里解析一下,标志位(URG,ACK,PSH,RST,SYN,FIN)在 tcp头部的第 13 个字节中,而 SYN 则在低第二位(xxxxxx10,十进制是2),和2进行与操作,即可判断报文是否 syn 报文
nc
- nc 命令实现任意TCP/UDP端口的侦听,nc可以作为 server 以TCP或UDP方式侦听指定端口。nc 也可以作为 client 发起TCP或UDP连接
options 常用参数
-l 用于指定nc将处于侦听模式。指定该参数,则意味着nc被当作server,侦听并接受连接,而非向其它地址发起连接。
-s 指定发送数据的源IP地址,适用于多网卡机
-u 指定nc使用UDP协议,默认为TCP
-v 输出交互或出错信息,新手调试时尤为有用
-w 超时秒数,后面跟数字
-z 使用 Zero-I/O mode,只在扫描通信端口时使用
- nc 示例
~~ 端口扫描
# nc -v -w 2 192.168.2.34 -z 21-24
nc: connect to 192.168.2.34 port 21 (tcp) failed: Connection refused
Connection to 192.168.2.34 22 port [tcp/ssh] succeeded!
~~ 简单聊天工具 在 192.168.2.34 服务端监听 1211
# nc -l 1211
~~ 在 192.168.2.33 上 连接 34 的 1211端口
# nc 192.168.2.34 1211
curl
- curl 是一款很强大的 http 命令行工具。它支持文件的上传和下载。命令格式:
curl [option] [url]
option 常用参数
-A/--user-agent <string> 设置用户代理发送给服务器
-b <name=string/file> cookie字符串或文件读取位置
-c <file> 操作结束后把cookie写入到这个文件中
-C <offset> 断点续转
-D <file> 把header信息写入到该文件中
-e 来源网址(伪造referer)
-o 把输出写到该文件中
-O 把输出写到该文件中,保留远程文件的文件名
-r <range> 分块下载来自HTTP/1.1或FTP服务器 range字节
-T <file> 上传文件
-u <user[:password]> 设置服务器的用户和密码
-L 参数会让 HTTP 请求跟随服务器的重定向。curl 默认不重定向
-x <host:port> 在给定的端口上使用HTTP代理
-# 进度条显示当前的传送状态
-X 指定 HTTP 请求的方法
-d POST方式传送数据(默认是application/x-www-form-urlencoded)
-H/--header <line> 自定义头信息传递给服务器
- curl 示例
~~ 显示下载进度条
# curl -# -O http://www.linux.com/lwl.jpg
~~ 上传文件
# curl -T lwl.jpg -u 用户名:密码 ftp://www.linux.com/img/
~~ 发出 POST 请求
# curl -X POST https://www.example.com
~~ data.json 是json 数据
# curl localhost:3000/api/json -X POST -d @data.json --header "Content-Type: application/json"
wget
- wget 是一个下载文件的工具,对于Linux用户是必不可少的工具,因为我们经常要下载一些软件或从远程服务器恢复备份到本地服务器。wget支持HTTP,HTTPS和FTP协议。命令格式:
wget [-options] [url]
options 常用参数解析
-O <fileName> 把文档写到FILE文件中
-c (断点续传)接着下载没下载完的文件
-P filePath 将文件保存到 filePath 目录
-b 后台下载
TP 选项:
--ftp-user=USER 设置 ftp 用户名为 USER
--ftp-password=PASS 设置 ftp 密码为 PASS
- wget 示例
~~ wget -b 后台下载
# wget -c -b -O wordpress.zip https://cn.wordpress.org/wordpress-4.9.4-zh_CN.tar.gz
~~ ftp 下载 csc.txt 文件
# wget --ftp-user=baidu --ftp-password=123 ftp://192.168.19.1/lwl/csc.txt
7 shell 脚本命令
shell 程序语法
- 要想写shell 脚本,则需要熟悉下 shell 程序基本语法
- 之前写的一篇文章:shell教程及脚本编写
sed
- 如果涉及到文本处理,可试试 sed,sed 采用的是流编辑模式,在 sed 处理数据之前,需要预先提供一组规则,sed 会按照此规则来编辑数据
- 之前写的一篇文章:sed教程-linux命令
awk
- awk 同样适合处理文本,且更强大;和 sed 命令类似,awk 命令也是逐行扫描文件,寻找含有目标文本的行,如果匹配成功,则会在该行上执行用户想要的操作;反之,则不对行做任何处理
- 之前写的一篇文章:awk教程-linux命令
xargs
- xargs 是一个强有力的命令,在 linux 命令管道传递中,它能够捕获上一个命令的输出,然后传递给另外一个命令。xargs 默认的命令是 echo,这意味着通过管道传递给 xargs 的输入将会包含换行和空白,不过通过 xargs 的处理,换行和空白将被空格取代
- 命令格式:
command |xargs [-options] nextCommand
options 参数解释
-e flag 或 -E flag flag必须是一个以空格分隔的标志,当xargs分析到含有flag这个标志的时候就停止
-r no-run-if-empty 当xargs的输入为空的时候则停止xargs,不再去执行
-t 表示先打印命令,然后再执行
-p 每执行一次xargs 后面跟随的 nextCommand 时,询问一次用户
-n num 将输出数据用"空格"分割成多个参数,再按n个一组分批作为 nextCommand 执行时的参数
-L num 或 -l num 从标准输入一次读取 num 行送给 nextCommand 命令执行
-i 或 -I 将一行一行赋值给占位符 {},在接下来的command里用 {} 替换数据
-s num 命令行的最大字符数,指的是 xargs 后面那个命令的最大命令行字符数
-d delim 指定分隔符,默认的xargs分隔符是回车(换行键),这里修改的是xargs的分隔符
- xargs 示例
~~ 复制所有图片文件到 /data/images 目录下
# ls *.jpg | xargs -n1 -I {} cp {} /data/images
~~ 查找所有的 jpg 文件,并且压缩它们
# find . -type f -name "*.jpg" -print | xargs tar -czvf images.tar.gz
8 jvm 常用命令
jps
- java 版的 ps 命令,查看java进程及其相关的信息,如果想找到一个 java 进程的 pid,那可以用 jps 命令替代linux中的 ps 命令了,命令格式:
jps [-options] [hostIP]
。如果要查看其他 hostIP 机器上的jvm进程,需要在待查看机器上启动 jstatd
options 参数解释
-l : 输出主类全名或jar路径
-q : 只输出LVMID
-m : 输出JVM启动时传递给main()的参数
-v : 输出JVM启动时显示指定的JVM参数
- jps 示例
# jps -lmv
18884 /opt/app/spring-boot/order.jar --spring.profiles.active=test
39812 /opt/app/spring-boot/user.jar --spring.profiles.active=test
jinfo
- jinfo 是用来查看JVM参数和动态修改部分JVM参数的命令;命令格式:
jinfo [-option] <pid>
options 参数解释
-flag <name> 打印指定名称的参数
-flag [+|-]<name> 打开或关闭参数
-flag <name>=<value> 设置参数
-flags 打印所有参数
-sysprops 打印系统配置
默认是 flags 和 sysprops
- jinfo 示例
# jinfo -flags 19092
Attaching to process ID 19092, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.181-b13
Non-default VM flags: -XX:-BytecodeVerificationLocal -XX:-BytecodeVerificationRemote -XX:CICompilerCount=4 -XX:InitialHeapSize=266338304 -XX:+ManagementServer -XX:Max
HeapSize=4229955584 -XX:MaxNewSize=1409810432 -XX:MinHeapDeltaBytes=524288 -XX:NewSize=88604672 -XX:OldSize=177733632 -XX:TieredStopAtLevel=1 -XX:+UseCompressedClassP ointers -XX:+UseCompressedOops
.....
jstat
- jstat 命令是使用频率比较高的命令,主要用来查看JVM运行时的状态信息,包括内存状态、垃圾回收等;命令格式:
jstat [-option] pid [interval] [count]
,pid 是进程id,interval 是打印间隔时间(毫秒),count是打印次数(默认一直打印)
option 参数解释
-class : class loader的行为统计
-compiler : HotSpt JIT编译器行为统计
-gc : 垃圾回收堆的行为统计
-gccapacity : 各个垃圾回收代容量(young,old,perm)和他们相应的空间统计
-gcutil : 垃圾回收统计概述
-gccause : 垃圾收集统计概述(同-gcutil),附加最近两次垃圾回收事件的原因
-gcnew : 新生代行为统计
-gcnewcapacity : 新生代与其相应的内存空间的统计
-gcold : 年老代和永生代行为统计
-gcoldcapacity : 年老代行为统计
-gcpermcapacity : 永生代行为统计
-printcompilation : HotSpot编译方法统计
- jstat 示例
# jstat -gcutil 18884
S0 S1 E O M CCS YGC YGCT FGC FGCT GCT
0.00 84.14 19.93 45.77 91.32 87.65 641 18.311 6 3.512 21.824
------各项指标解析----------------------------------------
S0 第 0 个 survivor(幸存区)使用的百分比
S1 第 1 个 survivor(幸存区)使用的百分比
E Eden 区使用内存的百分比
O 老生代内存使用的百分比
P/M PermGen/MetaSpace 的内存使用百分比
YGC 程序启动以来 Young GC 发生的次数
YGCT 程序启动以来 Young GC 共消耗的时间(s)
FGC 程序启动以来 Full GC 发生的次数
FGCT 程序启动以来 Full GC 共消耗的时间(s)
GCT 程序启动以来 GC 的总用时(s)
jstack
- jstack 是用来查看 jvm 线程快照的命令,线程快照是当前JVM线程正在执行的方法堆栈集合。使用 jstack 命令可以定位线程出现长时间卡顿的原因,例如死锁,死循环等。jstack 还可以查看程序崩溃时生成的 core 文件中的 stack 信息;命令格式:
jstack [-Flm] <pid>
option 参数解释
-F 当使用jstack <pid>无响应时,强制输出线程堆栈
-m 同时输出java和本地堆栈(混合模式)
-l 额外显示锁信息 (小写l)
- jstack 示例,查看 pid = 1211 的线程栈
# jstack -l 1211
"DiscoveryClient-CacheRefreshExecutor-0" #146 daemon prio=5 os_prio=0 tid=0x000000002ba2c000 nid
=0x4fe4 waiting on condition [0x000000002cade000]
java.lang.Thread.State: WAITING (parking)
at sun.misc.Unsafe.park(Native Method)
- parking to wait for <0x00000006c775dc60> (a java.util.concurrent.SynchronousQueue$Tra
nsferStack)
......
jmap
- jmap 是用来生成堆dump文件 或 查看堆相关的各类信息的命令,例如查看 finalize 执行队列,heap 的详细信息和使用情况;命令格式:
jmap [-option] <pid>
option 参数解释
-heap 打印java heap摘要
-histo[:live] 打印堆中的java对象统计信息
-clstats 打印类加载器统计信息
-finalizerinfo 打印在f-queue中等待执行finalizer方法的对象
-dump:<dump-options> 生成java堆的dump文件
dump-options:
live 只转储存活的对象,如果没有指定则转储所有对象
format=b 二进制格式
file=<file> 转储文件到 <file>
-F 如果jvm挂起,可用-F强制执行选项,会影响java 服务
- jmap 示例,dump 出 pid=1211 java进程的内存堆文件
# jmap -dump:live,format=b,file=dump.hprof 1211
Dumping heap to /home/lwl/dump.hprof ...
Heap dump file created
参考文章
- Linux 命令大全[4]
- 推荐一套我用起来特顺手的命令![5]
- Linux挂载命令mount用法及参数详解[6]
- Centos7之Systemd(Service文件)详解[7]
- tcpdump参数解析及使用详解(转载)[8]
- JVM监控和调优常用命令工具总结[9]
- Linux lsof命令详解[10]
- wget命令[11]
文章转载自公众号:潜行前行