你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

Linux shell 脚本实战案例——ss命令一些实用的用法

[复制链接]
gaosmile 发布时间:2020-6-4 16:28
部署在Linux服务器上的业务一般都是支持高并发连接的服务,如HTTP、FTP、DNS等服务器都可以提供成百上千的并发连接数。虽然日志文件可以为我们提供历史数据,但是如果想了解服务器实时的网络连接状态呢?应该什么做?Centos7系统中默认包含了ss这个工具,它可以实现类似netstat的功能,比netstat更高效,也可以显示更多有关网络连接状态的信息。但是想监控网络连接状态,熟悉TCP和UDP是必要的条件。如果不知道TCP可以参考这篇文章《网络编程-从TCP三次握手说起》和《网络编程-TCP的四次挥手》。
使用ss命令实时查看网络连接状态
对于服务器的维护人员来说,监控这些服务的实时状态、统计实时并发量、分析客户端IP都是非常重要的且必须完成的任务。使用ss命令可以实时查看网络连接状态,借助于awk我们还可以非常轻松的过滤并分析这些数据。如果不知道如何使用awk可以参考这篇《linux shell脚本之awk利器》
显示所有TCP连接状态
ss -at
微信图片_20200604162339.png
) f$ C& W8 d% Q. ?" n
输出结果包含4列。分别对应连接状态、接收和发送的队列长度(对于ESTAB而言是未复制和未得到客户端确认的数据字节数)、服务本地监听的IP与端口信息及最后输出的远程主机IP与端口信息。
  M; B) A0 L" E2 P/ {5 I' p' B
从输出结果中可以看出,有些服务器仅处于LISTEN监听的状态,并没有任何客户端连接该服务(如mysql等),而有些服务处于ESTAB状态,表示有客户端已经与服务器建立完成了TCP握手连接(如ssh服务)。上面的输出信息说明本机ssh服务正在监听所有网卡的22端口,等待用户的连接。
6 F2 v5 o6 e" {# L8 r

3 S2 S5 K9 C$ ^
以数字格式显示
ss -atn
微信图片_20200604162343.png
显示对应的进程信息
0 Q7 E1 M2 ~4 j9 Y* ], y
ss -atnp

