每天一个Linux命令(54):ss

本文详细介绍了ss命令的功能和使用方法,ss命令能够显示更多的TCP连接状态信息,并且比netstat更快速高效。文中提供了多种参数选项及实用案例,帮助读者更好地理解和运用ss命令。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

ss是Socket Statistics的缩写。顾名思义,ss用来获取socket的统计信息,它可以显示和netstat类似的内容。但ss的优势在于,它能够显示更多更详细的TCP连接状态的信息,而且比netstat更快速更高效。

当服务器的socket连接数量变得非常大时,无论是使用netstat还是cat /proc/net/tcp,执行速度都会很慢。当服务器维持的连接数达到上万个时,使用netstat等于浪费生命,而用ss才节省时间。

天下武功唯快不破。ss快的秘诀在于,它利用到了TCP协议栈中tcp_diag,是一个用于分析统计的模块,可以获得Linux 内核中第一手的信息,这就确保了ss的快捷高效。当然,如果你的系统中没有tcp_diag,ss也可以正常运行,只是效率会变得稍慢,但仍然比 netstat要快。

1. 命令格式

ss [参数]

ss [参数] [过滤]

2. 命令功能

用来获取socket统计信息,此命令输出的结果类似netstat输出的内容,但它能显示更多更详细的 TCP连接状态的信息,且比netstat更快速高效。

3. 命令参数

-h, –help,帮助信息

-V,–version,程序版本信息

-n,–numeric,不解析服务名称

-r,–resolve,解析主机名

-a,–all,显示所有套接字(sockets)

-l,–listening,显示监听状态的套接字(sockets)

-o,–options,显示计时器信息

-e,–extended,显示详细的套接字(sockets)信息

-m,–memory,显示套接字(socket)的内存使用情况

-p,–processes,显示使用套接字(socket)的进程

-I,–info,显示TCP内部信息

-s,–summary,显示套接字(socket)使用概况

-4,–ipv4,仅显示IPv4的套接字(sockets)

-6,–ipv6,仅显示IPv6的套接字(sockets)

-0,–packet,显示 PACKET 套接字(socket)

-t,–tcp,仅显示 TCP套接字(sockets)

-u,–udp,仅显示 UCP套接字(sockets)

-d,–dccp,仅显示 DCCP套接字(sockets)

-w,–raw,仅显示 RAW套接字(sockets)

-x,–unix,仅显示 Unix套接字(sockets)

-f,–family=FAMILY,显示FAMILY类型的套接字(sockets),FAMILY可选,支持unix, inet, inet6, link, netlink

-A,–query=QUERY,–socket=QUERY,QUERY := {all|inet|tcp|udp|raw|unix|packet|netlink}[,QUERY]

-D,–diag=FILE,将原始TCP套接字(sockets)信息转储到文件

-F,–filter=FILE,从文件中读取过滤器的信息,FILTER := [ state TCP-STATE ] [ EXPRESSION ]

4. 使用实例

例一:显示TCP连接

命令:ss -t -a

例二:显示 Sockets摘要

命令:ss -s

这里写图片描述

说明:列出当前的established,closed,orphaned and waiting TCP sockets

例三:列出所有打开的网络连接端口

命令:ss -l

# ss -l

Recv-Q Send-Q      Local Address:Port  Peer Address:Port   
0      0           127.0.0.1:smux      *:*       
0      0           *:3690              *:*       
0      0           *:ssh               *:*       


例四:查看进程使用的socket

命令:ss -pl

# ss -pl

Recv-Q Send-Q Local Address:Port  Peer Address:Port   
0      0       127.0.0.1:smux   *:*  users(("snmpd",2716,8))
0      0       *:3690        *:*   users:(("svnserve",3590,3))
0      0       *:ssh         *:*   users:(("sshd",2735,3))


例五:找出打开套接字/端口的应用程序

命令:ss -lp | grep 3306

# ss -lp|grep 1935

0      0    *:1935   *:*   users:(("fmsedge",2913,18))
0      0    127.0.0.1:19350  *:*  users:(("fmsedge",2913,17))

# ss -lp|grep 3306

0      0    *:3306   *:*   users:(("mysqld",2871,10))


例六:显示所有UDP Sockets

命令:ss -u -a

# ss -u -a

