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

求PowerShell中等价于strings -n8的命令,提取tcpdump输出文本

Windows 10 PowerShell 替代 strings -n8 提取tcpdump气象数据方案

背景

在树莓派上通过以下bash命令捕获USB端口气象hub的HTTP数据,并用Python脚本解析:

sudo tcpdump -A -n -p -l -i eth1 -s0 -w - tcp dst port 80 |
  stdbuf -oL strings -n8 |
  ./parser

迁移到Windows 10后,tcpdump单独执行正常,但后续的管道处理(stdbuf -oL strings -n8)无法工作,输出乱码。需要在PowerShell中实现等价于strings -n8的功能,同时解决编码和缓冲问题。

核心需求拆解

  • strings -n8:提取输出中长度≥8的可打印字符串
  • stdbuf -oL:设置标准输出为行缓冲,避免输出延迟,确保实时传递给后续脚本

PowerShell等价实现

完整命令(对接Python解析脚本)

./tcpdump -A -n -p -l -i eth1 -s0 -w - tcp dst port 80 | ForEach-Object {
    # 解决编码乱码:将tcpdump的ASCII输出转换为PowerShell可识别的字符串
    $asciiStr = [System.Text.Encoding]::ASCII.GetString([System.Text.Encoding]::Default.GetBytes($_))
    # 提取长度≥8的可打印字符串(匹配非空白开头结尾、中间至少6个字符,总长度≥8)
    $validStrings = [regex]::Matches($asciiStr, '\S.{6,}\S')
    foreach ($str in $validStrings) {
        Write-Output $str.Value
        # 强制刷新输出,模拟stdbuf -oL的行缓冲效果
        [Console]::Out.Flush()
    }
} | python ./parser.py

测试命令(输出到日志验证)

如果需要先验证输出效果,可将结果写入日志:

./tcpdump -A -n -p -l -i eth1 -s0 -w - tcp dst port 80 | ForEach-Object {
    $asciiStr = [System.Text.Encoding]::ASCII.GetString([System.Text.Encoding]::Default.GetBytes($_))
    $validStrings = [regex]::Matches($asciiStr, '\S.{6,}\S')
    foreach ($str in $validStrings) {
        Write-Output $str.Value
        [Console]::Out.Flush()
    }
} | Set-Content -Encoding ASCII program.log

补充说明

  1. 编码处理:Windows下tcpdump默认输出ASCII编码,PowerShell默认用UTF-16,通过编码转换可避免乱码。
  2. 正则匹配:\S.{6,}\S 是对strings -n8的等价模拟,确保只保留长度≥8的有效字符串(过滤短的垃圾字符)。
  3. Python脚本适配:如果解析脚本是Python,建议在开头添加编码配置,确保正确读取输入:
import sys
# 强制设置标准输入为ASCII编码
sys.stdin.reconfigure(encoding='ascii')

内容的提问来源于stack exchange,提问作者Cor Dikland

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 08:52:12