在Golang Pty中丢弃输入的正确方法

时间:2019-05-30 03:37:42

标签: go pty

我将golang pty library用于交互式Shell控制台,用户可以在其中运行任何类型的命令。

问题是我找不到一种区分用户输入和shell输出的好方法,因为Stdin,Stdout和Stderr被分配到同一文件。

这里是一个例子:

func main() {

    cmd := exec.Command("sh", "-c", "mongo --quiet --host=localhost test")
    f, _ := pty.Start(cmd)
    cmd.Start()

    time.Sleep(1 * time.Second) // some time to start

    for ;; {

        io.WriteString(f, "sleep(1000);Date.now();\n")
        stdoutScanner := bufio.NewScanner(f)

        go func() {
            for stdoutScanner.Scan() {
                text := stdoutScanner.Text()
                println(text)
            }
        }()

        time.Sleep(1200 * time.Millisecond)
    }
}

这段代码产生如下输出:

> sleep(1000);Date.now();sleep(1000);Date.now();
1559185677551
sleep(1000);Date.now();
1559185679053
1559185691069
now();
1559185692573
);Date.now();sleep(1000);Date.now();
1559185694074
ep(1000);Date.now();sleep(1000);Date.now();

我需要的只是

1559185677551
1559185679053
1559185691069
1559185692573
1559185694074

我可以过滤掉contains个用户输入但不稳定的所有扫描文本-在该示例中,您可以找到类似ep(1000);Date.now();的片段

有更好的解决方案吗?

0 个答案:

没有答案