' W6 |, k" ]0 X4 j$ R
微信图片_20200604162346.png
2 C7 v0 M+ {% r4 E1 c: D" f5 ^
显示所有UDP连接
ss -anup
微信图片_20200604162349.png
3 @7 [! ~: M+ @' S% U7 m
显示所有TCP和UDP连接
ss -antu
微信图片_20200604162352.png
$ Z; o/ a# h" Y# Z
不显示标题行
ss -antuH
微信图片_20200604162356.png ) ]2 S, p+ x5 ^1 }1 O3 ?# D) n
仅显示正在Listen的信息
ss -antul
微信图片_20200604162359.png
! p/ v# z3 i* ~
显示所有连接信息
ss -an
微信图片_20200604162401.png
! l7 p" {/ b1 m8 ?+ z
显示数据汇总信息
ss -s
微信图片_20200604162405.png
8 X8 Z5 u" q6 N- }3 B% r
" r/ @0 Z: x6 n( ]$ ?0 g
对于ss命令的输出结果,我们还需要使用awk等工具进行过滤和统计分析工作,下面我们来写一个监控网络连接的脚本。( E; Q  Q8 u, w7 p0 G5 K  Q
2 Y) t) l" j4 U
" a3 [0 ^* t6 a6 y! K$ o  ^
#!/bin/bash1 i8 x. a; }; u; i
. _6 l- k, I2 {
#功能:监控网络连接状态脚本
5 j( X! b% h; k5 r# |
. q. Z8 W" K5 NTCP_Total=$(ss -s | awk '$1=="TCP"{print $2}') #所有TCP连接个数
9 r3 b3 O; B8 t* [' s; q" B9 tUDP_Total=$(ss -s | awk '$1=="UDP"{print $2}') #所有UDP连接个数$ W  c  p. Q- K2 I! h+ ^9 L& ^- S
Unix_sockets_Total=$(ss -ax | awk 'BEGIN{count=0} {count++} END{print count}') #所有UNIX sockets连接个数
3 |$ M' V: x( ~TCP_Listen_Total=$(ss -antlpH | awk 'BEGIN{count=0} {count++} END{print count}') #所有处于Listen监听状态的TCP端口个数: L) y- U, z) E0 _% q
TCP_Estab_Total=$(ss -antph | awk 'BEGIN{count=0} /^ESTAB/{count++} END{print count}') #所有处于ESTABLISHED状态TCP连接个数
# t1 o$ T% i1 B# p$ p& H3 u. DTCP_SYN_RECV_Total=$(ss -antpH | awk 'BEGIN{count=0} /^SYN-RECV/{count++} END{print count}') #所有处于SYN_RECV状态的TCP连接个数) i. Z$ b# E7 y* b' Q( v  ?
TCP_TIME_WAIT_Total=$(ss -antpH | awk 'BEGIN{count=0} /^TIME-WAIT/{count++} END{print count}') #所有处于TIME-WAIT状态的TCP连接个数
( c; B( O( Q- e% h1 s& f, A! PTCP_TIME_WAIT1_Total=$(ss -antpH | awk 'BEGIN{count=0} /^TIME-WAIT1/{count++} END{print count}') #所有处于TIME-WAIT1状态的TCP连接个数& K$ x, O; W- K) o2 j$ J+ u% f
TCP_TIME_WAIT2_Total=$(ss -antpH | awk 'BEGIN{count=0} /^TIME-WAIT2/{count++} END{print count}') #所有处于TIME-WAIT2状态的TCP连接个数! F- h0 Z: o: u+ R
TCP_Remote_Count=$(ss -antH | awk '$1!~/LISTEN/{IP[$5]++} END{ for(i in IP) {print IP,i} }' | sort -nr) #所有远程主机TCP连接次数6 S0 d4 t$ N5 e) A
TCP_Port_Count=$(ss -antH | sed -r 's/ +/ /g' | awk -F"[ :]" '$1!~/LISTEN/{port[$5]++} END{for(i in port) {print port,i}}' | sort -nr) #每个端口被访问次数7 d5 ~2 I* q9 z( D% N

3 E" B) R1 U0 j$ g4 ^4 m5 f#定义输出颜色  r7 Y" E8 o" m( H
7 h  ]: i; c1 S3 b' z% A
SUCCESS="echo -en \\033[1;32m"  #绿色
$ D+ e, x; b- k" ^! C9 m% a, VNORMAL="echo -en \\033[0;39m" #黑色
4 w) I% v+ ]: j( {$ r- m
* {! ?: C: P. h9 R% f3 l, |#显示TCP连接总数
8 B1 c' }+ r( x0 K8 X3 V/ }# |tcp_total(){
: F4 J$ c5 n+ N0 x. v: D- j
! Y6 M0 ], v7 B' s) n! x  L    echo -n "TCP连接总数: "
- \* N' y9 o2 c7 A) b    $SUCCESS
& k" J2 h3 p; s: L( J    echo "$TCP_Total"2 G. m2 @1 z9 z$ X. X* o& ?
    $NORMAL* |. o5 A: q! U7 t9 B$ j
}
# q. P; p) n- d8 Z% i# |8 X$ A3 \# X) q# H; m
#显示处于LISTEN状态的TCP端口个数# O! X6 ]) K' y: N: i* L" U! x0 y

! v$ l! A; t/ h4 x4 X8 n0 b0 ]tcp_listen(){
% D1 v  w' S% b1 G. `+ r    echo -n "处于LISTEN状态的TCP端口个数": O" C, M5 d1 ^' f
    $SUCCESS4 Y: I& |* @& O6 ^5 P; i! l! m* H# x
    echo "$TCP_Listen_Total"
1 i7 Y5 Z" ?% Z% r    $NORMAL
1 y. }1 E2 l) P4 ]5 _7 B}
; F8 x" H' a( p1 r4 h3 `8 ?
" u) }# k1 T/ }- m7 ?9 Y4 Q#显示处于ESTABLISHED状态的TCP连接个数
" d; V# Z% s: N6 e+ atcp_estab(){
8 o: F' ?2 o( b, R+ Z5 p& O    echo -n "处于ESTAB状态的TCP连接个数:"5 U/ a; S2 F7 [! e2 }$ \0 `
    $SUCCESS
, o0 l) M  b' w' o3 I: ]    echo "TCP_Estab_Total"
, P- m. I& H/ C9 o, o    $NORMAL" y/ \0 V# F! `/ U/ h, ]! ?1 H
}4 w/ \) Z1 }) G1 l

