我将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();
的片段
有更好的解决方案吗?