我正在编写一个小项目来管理 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)
我只能显示远程命令的输出,但是如何将这些输出保存在另一个变量中以便将来处理。非常感谢。
不要用
session.Stdout
覆盖 os.Stdout
,这只会将输出发送到控制台,而是从 Reader
返回的 session.StdoutPipe()
中读取。
您可以将会话的输出捕获到字节缓冲区而不是操作系统。
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())
}