State   Recv-Q Send-Q  Local Address:Port Peer Address:Port   
UNCONN  0      0       127.0.0.1:syslog   *:*       
UNCONN  0      0       *:snmp             *:*       
ESTAB      0      0    192.168.120.203:39641  10.58.119.119:domain 


例七:显示所有状态为established的SMTP连接

命令:

ss -o state established '( dport = :smtp or sport = :smtp )' 

# ss -o state established '( dport = :smtp or sport = :smtp )' 

Recv-Q Send-Q Local  Address:Port  Peer Address:Port   


例八:显示所有状态为Established的HTTP连接

命令:ss -o state established '( dport = :http or sport = :http )'


# ss -o state established '( dport = :http or sport = :http )' 

Recv-Q Send-Q Local Address:Port   Peer Address:Port   
0      0      75.126.153.214:2164  192.168.10.42:http    


例九:列出处于FIN-WAIT-1状态的,源端口为80或443,目标网络为193.233.7/24的所有tcp套接字

命令:ss -o state fin-wait-1 '( sport = :http or sport = :https )' dst 193.233.7/24

例十:用TCP状态过滤Sockets

命令:

ss -4 state FILTER-NAME-HERE 
ss -6 state FILTER-NAME-HERE
# ss -4 state closing 

Recv-Q Send-Q   Local Address:Port   Peer Address:Port 
1      11094    75.126.153.214:http  192.168.10.42:4669 

说明:FILTER-NAME-HERE可以代表以下任何一个:

  • established
  • syn-sent
  • syn-recv
  • fin-wait-1
  • fin-wait-2
  • time-wait
  • closed
  • close-wait
  • last-ack
  • listen
  • closing

all,所有以上状态
connected,除了listen and closed的所有状态
synchronized,所有已连接的状态除了syn-sent
bucket,显示状态为maintained as minisockets,如:time-wait和syn-recv
big,和bucket相反

例十一:匹配远程地址和端口号

命令:

ss dst ADDRESS_PATTERN

ss dst 192.168.1.5

ss dst 192.168.119.113:http 

ss dst 192.168.119.113:smtp 

ss dst 192.168.119.113:443



例十二:匹配本地地址和端口号

命令:

ss src ADDRESS_PATTERN

ss src 192.168.119.103

ss src 192.168.119.103:http

ss src 192.168.119.103:80

ss src 192.168.119.103:smtp

ss src 192.168.119.103:25


例十三:将本地,远程端口与一个数比较

命令:

ss dport OP PORT 

ss sport OP PORT

输出:

这里写图片描述

说明:

ss dport OP PORT,远程端口和一个数比较

ss sport OP PORT,本地端口和一个数比较

OP可以代表以下任意一个:
- <= or le,小于或等于端口号
- >= or ge,大于或等于端口号
- == or eq,等于端口号
- != or ne,不等于端口号
- < or gt,小于端口号
- > or lt,大于端口号


例十四:ss 和 netstat 效率对比

命令:

time netstat -at

time ss

输出:
这里写图片描述

说明:用time,分别获取netstat和ss占用资源所使用的时间。在服务器连接数比较多的时候,netstat的效率完全没法和ss比。

