我需要劫持并修改数据流。该流由固定宽度的命令组成。每个命令都是一个新行,文档说每个命令以 STX
开头和结尾。/ETX
对(文本的开头和结尾)
发送系统使用串行,但受到通过 IP 与我们的 PBX 通信的 iPocket 设备的攻击。据我所知,它只是将串行转换为远程登录,这应该会让事情变得非常简单。
我需要查找的字符串以 NAM
开头。结构是这样的:
STX NAM EXT# LASTNAME,FIRSTNAME ETX
我需要替换,FIRSTNAME
带有空格,因此不会改变命令的长度。
我一直在尝试以下操作,虽然它根据需要在两个方向上端到端传递数据,并删除所需的数据,但它并没有保持命令的长度。
ipocket <-> nc -kl 1100 | sed 's/,[^,]*/ /g' | nc target_ip target_port <-> PBX
我将使用 Linux 盒子来完成这项任务。我相当确定这可以在 perl 或 python 中非常简单地完成,但我不知道从哪里开始。任何帮助将不胜感激!
最佳答案
这样就可以了,一行一行
perl -pe '/^STX\s\w+\s\d+#\s\w+,(\w+)\sETX$/;$len=length($1);s/$1/" " x $len/e'
我测试过使用。
echo "STX NAM 100# LASTNAME,FIRSTNAME ETX" | perl -pe '/^STX\s\w+\s\d+#\s\w+,(\w+)\sETX$/;$len=length($1);s/$1/" " x $len/e'
它返回
STX NAM 100# LASTNAME, ETX
确保字符串与我测试的长度相同。
echo "STX NAM 100# LASTNAME,FIRSTNAME ETX" | perl -pe '/^STX\s\w+\s\d+#\s\w+,(\w+)\sETX$/;$len=length($1);s/$1/" " x $len/e'| perl -pe 'print length($_);'
给出 36。
echo "STX NAM 100# LASTNAME,FIRSTNAME ETX"|perl -pe 'print length($_);'
给出 36。
关于linux - 动态修改数据流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3540479/