linux - 动态修改数据流

标签 linux perl text protocols telnet

我需要劫持并修改数据流。该流由固定宽度的命令组成。每个命令都是一个新行,文档说每个命令以 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/

相关文章:

regex - 如何在 bash 中删除从开始到某个特定选定单词的文本?

Perl - 将参数作为散列键值对问题传递给子例程

Perl 中变量赋值的正则表达式失败

html - 将旋转文本锚定到父元素的上限

java - 获取包含的 jar 的 NoClassDefFoundError

c++ - strtod() 的可怕错误 : glibc-2. 13 不向后兼容 glibc-2.9?

.net - 在 Linux 上编译 MonoDevelop 5.3 时出错

python-3.x - 如何从Python脚本运行Perl程序,同时接收日志并避免脚本返回代码崩溃:-9

c# - 如何逐行读取 StreamReader 文本

javascript - 尝试使用 filter() 从节点获取文本,但返回一个对象?