我有一些基于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的密码。
1条答案
按热度按时间ars1skjm1#
PuTTY “远程命令” 的底层API是SSH“执行”通道。
在SSH.NET中,“exec”通道的API实际上是
SshClient.CreateCommand
/SshClient.RunCommand
:如何在C#中运行SSH服务器上的命令?
但是PuTTY(交互式SSH终端)默认为会话分配伪终端,而SSH.NET
SshClient.CreateCommand
(用于命令自动化,而不是交互式使用)没有,您的命令似乎是用于交互式使用,因此无法在此类会话中运行。SshClient.CreateCommand
/SshClient.RunCommand
的替代方法,该方法通过调用ChannelSession.SendPseudoTerminalRequest
来分配伪终端。