- f8 `1 c' x( ?" ^. m#显示处于SYN-RECV状态的TCP连接个数. J- R, W+ \! t( S* d1 U1 j: s

& ?& z. t; s+ c% V6 vtcp_syn_recv(){' k7 z! O, b# U7 Q7 n7 @
    echo -n "处于SYN-RECV状态的TCP连接个数:"
' r, Z, h/ N9 l' d" ?7 X    $SUCCESS
6 C+ B1 G7 A/ e8 h( E8 s    echo "TCP_SYN_RECV_Total"0 j) f/ |: J0 ]8 m5 J+ w5 a
    $NORMAL
+ c) g- ]2 Q4 ]+ L' v* |}
" b2 q" z& L- d7 I6 w
. u. _2 I  M- Y  T4 W#显示处于TIME-WAIT状态的TCP连接个数& \: D' _/ a+ m: e- m

9 k9 D4 w/ t( W  dtcp_time_wait(){
' C: E6 g: O5 b7 }" ?    echo -n "处于TIME-WAIT状态的TCP连接个数:"7 l4 E7 |2 h2 \  m* i# H4 B
    $SUCCESS5 X" l, b3 M* L* ~5 ^
    echo "$TCP_TIME_WAIT_Total"
2 Z7 z4 f0 w0 k    $NORMAL
0 ]. a/ z! }. T6 j0 T8 F8 k}
1 P. Y8 S9 H" c2 o0 {) u% Q: [. l; Q$ m% L: P
#显示处于TIME-WAIT1状态的TCP连接个数+ b) n& w  ]/ h! c1 Y
tcp_time_wait1(){- \! q% i3 H+ }% n4 `0 x5 b$ `, w
    echo -n "处于TIME-WAIT1状态的TCP连接个数:"
/ q) r: A: m2 `- h    $SUCCESS
$ z/ y: J& v2 L0 n# V    echo "$TCP_TIME_WAIT1_Total"9 B2 t4 v) i5 o/ b  k
    $NoRMAL
$ X7 h' a7 x! C+ [) E}/ U/ @. T& I* R1 k& A
7 v& \1 v* M6 i* f% f+ U% p
#显示处于TIME-WAIT2状态的TCP连接个数
; _8 h' O$ R& z, X. mtcp_time_wait2(){; e9 M  H& v# O: {( V0 o
    echo -n "处于TIME-WAIT2状态的TCP连接个数:"" H3 ]# o: n* X" ]
    $SUCCESS
& w% s- U2 I% S9 ^$ Z' ^    echo "$TCP_TIME_WAIT2_Total"
& p$ \. y: |* G    $NORMAL7 [# C: m& ?' C0 R* Y0 B
}  J  e; A* r5 R5 H

" u6 H( \# o- m! H#显示UDP连接总数
! ]: H- @6 F" k2 ^* j, _& _, _* x1 n
: n1 b+ j+ \! g/ Y" \( Y& Oudp_total(){8 ~$ z1 X5 z4 ?7 S+ R" @, u- d6 F4 A
    echo -n "UDP连接总数:"
