美文网首页
golang exec无法获取到命令后续输出问题(比如 tsha

golang exec无法获取到命令后续输出问题(比如 tsha

作者: 哆啦在这A梦在哪 | 来源:发表于2023-03-30 11:51 被阅读0次

一。提出问题,cmd.StderrPipe()和cmd.StdoutPipe()都无法获取后续输出

有时候在执行 exec.Command 的命令的时候,需要实时获取命令的输出,并不是一次性输出的,一般情况下都会用 cmd.StderrPipe() 以及 cmd.StdoutPipe() 来获取,比如你执行 ping 命令,但是,有些命令,只能接受第一次的输出,后续的无法接受到,拿这里的 tshark 命令为例

二,问题原因解释,可能是命令本身原因

这可能是由于 tshark 命令在进行数据捕获时会一直输出,直到用户中断命令或者捕获到结束符为止。因此,cmd.StderrPipe()cmd.StdoutPipe()只能获取tshark命令的初始输出,而无法获取后续输出。

要解决此问题,您可以通过在执行tshark命令时加入“-l”选项来强制tshark在输出每一行数据后刷新缓冲区,这样您就可以实时获取到输出。例如:

exec.Command("bash", "-c", "tshark -l -i 你的网卡名称 -n -T fields -e eth.src -e ip.src port 68")

三。代码例子(只不过在命令中 加了一个 -l 而已)

func useScan() {
    go func() {
        for {
            cmd := exec.Command("bash", "-c", "tshark -l -i 你的网卡名称 -n -T fields -e eth.src -e ip.src port 68")
            cmd.Run()
            time.Sleep(time.Second * 2)
        }

    }()
    cmd := exec.Command("bash", "-c", "tshark -l -i 你的网卡名称 -n -T fields -e eth.src -e ip.src port 68")
    stderr, err := cmd.StderrPipe()
    if err != nil {
        return
    }
    stdout, err := cmd.StdoutPipe()
    if err != nil {
        return
    }

    if err := cmd.Start(); err != nil {
        return
    }
    go func() {
        scanner := bufio.NewScanner(stderr)
        for scanner.Scan() {
            line := scanner.Text()
            log.Println("stderr:", line)
        }
    }()
    go func() {
        scanner := bufio.NewScanner(stdout)
        for scanner.Scan() {
            line := scanner.Text()
            log.Println("stdout:", line)
        }
    }()
    cmd.Wait()
}

这样,您就可以实时获取tshark命令的输出了。

四。结论及回顾

在执行命令中,要注意该命令是否只写入缓冲(该命令自己的缓冲),因为他不输出到我们程序的管道中,我们就无法获取到他的输出,其他命令同理,其他无法获取内容的,注意一下就行,看看哪个参数可以强制在输出每一行数据后刷新缓冲区,这样您就可以实时获取到输出

相关文章

网友评论

      本文标题:golang exec无法获取到命令后续输出问题(比如 tsha

      本文链接:https://www.haomeiwen.com/subject/wiaqddtx.html