登录
首页 >  Golang >  Go问答

正确地将输入从 stdin 写入到 stdout,就像在 bash 中一样

来源:stackoverflow

时间:2024-02-12 11:00:24 409浏览 收藏

今天golang学习网给大家带来了《正确地将输入从 stdin 写入到 stdout,就像在 bash 中一样》,其中涉及到的知识点包括等等,无论你是小白还是老手,都适合看一看哦~有好的建议也欢迎大家在评论留言,若是看完有所收获,也希望大家能多多点赞支持呀!一起加油学习~

问题内容

我需要实现 bash 命令的模拟:

ssh -p 8022 root@${h} -i \~/.ssh/eve -c 'tcpdump -u -i '${i}' -w -' | /applications/wireshark.app/contents/macos/wireshark -i - -k &

在这里,我在外部主机上使用了tcpdump命令,并通过管道在wireshark命令中接收每个数据包的数据。这是可能的,因为在 tcpdump 中使用了标志 -u。它等待完整的数据包,然后将其发送到标准输出,然后通过管道发送到wireshark。 wireshark 可以理解它并以在线模式打印每个数据包。工作正常!我需要在 go 上实现此行为。

这是我尝试的:

func main() {

    command := "ssh -i $home/.ssh/id_rsa.sbm [email protected] -p 21057 -c \"sudo tcpdump -u -i any host 10.1.1.1 -w -\""
    cmd := exec.command("bash", "-c", command)
    stdout, _ := cmd.stdoutpipe()

    reader := bufio.newreader(stdout)
    go func(reader io.reader) {
        scanner := bufio.newscanner(reader)
        for scanner.scan() {
            os.stdout.write(scanner.bytes())
        }
    }(reader)

    if err := cmd.start(); nil != err {
        log.fatalf("error starting program: %s, %s", cmd.path, err.error())
    }
    cmd.wait()
}

我用名称 stdinoutexample 构建了它并运行:

./stdinoutExample | /Applications/Wireshark.app/Contents/MacOS/Wireshark -i - -k 2>/dev/null &

wireshark接收数据但不理解。它打印某种垃圾并抱怨数据包字段错误。 那么我如何才能像 bash 中那样正确地将数据传输到wireshark呢?


正确答案


如果有人感兴趣,我找到了正确的方法。

stdout, _ := cmd.StdoutPipe()

PacketsChan = make(chan []byte)

go ReadChanOutStd()
PacketsChan <- PcapHead
go ReadfromBufferOutChan(stdout)

var (
    PcapHead = []byte{0xd4, 0xc3, 0xb2, 0xa1, 0x02, 0x00, 0x04, 0x00,
        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
        0x00, 0x00, 0x04, 0x00, 0x14, 0x01, 0x00, 0x00}
    PacketsChan chan []byte
)

func ReadfromBufferOutChan(R io.ReadCloser) {
    for {
        buf := make([]byte, 1024, 1024)
        n, _ := R.Read(buf)
        if n > 0 {
            d := buf[:n]
            res := bytes.Compare(d, PcapHead)
            if res != 0 {
                PacketsChan <- d
            }
        }
    }
}
func ReadChanOutStd() {
    for {
        select {
        case Buf := <-PacketsChan:
            os.Stdout.Write(Buf)
        }
    }
}

以上就是本文的全部内容了,是否有顺利帮助你解决问题?若是能给你带来学习上的帮助,请大家多多支持golang学习网!更多关于Golang的相关知识,也可关注golang学习网公众号。

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