<think>好的,用户想要一个Linux巡检脚本的介绍或者示例。首先,我需要考虑用户的需求是什么。他们可能是一个系统管理员,或者是刚开始学习Linux的人,想要自动化日常的系统检查工作。巡检脚本通常用于收集系统信息,监控资源使用情况,检查潜在问题,比如磁盘空间、内存使用、CPU负载等等。 接下来,我得考虑用户可能需要的具体功能。常见的巡检项目包括系统基本信息(如主机名、运行时间)、资源使用情况(CPU、内存、磁盘)、网络状态(开放的端口、连接数)、安全相关(SSH登录失败、sudo权限变更)、日志检查等等。用户可能还希望脚本能输出结果到日志文件,方便后续分析。 然后,用户可能有不同的Linux发行版,所以脚本需要具备通用性。比如使用常见的命令,避免特定发行版的工具。同时,脚本应该以root权限运行,否则某些命令可能无法执行,比如查看所有进程或某些日志文件。不过也要考虑到用户可能没有root权限,所以是否需要提示他们? 另外,用户可能希望脚本能够定期自动运行,比如通过cron任务。这时候可能需要指导如何设置定时任务。巡检结果的保存位置和格式也很重要,可能希望是易读的文本或者更结构化的格式,比如csv或者html,但可能基础脚本先用文本格式。 安全性方面,检查SSH失败登录和sudoers文件变动是有必要的,但用户可能没有考虑到这些,所以包括这些内容可以增加脚本的实用性。同时,日志文件的归档策略,比如保留最近几天的日志,避免占用过多磁盘空间。 用户可能对shell脚本的编写不太熟悉,所以代码需要注释清晰,结构简单,方便修改。比如使用变量定义日志路径,方便用户自定义。错误处理也需要考虑,比如命令执行失败是否继续,或者记录错误信息。 最后,可能需要提供一个示例脚本,并说明如何运行和使用,包括如何设置定时任务。还要提醒用户根据实际需求调整检查项,比如添加监控特定服务或应用程序的逻辑。可能用户的环境有特殊要求,所以示例脚本应该模块化,便于扩展。</think>以下是一个简单的 Linux 巡检脚本示例,用于收集系统关键信息并生成巡检报告。你可以根据实际需求扩展或修改检查项: ```bash #!/bin/bash # 定义巡检报告存放路径 REPORT_DIR="/var/log/system_inspection" REPORT_FILE="${REPORT_DIR}/inspection_$(date +%Y%m%d_%H%M%S).log" # 创建报告目录 mkdir -p ${REPORT_DIR} # 定义巡检函数 system_check() { echo "======================= 系统巡检报告 =======================" echo "生成时间: $(date '+%Y-%m-%d %H:%M:%S')" echo "===========================================================" # 1. 系统基本信息 echo -e "\n[系统信息]" echo "主机名: $(hostname)" echo "操作系统: $(cat /etc/os-release | grep "PRETTY_NAME" | cut -d'"' -f2)" echo "内核版本: $(uname -r)" echo "运行时间: $(uptime -p)" # 2. 资源使用情况 echo -e "\n[资源状态]" echo "CPU负载(1/5/15分钟): $(uptime | awk -F'load average: ' '{print $2}')" echo "内存使用:" free -h | sed -n '1,2p' echo -e "\n磁盘使用:" df -hT -x tmpfs -x devtmpfs | grep -v overlay # 3. 网络状态 echo -e "\n[网络状态]" echo "监听端口:" ss -tuln | grep LISTEN echo -e "\n连接统计:" netstat -nat | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}' # 4. 安全相关检查 echo -e "\n[安全检查]" echo "SSH登录失败记录:" journalctl -u sshd | grep Failed | tail -n 5 echo -e "\nSudo授权变更检查:" ls -l /etc/sudoers.d/ # 5. 日志检查 echo -e "\n[日志检查]" echo "最近系统警告日志:" grep -i 'warning\|error' /var/log/syslog | tail -n 5 # 6. 自定义检查项(示例) echo -e "\n[自定义检查]" echo "关键进程检查:" for proc in crond sshd; do pgrep $proc >/dev/null && echo "[OK] $proc 正在运行" || echo "[ERROR] $proc 未运行!" done } # 执行巡检并输出报告 system_check | tee ${REPORT_FILE} 2>&1 # 权限设置 chmod 600 ${REPORT_FILE} echo -e "\n巡检完成,报告已保存至: ${REPORT_FILE}" ``` -- ### 主要功能说明: 1. **系统基本信息**:主机名、OS版本、运行时间 2. **资源监控**:CPU负载、内存使用、磁盘空间 3. **网络状态**:监听端口、TCP连接统计 4. **安全检查**:SSH登录失败记录、sudo配置变更 5. **日志检查**:系统警告/错误日志 6. **自定义检查**:关键进程状态检查 --- ### 使用说明: 1. 保存为 `system_check.sh` 2. 添加执行权限: ```bash chmod +x system_check.sh ``` 3. 需要 root 权限执行: ```bash sudo ./system_check.sh ``` --- ### 扩展建议: 1. **定时任务**:通过 crontab 定期执行 ```bash # 每天8点执行 0 8 * * * root /path/to/system_check.sh ``` 2. **邮件通知**:添加 `mail` 命令发送报告 3. **阈值告警**:添加资源使用率判断(如磁盘超过90%告警) 4. **日志归档**:添加日志保留策略(保留最近30天) 5. **性能趋势**:将数据存入数据库配合可视化展示 建议根据实际环境调整检查项,重点监控业务相关的重要服务和指标。对于生产环境,建议配合专业的监控系统(如Zabbix、Prometheus)使用更完善。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值