Возможно ли, чтобы клиент 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".