Linux 服务器编程学习笔记②
# Linux 系统工具
# tcpdump
tcpdump 是一款网络抓包工具(不过Wireshark更加容易使用和掌握),在一些特殊场景,其仍然是必备利器。
一些参数如下:
-n, 使用ip地址表示主机(而非主机名),端口号数字表示服务(而非服务名)。
-i, 指定要监听的网卡接口。 -i any
表示抓取所有网卡接口。
-t, 不打印时间戳。
-e, 显示以太网帧头部信息(物理地址)。
-c, 抓取指定数量数据包。
-x, 以16进制显示数据包内容。
-X, 在-x基础上显示每个字节对应的 ASCII 字符。
-S, 以绝对值显示 TCP 报文序号而不是相对值。
-w, 将输出以特殊格式定向到某个文件。
-r, 从文件读取数据包信息并显示。
host, net, port, portrange 后分别指定主机名(或IP地址), 网络地址, 端口号, 端口号范围。
例1: 抓取1.2.3.0/255.255.255.0 网络上的所有包:
tcpdump net 1.2.3.0/24
src, dst 后分别指定数据包的发送端, 目的端。
例2: 抓取进入端口13579的数据包:
tcpdump dst port 13579
tcpdump 还可以指定协议。
例3: 抓取所有 ICMP 数据包:
tcpdump icmp
tcpdump 还可以使用逻辑表达式,示例如下:
tcpdump 'tcp[tcpflags] & tcp-syn != 0'
抓取 TCP SYN 字段不为 0 的报文段。
注: 加引号是防止逻辑表达式被 shell 解释了。
# lsof
lsof (list open file)是一个列出当前系统打开的文件的工具。
一些参数如下:
-i, 显示 socket 文件描述符
例: 显示连接到主机 192.168.1.108 的 ssh 服务(端口 22)的 socket 文件描述符。
lsof -i@192.168.1.108:22
-u, 显示指定用户启动的所有进程打开的所有文件描述符。
-c, 显示指定的命令打开的所有文件描述符。
-p, 显示指定进程打开的所有文件描述符。
-t, 显示打开了文件描述符的进程 PID。
输出解释:
COMMAND
——程序所使用的终端命令(默认九个字符)
PID
——所属进程 PID
USER
——所属用户用户名
FD
——文件描述符("cwd"表示进程工作目录;"rtd"表示用户根目录;"txt"表示进程运行的程序代码;"mem"表示直接映射到内存中的文件;还有"文件描述符+权限";"-r"可读;"-w”可写;"-u"可读可写。例:"0r"表示标准输入,"1w"表示标准输出,"2w"表示标准错误输出)
TYPE
——文件描述符类型("DIR"表示目录;"REG"表示普通文件;"CHR"表示字符设备文件;"IPv4"表示IPv4类型的socket;"0000"表示未知)
DEVICE
——文件所属设备(“主设备号,次设备号”)
SIZE/OFF
——文件大小或偏移值(“0t”表示是偏移值,否则是文件大小)
NODE
——文件的 inode 号(对于 socket 显示协议名)
NAME
——文件的路径(名字)
注:在 /proc/<PID>/fd
文件中存储了当前进程的文件描述符和对应的打开文件。
# nc
nc (netcat)用于构建网络连接。默认以客户端方式和 TCP 协议运行。
一些参数如下:
-l, 以服务器方式运行,监听指定端口。
-n, 使用 IP 地址和 port 端口号表示连接。
-p, 以客户端方式运行时,强制使用指定的端口号。
-s, 设置本地主机发送出的数据包 IP 地址。
-u, 使用 UDP 协议。
-z, 扫描目标机器上的某个或某些服务(端口)是否开启。
-C, 使用CRLF两个字符作为结束符。
# netstat
netstat 是一个网络信息统计工具。
一些参数如下:
-n, 使用 IP 地址和 port 端口号表示地址。
-a, 结果包含监听 socket。
-t, 仅显示 tcp 连接。
-r, 显示路由信息。
-i, 显示网卡接口数据流量。
-c, 每隔 1 秒输出一次。
-o, 显示 socket 定时器信息。
-p, 显示 socket 所属进程 PID 和名字。
Proto
表示协议名
Recv-Q
表示 socket 内核缓冲区中尚未被应用程序读取的数据量
Send-Q
表示未被对方确认的是数据量
State
表示 socket 的状态(若是 UDP 之类无状态连接,则不显示)。