工作中常用的Linux命令集锦

tcpdump —— 打印出通过网口流入流出的数据内容,用于网络协议调试

tcpdump就是大家嘴里常说的抓包工具,在linux命令行下,使用tcpdump,可以查看服务器特定端口进出的数据包内容。
tcpdump -X -s0 -i any udp port 12009

上述命令是我在工作中常用的一组参数组合,其含义如下:

  • -X 将每个包打印成16进制形式和ASCII形式,调试新协议的时候非常方便
  • -sN 每个包显示的(截断)字节数,N代表字节数,填0代表64K,为UDP包最大长度,实际实践中UDP包长1500字节左右,如果调试的协议只关心包头,一般查看前128个字节即可,可以视情况而选择。
  • -i 代表interface,可以认为是网卡,any代表任意,也可以填eth0,eth1,代表以太网口
  • udp port 12009是表达式,例子的含义就是UDP协议,12009端口。

tcpdump [ -adeflnNOpqStvx ] [ -c 数量 ] [ -F 文件名 ][ -i 网络接口 ] [ -r 文件名] [ -s snaplen ][ -T 类型 ] [ -w 文件名 ] [表达式 ]

如上是tcpdump命令的完整格式,具体每个参数的含义,可以参看linux的man。

这里简单谈谈最后的那个“表达式”,这个表达式的写法是非常灵活的,使得tcpdump像一个可自由编程的调试工具一样,强大异常。这里可以把表达式理解成是一种编程语言的语句。

  1. 表达式 = 语句 语句 语句 ……
  2. 语句 = 修饰符 修饰符 内容

不知道我上面的描述方式,是不是说清楚了表达式的结构,表达式是一个又一个原语(primitives)组成的,每个原语又是由修饰符和数据组成。数据可以数字或者id或者ip或者range等。

修饰符有很多种:

  1. 类型–可以是host(后面跟主机名),net(后面跟ip地址),port(和面跟端口号),如果不指定,默认是host
  2. 方向–可以是src,src or dst,src and dst,dst,主要是源端还是目的端,如果不指定,默认是src or dst
  3. 协议–就比较多了,常用的就udp和tcp,其他的可以看参考

现在再来看看我给的例子,udp port 12009,表示使用UDP协议的,通过12009端口的(进入和出去的)包都显示出来。

tcpdump这个工具还是比较难以记住的,Charels觉得还是要注意理解这个命令的功能和原理,然后在用到的时候,才能快速的找到准确的用法。

netstat —— 打印网络连接,路由表,网络数据统计等功能

netstat是Linux服务器上最常用的命令之一,一般我总是用这个命令来诊断一些问题:mysql是否已经成功启动?web server是否已经成功启动?哪些进程在侦听哪些端口,建立了哪些连接?
netstat -npl
这是我最常用的参数组合,n代表使用数字,哪个进程在哪个IP上侦听哪个端口,你看到的结果列表里,是192.168.26.128:3306这种形式的,这个例子里是mysql正常启动的状态,一般mysql启动后,会有一个进程侦听在3306端口上,如果不是用n参数,netstat会试图找出主机和程序的名字,会显示成localhost:mysql类似这样。
p代表program,也即程序,到底是哪个程序在侦听端口呢?这个进程的id是多少?就是用这个参数来显示的。所以,np一般一起用,前面用n现实IP,后面用p显示程序的名字。
l代表listen,代表让命令只列出正在侦听端口的进程,对于那些不活跃的则不显示,与l相对应的参数是a,代表all,表示列出所有的socket,不管是在侦听还是没在侦听的。
其他的参数还有很多,比如i可以现实所有的网卡,s可以现实所有包的统计,但是因为使用场景较少,我就不介绍了,大家可以自己去看man,不爽看woman也行:)

lsof —— 待续