You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在Bash脚本中提取sshd监听端口至数组的方法

提取sshd监听端口到Bash数组的几种方法

以下几种方式可以直接从你的portstr变量或一步到位提取端口并存入数组:

方法1:使用Sed正则提取

利用Sed的替换功能捕获冒号与空格之间的数字:

portarray=($(echo "$portstr" | sed -n 's/.*:\([0-9]*\) .*/\1/p'))
  • -n 表示只打印匹配的行
  • 正则.*:\([0-9]*\) .*匹配任意字符直到冒号,捕获后续的数字序列,再匹配后面的空格及剩余内容
  • \1 引用捕获的数字部分,p 打印结果

方法2:使用Awk字段拆分

Awk可以按分隔符拆分字段,适配lsof的输出格式:

portarray=($(echo "$portstr" | awk -F'[: ]' '{print $9}'))
  • -F'[: ]' 指定分隔符为冒号或空格
  • 第9个字段恰好对应你给出的lsof输出中的端口号

如果要适配不同格式的lsof输出,更通用的写法是拆分最后一个字段:

portarray=($(echo "$portstr" | awk '{split($NF, port_part, /[: ]/); print port_part[2]}'))
  • $NF 取每行最后一个字段(如TCP *:22 (LISTEN))
  • split 用冒号和空格拆分该字段,取第二个元素即为端口

方法3:使用Grep的PCRE模式(需GNU Grep)

启用Perl兼容正则表达式,精准匹配端口部分:

portarray=($(echo "$portstr" | grep -oP ':\K\d+(?= )'))
  • -o 只输出匹配的部分,-P 启用PCRE
  • :\K 忽略前面的冒号,\d+(?= ) 匹配后面跟着空格的数字序列

一步到位(无需先存portstr)

直接整合lsof过滤与端口提取,避免中间变量:

portarray=($(lsof -i -P -n | awk '/LISTEN/ && /sshd/ {split($NF, p, /[: ]/); print p[2]}'))

验证结果

执行完上述任意命令后,可通过以下命令查看数组内容:

echo ${portarray[0]}  # 输出22
echo ${portarray[1]}  # 输出22

内容的提问来源于stack exchange,提问作者Shaun.M

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 20:45:42