可以让C#SSH客户端与NodeJS SSH服务器通信吗?

时间:2018-11-15 17:25:21

标签: c# node.js ssh ssh.net ssh2

我有一个C#应用程序,需要通过SSH在一块硬件上运行某些命令。应用程序正在使用SSH.Net建立连接,发送命令并读取结果。如果我使用OpenSSH连接到本地计算机,则可以正常工作。最后,我想更进一步,设置自己的SSH服务器,以便一次可以模拟多个硬件设备(需要模拟有50多个设备要SSH进入)。

为此,我使用nodejs和ssh2软件包设置了一个简单的SSH服务器。到目前为止,我已连接并验证了客户端(现在已接受所有连接),并且可以看到正在创建session对象。尽管我遇到的麻烦是执行客户端发送的命令。我注意到ssh2exec对象上有一个session的事件,但这似乎从未触发(不管我在SSH.Net的{​​{1}}中放了什么) )。

启动连接的C#客户端代码如下({ShellStream已经定义为要执行的命令字符串):

command

设置ssh2服务器的nod​​ejs服务器代码如下:

using(SshClient client = new SshClient(hostname, port, username, password))
{
    try
    {
        client.ErrorOccurred += Client_ErrorOccurred;
        client.Connect();

        ShellStream shellStream = client.CreateShellStream("xterm", Columns, Rows, Width, Height, BufferSize, terminalModes);

        var initialPrompt = await ReadDataAsync(shellStream);

        // The command I write to the stream will get executed on OpenSSH
        // but not on the nodejs SSH server
        shellStream.WriteLine(command);
        var output = await ReadDataAsync(shellStream);
        var results = $"Command: {command} \nResult: {output}";

        client.Disconnect();

        Console.WriteLine($"Prompt: {initialPrompt} \n{results}\n");
    }
    catch (Exception ex)
    {
        Console.WriteLine($"Exception during SSH connection: {ex.ToString()}");
    }
}

我已经看到各种new ssh2.Server({ hostKeys: [fs.readFileSync('host.key')] }, function(client) { console.log('Client connected!'); client.on('authentication', function(ctx) { ctx.accept(); }).on('ready', function() { console.log('Client authenticated!'); client.on('session', function(accept, reject) { var session = accept(); // Code gets here but never triggers the exec session.once('exec', function(accept, reject, info) { console.log('Client wants to execute: ' + inspect(info.command)); var stream = accept(); stream.write('returned result\n'); stream.exit(0); stream.end(); }); }); }).on('end', function() { console.log('Client disconnected'); }); }).listen(port, '127.0.0.1', function() { console.log('Listening on port ' + this.address().port); }); 客户端示例调用ssh2函数的情况,但是我假设客户端没有使用client.exec节点包并不重要。我在这里想念什么吗?

1 个答案:

答案 0 :(得分:1)

“ exec” Node.js server session event用于"non-interactive (exec) command execution"。它们最有可能表示SSH“执行”通道(该通道用于“非交互式命令执行”)。

要使用SSH.NET中的“ exec” SSH通道执行命令,请使用SshClient.RunCommand


相反,SshClient.CreateShellStream使用SSH“ shell”通道,该通道旨在实现交互式shell会话。

为此,您需要处理“ shell” Node.js server session event