SSH を介してハードウェア上で特定のコマンドを実行する必要がある C# アプリケーションがあります。アプリケーションはSSH.Net
、接続を確立し、コマンドを送信し、結果を読み取るために使用しています。OpenSSH を使用してローカル マシンに接続すると、これが機能します。最後に、さらに一歩進んで、独自の SSH サーバーをセットアップして、一度に複数のハードウェア デバイスをシミュレートできるようにしたいと考えました (SSH 接続するデバイスが 50 以上あることをシミュレートする必要があります)。
このために、nodejs とssh2
パッケージを使用して単純な SSH サーバーをセットアップしました。ここまでで、クライアントの接続と認証が完了し (現時点ではすべての接続が受け入れられます)、session
オブジェクトが作成されていることがわかります。私が壁にぶつかっているのは、クライアントから送信されたコマンドの実行です。オブジェクトにssh2
のイベントがあることに気付きましたが、これはトリガーされないようです( に何を入れたかに関係なく)。exec
session
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
私がここで見逃しているものはありますか?