可以让 C# SSH 客户端与 NodeJS SSH 服务器通信吗?
Possible to have C# SSH client communicate with a NodeJS SSH Server?
我有一个 C# 应用程序需要 运行 通过 SSH 在硬件上执行某些命令。应用程序正在使用 SSH.Net
建立连接、发送命令并读取结果。如果我使用 OpenSSH 连接到我的本地计算机,我就可以正常工作。最后,我想更进一步,设置我自己的 SSH 服务器,这样我就可以一次模拟多个硬件设备(需要模拟有 50 多个设备通过 SSH 进入)。
为此,我使用 nodejs 和 ssh2
包设置了一个简单的 SSH 服务器。到目前为止,我已经连接了客户端并对其进行了身份验证(目前所有连接都被接受),并且我可以看到正在创建一个 session
对象。尽管我遇到困难的地方是执行客户端发送的命令。我注意到 ssh2
在 session
对象上有一个针对 exec
的事件,但这似乎永远不会触发(无论我在 SSH.Net
的 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()}");
}
}
设置ssh2服务器的nodejs服务器代码如下:
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
节点包并不重要。我在这里遗漏了什么吗?
“执行者”Node.js server session event is for "non-interactive (exec) command execution"。他们很可能指的是 SSH“执行”通道(用于“非交互式命令执行”)。
要在 SSH.NET 中使用“exec”SSH 通道执行命令,请使用 SshClient.RunCommand
。
相反,SshClient.CreateShellStream
使用 SSH“shell”通道,旨在实现交互式 shell 会话。
为此,您需要处理“shell”Node.js server session event。
我有一个 C# 应用程序需要 运行 通过 SSH 在硬件上执行某些命令。应用程序正在使用 SSH.Net
建立连接、发送命令并读取结果。如果我使用 OpenSSH 连接到我的本地计算机,我就可以正常工作。最后,我想更进一步,设置我自己的 SSH 服务器,这样我就可以一次模拟多个硬件设备(需要模拟有 50 多个设备通过 SSH 进入)。
为此,我使用 nodejs 和 ssh2
包设置了一个简单的 SSH 服务器。到目前为止,我已经连接了客户端并对其进行了身份验证(目前所有连接都被接受),并且我可以看到正在创建一个 session
对象。尽管我遇到困难的地方是执行客户端发送的命令。我注意到 ssh2
在 session
对象上有一个针对 exec
的事件,但这似乎永远不会触发(无论我在 SSH.Net
的 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()}");
}
}
设置ssh2服务器的nodejs服务器代码如下:
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
节点包并不重要。我在这里遗漏了什么吗?
“执行者”Node.js server session event is for "non-interactive (exec) command execution"。他们很可能指的是 SSH“执行”通道(用于“非交互式命令执行”)。
要在 SSH.NET 中使用“exec”SSH 通道执行命令,请使用 SshClient.RunCommand
。
相反,SshClient.CreateShellStream
使用 SSH“shell”通道,旨在实现交互式 shell 会话。
为此,您需要处理“shell”Node.js server session event。