SSH.NET en temps réel de la sortie de commande de surveillance
Il y a un long script en cours d' script.sh
distance sur une machine Linux. J'ai besoin de le démarrer et de surveiller l'activité en temps réel. Le script au cours de son activité peut la production de stdout
et stderr
. Je suis à la recherche d'un moyen de capturer à la fois des cours d'eau.
- Je utiliser Renci SSH.NET pour télécharger script.sh
et commencer, de sorte qu'il serait formidable de voir une solution bornée à cette bibliothèque. Dans mon esprit, la solution idéale est la nouvelle méthode:
var realTimeScreen= ...;
var commandExecutionStatus = sshClient.RunCommandAsync(
command: './script.sh',
stdoutEventHandler: stdoutString => realTimeScreen.UpdateStdout(stdString)
stderrEventHandler: stderrString => realTimeScreen.UpdateStderr(stderrString));
...
commandExecutionStatus.ContinueWith(monitoringTask =>
{
if (monitoringTask.Completed)
{
realTimeScreen.Finish();
}
});
Vous devez vous connecter pour publier un commentaire.
Utilisation
SshClient.CreateCommand
méthode. Il retourneSshCommand
instance.La
SshCommand
de la classe aExtendedOutputStream
de la propriété qui renvoie un flux de données avec les deux stdout et stderr.Voir
SshCommandTest.cs
:Voir aussi un code pour les mêmes WinForms question Exécuter longtemps de commande en SSH.NET et les résultats sont affichés en permanence dans la zone de texte.
cmd.Execute()
etOutputStreams
. Après que j'ai fini d'astiquer le code, je vais poster ici un wrapper qui est parfait pour ma situation. Une fois encore, merci à vous 🙂Alors, voici la solution que j'ai trouvé. Bien sûr, il peut être amélioré, de sorte qu'il est ouvert à la critique.
J'ai utilisé
au lieu de
Task.Yield()
parce queTask.Yield()
fera suite une priorité plus élevée que GUI événements, mais, comme une mauvaise conséquence, il demande de votre application pour utiliserWindowsBase.dll
.