2015-09-03 23 views
0

我想從通過VB.NET命令結果,它返回空字符串作爲顯示在下面的代碼:Renci SSH.NET - 沒有結果字符串返回opmnctl

Dim connInfo As New Renci.SshNet.PasswordConnectionInfo(serverip, user, pass) 
Dim sshClient As New Renci.SshNet.SshClient(connInfo) 

Dim cmd As Renci.SshNet.SshCommand 
Using sshClient 
    sshClient.Connect() 

    cmd = sshClient.RunCommand("opmnctl status -l") 
    MsgBox(cmd.Result) 

    sshClient.Disconnect() 
End Using 

而當我試着用"ls -ltr"這樣的正常命令來成功返回結果。

是否有另一種獲取結果字符串的方法?或者命令是否在Renci上不支持OPMN Oracle引擎?任何幫助,將不勝感激。

回答

1

如果opmnctl由於某種原因失敗,它可能會在錯誤輸出上產生一條消息。所以請檢查cmd.Errorcmd.ExitStatus


請注意,.RunCommand方法使用非交互式終端,可能會導致某些命令出現問題。

當使用非交互式終端作爲不同的啓動腳本集時和/或採用腳本中的不同分支時(基於TERM環境變量的值),可以設置特別不同的環境。 。

就你的情況來看,opmnctl未包含在PATH的非交互式終端中。

當您在SSH客戶端中強制使用非交互式終端時,您應該會遇到同樣的問題。

例如:

  • 在OpenSSH命令行ssh客戶端,使用-T開關(禁用僞終端分配)。

    ssh -T [email protected] opmnctl status -l 
    
  • 用PLINK(來自膩子封裝)相同

    plink.exe -T [email protected] opmnctl status -l 
    

(該-T當在命令行被指定的命令無論如何應當隱式)


解決方案是:

  • 修復啓動腳本甚至包括非交互終端(首選)
  • 使用在你的命令的完整路徑opmnctlopmnctlPATH
  • 修改SSH.NET代碼發出SendPseudoTerminalRequest請求.RunCommand執行(我沒有測試這個)。
+0

我在交互式終端上測試命令,它給出了輸出,但是當我嘗試使用這個庫時,它不顯示任何輸出,命令中沒有錯誤。我也嘗試了你在PuTTY中提出的建議,在我登錄會話後自動關閉,我不知道什麼是錯的。當我嘗試錯誤它說opmnctl沒有找到,退出狀態是127. –

+0

我想通了,我把opmnctl命令bin或可執行文件的整個目錄,它返回我想要的結果。 –

+0

很好。我已經更新了我的答案,給你一些背景。 –