1

我正在尝试通过 VB.NET 从命令中获取结果,它返回空字符串,如下面的代码所示:

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"它会成功返回结果。

还有另一种获取结果字符串的方法吗?或者opmnctlRenci 不支持 OPMN Oracle 引擎的命令?任何帮助,将不胜感激。

4

1 回答 1

2

如果由于opmnctl某种原因失败,它可能会在错误输出中产生一条消息。

所以还要检查cmd.Errorcmd.ExitStatus


请注意,该.RunCommand方法使用非交互式终端,这可能会导致某些命令出现问题。

具体地,当使用非交互终端时,可以设置不同的环境,因为执行不同的启动脚本集和/或在脚本中采用不同的分支(基于TERM环境变量的值)。

在您的情况下,似乎非交互式终端opmnctl中不包含。PATH

当您在 SSH 客户端中强制使用非交互式终端时,您应该会遇到同样的问题。

例如:

  • 对于 OpenSSH 命令行ssh客户端,使用-T开关(禁用伪 tty 分配)。

    ssh -T user@host opmnctl status -l
    
  • 与 PLink 相同(来自 PuTTY 包)

    plink.exe -T user@host opmnctl status -l
    

-T无论如何,当在命令行上指定命令时,应该是隐式的)


解决方案是:

  • 修复您的启动脚本以在非交互式终端上包含opmnctlto (首选)PATH
  • opmnctl在您的命令中使用完整路径。
  • 修改 SSH.NET 代码以SendPseudoTerminalRequest在实现中发出请求.RunCommand(我没有对此进行测试)。
于 2015-09-03T06:22:00.643 回答