2014-01-14 16 views
1

我試圖實施監控各種Cisco ASR參數,對路由器執行ssh並使用show命令獲取結果。這裏是工作流程的一部分(省略處理錯誤): 使用go ssh庫與思科設備通話

client, err := ssh.Dial("tcp", "172.16.32.95:22", config) 
session, err := client.NewSession() 
sshOut, err := session.StdoutPipe() 
sshIn, err := session.StdinPipe() 
err := session.RequestPty("xterm", 80, 40, modes) 
err := session.Shell() 

在這一點上,我可以寫sshInsshOut讀取。 由於思科(和其他供應商)的路由器不支持exec'ing命令(如果我錯了,請糾正我),我所能做的就是將命令傳遞到shell並讀取輸入,直到找到命令提示符。

好的。下面是我使用的第一個命令提示符之前跳過最初的路由器的問候部分:

buf := make([]byte, 1000) 
n, err := sshOut.Read(buf) //this reads the ssh terminal welcome message 
loadStr := "" 
if err == nil { 
    loadStr = string(buf[:n]) 
} 
for (err == nil) && (!strings.Contains(loadStr, "[local]")) { 
    n, err = sshOut.Read(buf) 
    loadStr += string(buf[:n]) 
} 
fmt.Println(loadStr) 

這將產生:

Last login: Tue Jan 14 17:29:06 -0500 2014 on pts/1 from 172.16.35.101. 
Cisco Systems SSI 
[local]ewag# 

要運行命令我寫sshIn

if _, err := sshIn.Write([]byte("show clock\r")); err != nil { 
    panic("Failed to run: " + err.Error()) 
} 

而且閱讀迴應同樣的方式,我讀最初的問候,這產生(與問候):

Last login: Tue Jan 14 18:06:14 -0500 2014 on pts/2 from 10.7.7.14. 
Cisco Systems SSI 
[local]ewag# 
show clock 
Tuesday January 14 18:09:19 EST 2014 
[local]ewag# 

還是一切都好。但是,當我嘗試發送略長命令,FE:

if _, err := sshIn.Write([]byte("show session progress ipsg-service ipsg-gprs-svc\r")); err != nil { 
    panic("Failed to run: " + err.Error()) 
} 

輸出中斷:

Last login: Tue Jan 14 18:09:19 -0500 2014 on pts/2 from 10.7.7.14. 
Cisco Systems SSI 
[local]ewag# 
show session progress ipsg 
-service ipsg-gprs-svc 
Unknown command - "ipsg-service", unrecognized keyword 
[local]ewag# 

我發在某些時候得到了分裂的命令,但命令的結果輸出正確傳遞不分裂。

那麼問題是如何解決這個問題?現在我沒有想法。 感謝您的關注!

回答

1

愚蠢的錯誤。我請求PTY這樣:

session.RequestPty("vt100", 80, 40, modes) 

這給了我寬度 40個字符,並高度 80個字符。 在我的情況下,正確的調用應該是:

session.RequestPty("vt100", 0, 200, modes) 

這樣,一切正常。並且不需要明確地改變終端寬度。

0

問題已通過在思科上設置終端寬度來解決。因此,在會話建立之後,我發送命令:

terminal width 200 

到路由器。

現在長命令在答覆中正確顯示。