Golang区别于bytes.Buffer的io.Pipe

因为终身学习博客博主的 GoCD 开源持续交付平台的缘故,碰到了一个问题

怎么实时获取 SSH 的执行结果并展示给用户?

方案一 session.Run

终身学习博客博主反复的看了几遍 golang 的 ssh 包和 io.Writer 的相关实现。开始使用的方案是将 ssh.Session.Stdout 重定向至 bytes.Buffer,使用 ssh.Run 来远程执行脚本,然后使用 buffer 的 String 方法获取脚本的执行结果。
这个方案有一个比较大的弊端:无法实时看到运行中发生的事情,可控性比较差。而且我也用过一些其他的 CI、CD 工具,基本上日志都是可以即时查看的,所以我改变了方案。

方案二 session.Start + bytes.Buffer

这一次使用 session.Start 配合 session.Wait 执行脚本并同步不断读取远程输出。测试过程中发现命令执行完很久了 bytes.Buffer 中的数据还是没有完全 get 到,是缓存问题。
所以我费劲找了一个无缓存的 Writer:io.Pipe

方案三 io.Pipe

换成 io.Pipe 之后远程输入可以即时读取了,我也将实时输出展示到了 Web 管理界面。

Last modification:April 9th, 2018 at 01:06 am

Leave a Comment