2016-09-28 52 views
0

我有一种方法可以产生交互式进程,现在如何在产卵后记录所有内容(包括stdin和stdout)?如何在产生交互式程序后捕获/记录所有内容

例如,

func execute(cmd1 string, slice []string) { 

    cmd := exec.Command(cmd1, slice...) 

    // redirect the output to terminal 
    cmd.Stdout = os.Stdout 
    cmd.Stderr = os.Stderr 
    cmd.Stdin = os.Stdin 

    cmd.Run() 
} 

.. 交互式节目可以是: 执行(FTP)

我想我必须DUP标准输入,标准输出和阅读单独的线程写入。

回答

1

而不是重定向它的输出到终端阅读它,然后你可以登录/打印做任何你想要的。

stdout, err := cmd.StdoutPipe() 
    b, _ := ioutil.ReadAll(stdout) 
    fmt.Println(string(b)) 

虽然有很多选项,但类似上面的代码可以工作。我想你会想要删除所有必须重定向到终端的代码。

+0

感谢。我不明白以下语法:b,_ – Victor

+0

不能使用cmd.Stdout(类型io.Writer)作为类型io.Reader参数到ioutil.ReadAll: \t io.Writer没有实现io.Reader(缺少Read方法) – Victor

+0

我在运行两次同样的错误之前和之后使用你的语句。 – Victor

0

你可以输出存储在临时缓冲区,并把它写几个地方

outBuf := bytes.Buffer{} 
cmd := exec.Command(cmd1, slice...) 

cmd.Stdout = &outBuf 

cmd.Run() 

if outBuf.Len() > 0 { 
    log.Printf("%s", outBuf.String()) 
    fmt.Fprintf(os.Stdout, "%s", outBuf.String()) 
} 
+0

好主意,但是如果程序是交互式的,比如ftp,那么它将不会打印,直到运行命令退出。例如,如果cmd1是'ftp' – Victor

相关问题