【问题标题】:Renci SSH.NET - no result string returned for opmnctlRenci SSH.NET - opmnctl 没有返回结果字符串
【发布时间】:2015-09-03 05:00:36
【问题描述】:

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

还有其他获取结果字符串的方法吗?或者 Renci 不支持 OPMN Oracle 引擎的 opmnctl 命令?任何帮助将不胜感激。

【问题讨论】:

    标签: .net vb.net oracle ssh ssh.net


    【解决方案1】:

    如果 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 应该是隐式的)


    解决办法是:

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

    【讨论】:

      猜你喜欢
      • 2023-03-22
      • 1970-01-01
      • 2017-05-06
      • 2011-11-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-05
      • 1970-01-01
      相关资源
      最近更新 更多