Golang清除StdinPipe中的内容

时间:2018-07-19 14:04:53

标签: go ssh pipe buffer

我正在使用SSH会话来控制远程计算机上的某些提示。我的连接正常,并且我的代码正确地响应了两个提示(正确的提示是相同的,并且需要相同的响应),但是无法响应接下来的两个提示。我相信后两个提示会得到与前两个提示相同的响应,但是在某些情况下,它不会告诉我正在发送的内容。以下代码显示了相关的结构以及相关的管道和变量的创建。某些数据由于明显的原因而被更改。

type Connection struct {
    *ssh.Client
    password string
}

创建代码所需的连接和输入/输出管道:

session, err := conn.NewSession()

in, err := session.StdinPipe()
if err != nil {
    log.Fatal(err)
}

out, err := session.StdoutPipe()
if err != nil {
    log.Fatal(err)
}

最后,匿名go函数从数据输出流中读取字节。字节提取正常(我已经在那里的printf验证过了)

go func(in io.WriteCloser, out io.Reader, output *[]byte) {
        var (
            line string
            r    = bufio.NewReader(out)
        )
        for {
            b, err := r.ReadByte()
            if err != nil {
                break
            }

            /*
                Hand our output string the byte, perhaps I can just append a new string after each line completes to save time?
            */
            *output = append(*output, b)

            /*
                If we reach a new line character then we clear the line to make way for the next
                I'm printing it for debugging purposes and so you can see the output of all the commands run :)
            */
            if b == byte('\n') {
                line += string(b)
                fmt.Println(line)
                line = ""
                continue
            }

            /*
                Here we check each line to see whats going on inside it

                I think the problem right now has to do with not being able to clear the 'in' WriteCloser
            */
            line += string(b)
            if strings.HasSuffix(line, "Please input next ip for route:") {
                _, err = in.Write([]byte("127.0.0.1\n"))
                if err != nil {
                    break
                }
            } else if strings.HasPrefix(line, "Password:") {
                _, err = in.Write([]byte("secretpass\n"))
                if err != nil {
                    break
                }
            }
        }
    }(in, out, &output)

现在,此客户端到达的前两个提示是Password:,它获得了正确的输入secretpass。接下来的两个需要不同的字符串。我认为问题与原始secretpass保留在WriteCloser中有关。我很新,所以我不知道是否有办法清除WriteCloser中的基础缓冲区,或者我是否对此很了解,而我需要找到另一种解决方法

所以具体的问题是:

  

如何清除在WriteCloser中找到的缓冲区,以便当我给   它是新输入,是否会在第一个提示下读取旧输入?

还有一个奖励问题:

  

是否可以读取Write Closer的当前状态以查看   我写的是它还是仅用于输入的内容?

0 个答案:

没有答案