- Plein de la sortie de commande de ShellStream de C# SSH.NET
À l'aide de Renci.SshNet de la bibliothèque. Je suis en train d'exécuter certaines commandes.
Après l'exécution de la commande "1", je suis de l'exécution de la commande "2", qui prend plus de temps.
Je ne suis que de l'obtention de la première ligne de la sortie. (reader.ReadToEnd()
ne fonctionne pas de manière adéquate).
J'ai aussi essayé while (!reader.EndOfStream){ }
avec pas de chance.
Je pense que c'est parce que le retard de la réponse du serveur. Quand il n'y a pas de réponse, le flux de rien lu et finitions.
J'ai trouvé une solution
String tmp;
TimeSpan timeout = new TimeSpan(0, 0, 3);
while ((tmp = s.ReadLine()) != null)
{
Console.WriteLine(tmp);
}
Mais ce n'est pas professionnel. J'ai besoin d'une certaine manière dans laquelle le flux se termine quand il se termine.
using (var vclient = new SshClient("host", "username", "password"))
{
vclient.Connect();
using (ShellStream shell = vclient.CreateShellStream("dumb", 80, 24, 800, 600, 1024))
{
Console.WriteLine(SendCommand("comand 1", shell));
Console.WriteLine(SendCommand("comand 2", shell));
shell.Close();
}
vclient.Disconnect();
}
public static string SendCommand(string cmd, ShellStream sh)
{
StreamReader reader = null;
try
{
reader = new StreamReader(sh);
StreamWriter writer = new StreamWriter(sh);
writer.AutoFlush = true;
writer.WriteLine(cmd);
while (sh.Length == 0)
{
Thread.Sleep(500);
}
}
catch (Exception ex)
{
Console.WriteLine("exception: " + ex.ToString());
}
return reader.ReadToEnd();
}
Vous devez vous connecter pour publier un commentaire.
La coquille est d'un ruisseau sans fin. Il n'y a pas de commande envoyer - recevoir de la séquence de sortie. Le
ReadToEnd
ne peut pas savoir où une sortie d'une commande se termine. Tout ce que vous pouvez faire est de lire jusqu'à ce que vous vous pouvez dire que la sortie s'est terminée.Si vous ne pouvez pas dire que vous pouvez vous aider vous-même en ajoutant une sorte de fin de sortie marque comme:
et de lire jusqu'à ce que vous obtenez
"this-is-the-end-of-the-output"
ligne.Généralement une "coquille" de canal n'est pas une solution idéale pour l'automatisation. Il est prévu pour une sessions interactives.
Vous feriez mieux d'utiliser "exec" de canal à l'aide de
SshClient.CreateCommand
. AvecCreateCommand
le canal se ferme une fois que la commande est terminée. Donc, il y a clairement "la fin de l'stream", ce qui rend laReadToEnd()
de travail comme vous le souhaitez. Et SSH.NET en fait même l'ensemble de la sortie de commande disponibles dansSshCommand.Résultat
(qui utilise en interneReadToEnd()
).