在 Golang 中使用 ssh 库时如何抓取输出

问题描述 投票:0回答:2

我正在编写一个小项目来管理 Cisco 交换机,一切都很好,直到我需要 从 Stout 获取输出。这是我的代码。

func Return_current_user(conn *ssh.Client) {
    session, err := conn.NewSession()
    if err != nil {
        log.Fatal("Failed to create session %v: ", err)
    }
    
    sdtin, _ := session.StdinPipe()
    session.Stdout = os.Stdout
    session.Stdin = os.Stdin
    session.Shell()

    cmds := []string{
        "conf t",
        "show users",
        
    }
    for _, cmd := range cmds {
        fmt.Fprintf(sdtin, "%s\n", cmd)
    }
    session.Wait()
    session.Close()
}

这是我在屏幕上的输出:

NAME     LINE         TIME         IDLE          PID COMMENT
admin    pts/0        Aug 16 06:13 00:02       29059 (192.168.57.1)
NAME     LINE         TIME         IDLE          PID COMMENT
admin    pts/0        Aug 16 06:13 00:02       29059 (192.168.57.1)

我只能显示远程命令的输出,但是如何将这些输出保存在另一个变量中以便将来处理。非常感谢。

go
2个回答
1
投票

不要用

session.Stdout
覆盖
os.Stdout
,这只会将输出发送到控制台,而是从
Reader
返回的
session.StdoutPipe()
中读取。


0
投票

您可以将会话的输出捕获到字节缓冲区而不是操作系统。

func Return_current_user(conn *ssh.Client){
    session, err := conn.NewSession()
    if err != nil {
        log.Fatal("Failed to create session %v: ", err)
    }
    
    sdtin, _ := session.StdinPipe()

    //here
    var b, e bytes.Buffer
    session.Stdout = &b
    session.Stderr = &e

    session.Shell()

    cmds := []string{
        "conf t",
        "show users",
        
    }
    for _, cmd := range cmds {
        fmt.Fprintf(sdtin, "%s\n", cmd)
    }

    session.Wait()
    session.Close()

    fmt.Println(b.string())
    fmt.Println(e.string())
}
© www.soinside.com 2019 - 2024. All rights reserved.