Renci SSH.NET - 没有为 opmnctl 返回结果字符串

Renci SSH.NET - no result string returned for opmnctl

我正在尝试通过 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" 这样的普通命令时,它 returns 结果成功。

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

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

所以还要检查 cmd.Errorcmd.ExitStatus


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

特别是可以设置不同的环境,当非交互式终端被用作执行一组不同的启动脚本时and/or脚本中的不同分支被采用(基于[的值=16=] 环境变量).

在您的情况下,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 应该是隐式的)


解决方案是:

  • 修复您的启动脚本以包含 opmnctlPATH,即使在非交互式终端上也是如此(首选)
  • 在命令中使用 opmnctl 的完整路径。
  • 修改 SSH.NET 代码以在 .RunCommand 实现中发出 SendPseudoTerminalRequest 请求(我没有对此进行测试)。