Возможно ли взаимодействие клиента SSH C # с сервером SSH NodeJS? - PullRequest
0 голосов
/ 15 ноября 2018

У меня есть приложение на 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 Ответ

0 голосов
/ 15 ноября 2018

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

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


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

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

...