在SSH.NET中执行命令时获得“由于stdin不是终端,因此不会分配伪终端”

qgelzfjb  于 2022-12-20  发布在  .NET
关注(0)|答案(1)|浏览(217)

我有一些基于SSH. NET库的解决方案。
现在,该部门希望监控SSH会话。
因此,他们要求我们连接到类似"代理" SSH服务器的东西,并向其传递远程命令以重定向到目标计算机。
Basically the question is how to send parameter to the session the way PuTTY does, when you specify it in the "Remote command" field:

using ssh.net ?
我已经试过了:

var pk = new PrivateKeyFile("C:\\xxx.ppk");        
client = new SshClient("x.x.x.x","login",pk);
client.ConnectionInfo.Timeout = TimeSpan.FromSeconds(10);
client.Connect();
SshCommand x = client.CreateCommand("user@server1");
var response = x.Execute();
shells = client.CreateShellStream("vt100", 250, 250, 800, 160, 512);

但是当我这样运行它的时候,我得到了一个错误:
Error ="由于stdin不是终端,将不会分配伪终端。\r\n权限被拒绝,请重试。\r\n权限被拒绝,请重试。\r\n收到从x.x.x. x端口22断开的连接:2:y\r\n断开连接的身份验证失败太多...
如果我从PuTTY中执行此操作并在"远程命令"中发送user@server1,则会立即要求输入user@server1的密码。

ars1skjm

ars1skjm1#

PuTTY “远程命令” 的底层API是SSH“执行”通道。
在SSH.NET中,“exec”通道的API实际上是SshClient.CreateCommand/SshClient.RunCommand
如何在C#中运行SSH服务器上的命令?
但是PuTTY(交互式SSH终端)默认为会话分配伪终端,而SSH.NET SshClient.CreateCommand(用于命令自动化,而不是交互式使用)没有,您的命令似乎是用于交互式使用,因此无法在此类会话中运行。

  • 检查您的命令是否具有选项/switch/whatever,以使其在没有伪终端的会话中运行。
  • 如果没有这样的选项,则必须实现标准SshClient.CreateCommand/SshClient.RunCommand的替代方法,该方法通过调用ChannelSession.SendPseudoTerminalRequest来分配伪终端。

相关问题