Возможно ли, чтобы клиент C# SSH связывался с сервером NodeJS SSH?

У меня есть приложение на C#, которое должно запускать определенные команды на оборудовании через SSH. Приложение использует SSH.Net Чтобы установить соединение, отправьте команду и прочитайте результат. У меня это работает, если я подключаюсь к своей локальной машине, используя OpenSSH. Наконец, я хотел пойти дальше и настроить свой собственный SSH-сервер, чтобы я мог имитировать несколько аппаратных устройств одновременно (нужно имитировать наличие более 50 устройств для SSH).

Для этого я настроил простой SSH-сервер, используя nodejs и ssh2 пакет. Пока что у меня есть клиент, подключенный, аутентифицированный (все соединения на данный момент приняты), и я вижу session объект создается. Хотя то, где я бьюсь об стену, - это выполнение команд, отправленных клиентом. Я заметил, что ssh2 есть событие для exec на session объект, но это никогда не срабатывает (независимо от того, что я положил в SSH.Net"s ShellStream).

Код клиента C#, который инициирует соединение, выглядит следующим образом (command уже определено, что командная строка будет выполнена):

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()}");
    }
}

Код сервера nodejs, который устанавливает сервер ssh2, следующий:

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 функция, но я предполагал, что это не имеет значения, что мой клиент не использовал ssh2 пакет узлов. Есть ли что-то, что я здесь скучаю?

1 ответ

Решение

Событие сеанса сервера "exec" Node.js предназначено для "неинтерактивного выполнения (exec) команды". Под которым они, скорее всего, подразумевают канал exec SSH (который предназначен для "неинтерактивного выполнения команд").

Чтобы выполнить команду, используя SSH-канал "exec" в SSH.NET, используйте SshClient.RunCommand,


Напротив SshClient.CreateShellStream использует SSH "оболочку" канала, которая предназначена для реализации интерактивной сессии оболочки.

Для этого вам нужно обработать событие оболочки сервера " Node.js".

Другие вопросы по тегам