使用 socat 客户端执行的进程的过滤标准输入

使用 socat 客户端执行的进程的过滤标准输入

我的问题是:有没有办法预处理通过 socat 客户端执行的命令的标准输入。

socat上下文:我正在使用以下命令启动反向 shell :

$> socat -T30 "openssl-connect:api.hoposhell.com:10000,verify=0,keepalive" "exec:$SHELL,pty,stderr,setsid"

为了保持连接,我的服务器每 10 秒发送一次 ACK ASCII 字符 (0x06)。然而,这在某些应用程序中会产生副作用,并且^F会出现一些字符。

在 bash 或 zsh 中,可以使用 sed 管道,如下所示:

$> echo "rick roll" | sed 's/r//g'
ick oll

有没有办法用 socat 做类似的事情?(例如在套接字读取和执行命令之间使用 cat)

笔记:

  • 这是对该问题的后续跟进 使用 socat 保持 SSL 客户端连接
  • 如果可以解决这个问题,我很乐意使用其他 ASCII 字符(0x06 除外)
  • 我在 Linux 和 MacOS (Big Sur) 下使用 bash 和 zsh

编辑:简单等效示例

假设我用(机器 1)监听反向 shell

1> socat -d -d TCP4-LISTEN:4242 STDOUT

并将反向 shell 与(机器 2)连接

2> socat TCP4:localhost:4242 SYSTEM:/bin/bash,pty,setsid,stderr

我现在可以使用来自计算机 1 的 shell(在计算机 2 上执行)现在我希望每次我将字符 0x06 从 1 发送到 2 时,它都会被忽略。

现在,如果我替换为:

2>  socat TCP4:localhost:4243 SYSTEM:"/usr/bin/sed -u 's/a/b/g' | bash -i",pty,setsid,stderr

现在,当所有“a”都变成“b”时,我应该会得到一个反向 shell,如下所示(在机器 1 上)。但我遇到了两个问题:

  • 当我输入“a”时,“a”仍然显示(两次),如下所示(我按下“la”+ ENTER)
bash-3.2$ la
la
lb
bash: lb: command not found
bash-3.2$ 
  • 当我的服务器发送一些“a”字符时,它们仍然按原样显示
bash-3.2$ aaaaaaaaaa
aaaaaaaaaa
bbbbbbbbbb
bash: bbbbbbbbbb: command not found
bash-3.2$ 

我的目标是分别获得:

bash-3.2$ lb
bash: lb: command not found
bash-3.2$ bbbbbbbbbb
bash: bbbbbbbbbb: command not found

答案1

帖子 在 socat 中使用 Sed 进行端口转发 建议使用类似以下命令:

socat TCP-LISTEN:8002,fork SYSTEM:/path/to/replace.sh

该文件replace.sh应该具有执行权限。

a将全部更改为的示例b

#!/bin/bash
sed -u 's/a/b/g'

对于 sed 来说,使用-u(无缓冲)非常重要。

相关内容