linux下ss工具简介

http://blog.lifeibo.com/?p=244

在实际工作中,熟练使用工具,可以为我们提高不少效率。今天我们简单了解下ss工具的使用。ss即socket state,也就是说,是可以查看系统中socket的状态的。我们可以用netstat,但为什么还要用ss这个工具呢,当然ss也是有好处的。当我们打开的socket数量很多时,netstat就会变得慢了。

我们先来看看ss的使用格式:

  1. $ ss [ OPTIONS ] [ STATE-FILTER ] [ ADDRESS-FILTER ]  

$ ss [ OPTIONS ] [ STATE-FILTER ] [ ADDRESS-FILTER ]

options我从man手册里摘了过来:

ss的强大之处,大于可以设定过滤条件,我们可以根据socket的状态来进行过滤,也可通过端口与ip地址进行过滤。也就是我们在命令格式里面看到的STATE-FILTER与ADDRESS-FILTER。

首先看看STATE-FILTER,STATE-FILTER可用的过滤条件有:
1. 所有的TCP状态,包含:established, syn-sent, syn-recv, fin-wait-1, fin-wait-2, time-wait, closed, close-wait, last-ack, listen and closing.
2. all,包含所有的状态。
3. connected,除了listen与closed的所有其它状态。
4. synchronized,除了syn-sent的所有connected的状态。
5. bucket
6. big
使用时,如:

  1. $ ss state connected  

$ ss state connected

再看看ADDRESS-FILTER,ADDRESS-FILTER用于过滤端口与地址。而且可以进行表达式组合。可用的子表达式有:
1. dst ADDRESS_PATTERN
2. src ADDRESS_PATTERN
3. dport RELOP PORT
4. sport RELOP PORT
5. autobound
其中ADDRESS_PATTERN为ip地址与端口匹配,ip:port,可以用*代替。RELOP为<= >=或==。
如:

  1. $ ss dst 192.168.0.1:80   
  2.       $ ss dport == 80  

$ ss dst 192.168.0.1:80
$ ss dport == 80

多个子表达式之间可以组合,当然跟tcpdump一样,可以用or and not来组合。但括号要用转义符号表示。
如:

  1. $ ss -o state fin-wait-1 \( sport = :http or sport = :https \) dst 193.233.7/24  

$ ss -o state fin-wait-1 \( sport = :http or sport = :https \) dst 193.233.7/24

看看几个例子:
查看系统总体信息:

  1. $ ss -s   
  2. Total: 85 (kernel 108)   
  3. TCP:   15 (estab 4, closed 0, orphaned 0, synrecv 0, timewait 0/0), ports 12   
  4.   
  5. Transport Total     IP        IPv6   
  6. *     108       -         -   
  7. RAW   0         0         0   
  8. UDP   10        7         3   
  9. TCP   15        12        3   
  10. INET      25        19        6   
  11. FRAG      0         0         0  

$ ss -s
Total: 85 (kernel 108)
TCP:   15 (estab 4, closed 0, orphaned 0, synrecv 0, timewait 0/0), ports 12
Transport Total     IP        IPv6
*	  108       -         -
RAW	  0         0         0
UDP	  10        7         3
TCP	  15        12        3
INET	  25        19        6
FRAG	  0         0         0

想看当前机器的8088端口被谁占用了:

view plain copy to clipboard print ?

  1. $ ss -lp src :8088   
  2.    Recv-Q Send-Q                                                       Local Address:P   
  3. 0      0                                                                        *:8ers:(("nginx",2942,5),("nginx",2943,5))  

$ ss -lp src :8088
Recv-Q Send-Q                                                       Local Address:P
0      0                                                                        *:8ers:(("nginx",2942,5),("nginx",2943,5))

我们可以看到,是一个叫nginx的进程,进程id是2942。
当然,用lsof工具也可以看到,还会更简单呢。lsof -i :80

好吧,就先简单介绍到这了。

本文链接:https://my.lmcjl.com/post/1102.html

展开阅读全文

4 评论

留下您的评论.