0 ~; I0 u* S  R  ^; M: M$ \- d2 g- S* _. S    $SUCCESS
6 S* H& X) v( m' \    echo "$UDP_Total"
0 M- L5 P( j& A0 R    $NORMAL: y1 D$ \2 t2 F2 E% {( Q
}6 S+ n3 q& P+ q2 H
- o( X' o0 P) K. ?3 f- d
#显示UNIX sockets连接总数6 M; [& r. Z' n0 j7 o

& b/ z2 d/ N* n/ qunix_total(){# P  ^7 E& f: J5 _
    echo -n "Unix sockets 连接总数:"
/ ?3 W. F* r2 {1 j4 G4 \- M    $SUCCESS; Q0 M% G( Y4 z7 Q
    echo "$Unix_sockets_Total"
1 n. u; v& a9 c    $NORMAL
! e$ l, Z8 G" M" k}
9 G/ x& _. ~$ C- ?- P# ]. s9 E
! q8 j9 [1 e% N#显示每个远程主机的访问次数
* W1 G, P* n0 Y! Z2 sremote_count(){7 p! O* [+ F  \2 r
    echo -n "每个远程主机与本机的并发连接数:"- h0 q6 ^0 Z( }! b
    $SUCCESS  I* j1 r1 r: u) g$ h1 v2 W
    echo "$TCP_Remote_Count"3 ]9 y6 b0 u: c- |. }; q, x( q
    $NORMAL
  B2 o% k/ e; v" n3 c: L" z5 l}3 |5 j! @8 N( G( D* G
$ `- O' n8 ^7 |
#显示每个端口的并发连接数
3 `7 w2 R2 G( g/ S( K3 m' F+ G+ n+ I) m3 e+ @7 w( h
port_count(){, ]0 ^  d7 i+ ~" y
    echo -n "每个端口的并发连接数:"
3 P& U6 P, M! G, h4 {% D    $SUCCESS  g& T/ m+ r3 C' D7 K% j$ d
    echo "$TCP_Port_Count"7 v& N9 C! s4 b& r$ A
    $NORMAL: h* {+ {# ]8 _( d' J; b8 H
}
" A9 d4 ?0 N1 M
+ D4 n0 p! J1 Jprint_info(){
6 N- ?3 `# w6 X5 w( r+ V    echo -e "================================================================="
7 I! B4 C" h& R    $1% ~% g6 r) w7 V7 e! i
}
. g$ N; }" A9 M5 g; n' l# w* B, A, `. g
print_info tcp_total# v# `1 U/ `$ g1 f2 U9 Y" c. n
print_info tcp_listen
& k/ J( M+ }) Q8 b/ Zprint_info tcp_estab+ z# s7 ^: K" a
print_info tcp_syn_recv5 `, |- Y: L  P! t4 b( l
print_info tcp_time_wait
2 f2 D$ k, S" G6 Rprint_info tcp_time_wait1! `& Q( ?& [3 d( `) @1 s
print_info tcp_time_wait2
" o* V* f# E  |, Pprint_info udp_total1 w; K& w3 W. c) R) `
print_info unix_total
& Z* \. V; U+ `! P: mprint_info remote_count$ m1 l8 h  t$ w+ j
print_info port_count
3 L8 H  y6 y' d5 y# H( u4 M% Q8 A: Q4 J
echo -e "================================================================="

  X/ m; d6 Y0 k2 ?# M% @0 @8 u
& B" U& T  r- |) r$ j5 t8 L
编译输出
. F2 M3 \5 Y6 I- W- y3 ]
; `( X: l9 j, n8 b# Z# m% T
微信图片_20200604162408.png
% z+ B' U7 V5 N9 k% Q/ G
总结9 J8 F6 e4 z7 o+ ]4 f4 u
4 ?$ k7 H2 C6 G, n1 K& r( P
本文介绍了ss命令一些实用的用法。还有写一个监控网络连接状态脚本。可以显示连接个数和访问个数。如果你想使用ss命令快速检查有关套接字的各种信息,建议你查阅ss的相关帮助手册。

  ^+ I# i. T1 |* i1 ?
赞 收藏 评论1 发布时间:2020-6-4 16:28

举报

1个回答
李康1202 回答时间:2020-6-5 08:40:48
谢谢分享
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版