对一些经常用到的 shell 命令做简要的总结,方便日后查阅。
tcpdump
tcpdump 命令用来保存和记录网络流量,即抓包工具。你可以用它来观察网络上发生了什么,并可用来解决各种各样的问题,包括和网络通信无关的问题。
Tcpdump 中的关键字主要有以下几种
1.关于类型的关键字主要包括:host、net、port。如果没有指定类型,缺省的类型是host.
2.关于确定传输方向的关键字主要包括:src、dst、dst or src、 dst and src。如果没有指明方向关键字,则缺省是src or dst关键字
3.关于协议的关键字,主要包括ip、arp、rarp、tcp、udp、icmp等类型。如果没有指定任何协议,则tcpdump将会监听所有协议的信息包。
4.其他重要的关键字:gateway,broadcast,less,greater。
5.三种逻辑运算:取非运算是'not ' ,'! ';与运算是'and','&&';或运算 是'or','││'。多条件时可以用括号,但是要用转义。
注意:该工具使用 sudo 权限去执行!
常用参数解析
参数 | 含义 |
---|---|
-w | 指定抓取到的数据包的保存位置 |
-i | 指定抓取哪个网口的数据包,默认是 eth0 |
-s | 指定从一个包中截取的字节数。0表示包不截断,抓完整的数据包 |
-S | 将tcp的序列号以绝对值形式输出,而不是相对值 |
-n | 指定将每个监听到数据包中的域名转换成IP地址后显示,不把网络地址转换成名字 |
-nn | 指定将每个监听到的数据包中的域名转换成IP、端口从应用名称转换成端口号后显示 |
-c | 指定要抓取多少数据包,默认会一直抓取,直到 ctrl+c |
-v | 输出一个稍微详细的信息,例如在ip包中可以包括ttl和服务类型的信息 |
-vv | 输出详细的报文信息 |
-A | 以ASCII格式打印出所有分组,并将链路层的头最小化 |
-e | 打印出数据链路层的头部信息,包括源mac和目的mac,以及网络层的协议 |
-X | 把协议头和包内容都原原本本的显示出来(tcpdump会以16进制和ASCII的形式显示) |
-r | 从指定的文件中读取包(这些包一般通过-w选项产生) |
更多详细参数可以参考Linux抓包工具tcpdump详解
举个栗子
tcpdump -w /tmp/data -s0 -i eth0 port 3000 and host 127.0.0.1
截获流经 eth0 网口,3000 端口,并且主机地址为 127.0.0.1 收到的和发出的所有的完整(不截断)数据包,并将这些数据包保存在 /tmp/data 文件中。
tcpdump 'host 210.27.48.1 and (210.27.48.2 or 210.27.48.3)'
截获主机 210.27.48.1 和主机 210.27.48.2 或 210.27.48.3 的通信数据包。
tcpdump ip host 210.27.48.1 and ! 210.27.48.2
获取主机 210.27.48.1 除了和主机 210.27.48.2 之外所有主机通信的ip包
数据包解析
抓到的数据包都会有一个类型标识:
- [S] – SYN (开始连接)
- [S.] - SYN-ACK 数据包
- [.] – 没有标记
- [P] – PSH (数据推送)
- [F] – FIN (结束连接)
- [R] – RST (重启连接)
其他很容易弄懂,暂不解释。
strace
strace 常用来跟踪进程执行时的系统调用和所接收的信号。 在 Linux 世界,进程不能直接访问硬件设备,当进程需要访问硬件设备(比如读取磁盘文件,接收网络数据等等)时,必须由用户态模式切换至内核态模式,通过系统调用访问硬件设备。strace 可以跟踪到一个进程产生的系统调用,包括参数,返回值,执行消耗的时间。
常用参数解析
参数 | 含义 |
---|---|
-o filename | 将strace的输出写入文件filename |
-p pid | 跟踪指定的进程pid |
-f | 跟踪由fork调用所产生的子进程 |
-ff | 如果提供-o filename,则所有进程的跟踪结果输出到相应的filename.pid中,pid是各进程的进程号 |
-tt | 在输出中的每一行前加上时间信息,微秒级 |
-T | 显示每一调用所耗的时间 |
-s strsize | 指定输出的字符串的最大长度.默认为32.文件名一直全部输出 |
lsof
lsof(list open files)是一个查看当前系统文件的工具。在linux环境下,任何事物都以文件的形式存在,通过文件不仅仅可以访问常规数据,还可以访问网络连接和硬件。如传输控制协议 (TCP) 和用户数据报协议 (UDP) 套接字等,系统在后台都为该应用程序分配了一个文件描述符,该文件描述符提供了大量关于这个应用程序本身的信息。
常用参数解析
参数 | 含义 |
---|---|
-p<进程号> | 列出指定进程号所打开的文件 |
-i<条件> | 列出符合条件的进程。(4、6、协议、:端口、 @ip ) |
-n | 不把网络地址转换成名字 |
-P | 不转换端口号,用数字表示 |
-c<进程名> | 列出指定进程所打开的文件 |
-u user | 某个用户打开的文件 |
-d<文件号> | 列出占用该文件号的进程 |
-g gid | 某个用户组打开的文件 |
输出解析
- COMMAND:进程的名称
- PID:进程标识符
- PPID:父进程标识符(需要指定-R参数)
- USER:进程所有者
- PGID:进程所属组
- FD:文件描述符,应用程序通过文件描述符识别该文件。如cwd、txt等
- TYPE:文件类型,如DIR、REG等
- DEVICE:指定磁盘的名称
- SIZE:文件的大小
- NODE:索引节点(文件在磁盘上的标识)
- NAME:打开文件的确切名称
一般在标准输出、标准错误、标准输入后还跟着文件状态模式:r、w、u等
(1)u:表示该文件被打开并处于读取/写入模式
(2)r:表示该文件被打开并处于只读模式
(3)w:表示该文件被打开并处于只写模式
(4)空格:表示该文件的状态模式为unknow,且没有锁定
(5)-:表示该文件的状态模式为unknow,且被锁定
更多参数解析请参考lsof 一切皆文件
举个栗子
lsof /bin/bash -u username
列出与 /bin/bash
文件相关的,且 username
用户打开的进程
lsof -p 1223 -i tcp:8000 -n -P
列出 1223 进程在 8000 端口打开的 tcp 连接,地址和端口保留数字,不做转换
lsof -d 2-3
pidof
pidof用于找出正在运行的程序的进程PID(用空格分割),程序可以是一个二进制执行程序,也可以是一个shell脚本。
-s 参数只列出一个
tr
tr用来从标准输入中通过替换或删除操作进行字符转换.
常用参数
参数 | 含义 |
---|---|
-d | 删除所有属于第一字符集的字符 |
-s | 把连续重复的字符以单独一个字符表示 |
举个栗子
echo "HELLO WORLD" | tr 'A-Z' 'a-z'
将大写字母转换成小写字母
echo "hello 123 world 456" | tr -d '0-9'
从字符串中删除数字
echo "hello world" | tr " ",
空格换成逗号
To be continued...