如何编写Shell脚本根据输入端口号精准查询对应服务名称及运行状态
端口查询Shell脚本实现方案
问题原因
你之前使用的grep :80属于模糊匹配,只要输出内容中包含子串:80就会被命中,因此:8080也会被匹配到,导致结果不符合预期。
修正后的单条查询命令
使用单词边界匹配规则实现指定端口的精确匹配:
sudo netstat -lntup | grep ":${port}\b"
其中\b是正则表达式的单词边界标识,只会匹配:端口号后紧跟非单词字符(此处为端口后的空格)的情况,不会匹配到后面还有其他数字的端口(如8080)。
完整可运行Shell脚本
#!/bin/bash # 校验输入参数是否存在 if [ $# -ne 1 ]; then echo "用法: $0 <端口号>" exit 1 fi port=$1 # 校验端口是否为1-65535的合法正整数 if ! [[ $port =~ ^[1-9][0-9]*$ ]] || [ $port -gt 65535 ]; then echo "错误:请输入1-65535范围内的合法端口号" exit 1 fi # 查询指定端口信息 result=$(sudo netstat -lntup | grep ":$port\b") if [ -z "$result" ]; then echo "端口 $port 没有服务在监听" else echo "端口 $port 监听信息如下:" echo "$result" | awk '{ printf "协议: %s\n状态: %s\n服务PID/名称: %s\n", $1, $6, $7 }' fi
脚本使用说明
- 将上述内容保存为
port_query.sh - 赋予执行权限:
chmod +x port_query.sh - 执行查询:
sudo ./port_query.sh 80 - 执行示例输出:
端口 80 监听信息如下: 协议: tcp6 状态: LISTEN 服务PID/名称: 1192/apache2
可选优化(兼容新系统)
部分新发行版已默认不预装netstat,可替换为更高效的ss命令,对应查询语句修改为:
result=$(sudo ss -lntup | grep ":$port\b")
内容的提问来源于stack exchange,提问作者Sivaganesh Tamilvendhan
相关产品推荐
相关产品推荐

