求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
补充说明
- 编码处理:Windows下tcpdump默认输出ASCII编码,PowerShell默认用UTF-16,通过编码转换可避免乱码。
- 正则匹配:
\S.{6,}\S是对strings -n8的等价模拟,确保只保留长度≥8的有效字符串(过滤短的垃圾字符)。 - Python脚本适配:如果解析脚本是Python,建议在开头添加编码配置,确保正确读取输入:
import sys # 强制设置标准输入为ASCII编码 sys.stdin.reconfigure(encoding='ascii')
内容的提问来源于stack exchange,提问作者Cor Dikland
相关产品推荐
相关产品推荐

