我试图通过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"
时,它成功返回结果。
是否有另一种获取结果字符串的方法?或者是opmnctl
命令OPMN Oracle引擎不支持Renci?
如果opmnctl
由于某种原因失败,它可能在错误输出上产生了一条消息。
所以也检查cmd.Error
和cmd.ExitStatus
。
注意.RunCommand
方法使用非交互式终端,这可能会导致某些命令出现问题。
特别是当非交互式终端被用作执行不同的启动脚本集和/或脚本中的不同分支(基于TERM
环境变量的值)时,可以设置不同的环境。
在您的情况下,在非交互式终端上,opmnctl
似乎不包括在PATH
中。
当您在SSH客户端强制使用非交互式终端时,您应该会得到相同的问题。
例如:使用OpenSSH命令行
ssh
客户端,使用-T
开关(Disable pseudo-tty allocation)ssh -T user@host opmnctl status -l
与PLink相同(来自PuTTY包)
plink.exe -T user@host opmnctl status -l
(无论如何,在命令行上指定command时,-T
应该是隐式的)
解决方案是:
- 修复你的启动脚本,包括
opmnctl
到PATH
,即使在非交互式终端(首选) - 在命令中使用
opmnctl
的完整路径 - 修改SSH。. NET代码在
.RunCommand
实现中发出SendPseudoTerminalRequest
请求(我没有测试这个)。