Comment exécuter des commandes sur le serveur SSH en C#?
J'ai besoin d'exécuter cette action à l'aide d'un code C#:
- ouvrir putty.exe en arrière-plan (c'est comme une fenêtre cmd)
- de connexion à un hôte distant à l'aide de son adresse IP
- entrer un nom d'utilisateur et le mot de passe
- exécuter plusieurs commandes l'une après l'autre.
- exécuter une autre commande qui permet d'obtenir une réponse me disant que les commandes que j'ai couru avant que celui où a été exécutée avec succès
Donc j'essaye de faire comme cela:
ProcessStartInfo proc = new ProcessStartInfo()
{
FileName = @"C:\putty.exe",
UseShellExecute = true, //I think I need to use shell execute ?
RedirectStandardInput = false,
RedirectStandardOutput = false,
Arguments = string.Format("-ssh {0}@{1} 22 -pw {2}", userName, hostIP, password)
... //How do I send commands to be executed here ?
};
Process.Start(proc);
Voulez-vous utiliser le même ensemble de commandes à chaque fois? Si oui, essayez de adddding dans votre
Les commandes que je suis de running sont les utilisateurs à ajouter l'adresse mac pour le wifi contrôleur. Donc, fondamentalement, les commandes sont les mêmes, mais avec des adresse mac à chaque fois... Et pouvez-vous me dire ce qu'est cette
SI c'est un serveur Linux (je suppose que l'utilisation de ssh), dans le répertoire home de l'utilisateur est un fichier appelé
OK, mais j'ai besoin de passer des paramètres différents sur chaque commande (e,g, les détails de l'utilisateur, l'adresse mac, etc...)
Vous pouvez utiliser StandardInput pour passer des commandes à votre processus en cours d'exécution. Bien que la gestion d'entrée/de sortie/erreur courants peuvent être plutôt difficiles. La plupart des usful solution à ce problème j'ai trouvé jusqu'à présent (et que j'utilise moi-même avec quelques modifications) est le suivant: codeproject.com/Articles/170017/...
.bashrc
fichier. Si vous souhaitez exécuter différentes commandes, dites-le nous.Les commandes que je suis de running sont les utilisateurs à ajouter l'adresse mac pour le wifi contrôleur. Donc, fondamentalement, les commandes sont les mêmes, mais avec des adresse mac à chaque fois... Et pouvez-vous me dire ce qu'est cette
.bashrc
fichier et comment puis-je ajouter ?SI c'est un serveur Linux (je suppose que l'utilisation de ssh), dans le répertoire home de l'utilisateur est un fichier appelé
.bashrc
(/home/$user/.bashrc). Ce fichier est un script shell qui obtient excecuted chaque fois qu'un utilisateur se connecte. J'ai par exemple echo des détails sur les performances du serveur toujours sur ouverture de session (c'est à dire df -h
et uptime
).OK, mais j'ai besoin de passer des paramètres différents sur chaque commande (e,g, les détails de l'utilisateur, l'adresse mac, etc...)
Vous pouvez utiliser StandardInput pour passer des commandes à votre processus en cours d'exécution. Bien que la gestion d'entrée/de sortie/erreur courants peuvent être plutôt difficiles. La plupart des usful solution à ce problème j'ai trouvé jusqu'à présent (et que j'utilise moi-même avec quelques modifications) est le suivant: codeproject.com/Articles/170017/...
OriginalL'auteur Liran Friedman | 2015-06-17
Vous devez vous connecter pour publier un commentaire.
Vous pouvez essayer de https://sshnet.codeplex.com/.
Avec cela, vous n'auriez pas besoin de mastic ou d'une fenêtre.
Vous pouvez obtenir les réponses aussi.
Il serait qqch. comme cette.
Edit: une Autre approche serait d'utiliser un shellstream.
Créer un ShellStream une fois comme:
Ensuite, vous pouvez utiliser une commande comme ceci:
Vous pouvez l'obtenir facilement via un Package NuGet. Voir ici. Ensuite vous avez juste à ajouter comme référence.
Pouvez-vous s'il vous plaît dites-moi, si j'ai besoin d'exécuter un "activer" une commande qui me demande un mot de passe, puis-je exécuter l'exemple de code que vous avez spécifié ci-dessus ?
Je suis en train d'exécuter ce code, mais rien ne se passe:
SshClient sshclient = new SshClient(hostIP, userName, password); sshclient.Connect(); SshCommand enable = sshclient.CreateCommand("enable"); enable.Execute(); SshCommand pwd = sshclient.CreateCommand(enablePassword); pwd.Execute(); SshCommand config = sshclient.CreateCommand("configure t"); config.Execute(); SshCommand aaa = sshclient.CreateCommand("go to folder command"); aaa.Execute(); SshCommand set = sshclient.CreateCommand("add user command"); set.Execute(); SshCommand save = sshclient.CreateCommand("write memory"); save.Execute();
Je n'ai, comme vous l'avez envoyé le:
string answer = sc.Result;
mais elle est revenue vide à chaque fois... Et quand je l'ai couru en putty.exe il y a la guerre pas de problèmeOriginalL'auteur LzyPanda
Tandis que la réponse de @LzyPanda fonctionne, en utilisant SSH "shell" de canal (
SshClient.CreateShellStream
), laissez seulement une borne interactive, n'est pas une bonne idée pour l'automatisation de l'exécution des commandes. Vous obtenez beaucoup d'effets secondaires, comme des invites de commande, ANSI séquences interactives comportement de certaines commandes, etc.Pour l'automatisation, utiliser SSH "exec" de canal (
SshClient.CreateCommand
):Si vous avez besoin d'exécuter plusieurs commandes, répéter le code ci-dessus. Vous pouvez créer n'importe quel nombre de "exec" canaux pour une connexion SSH.
Cependant, si les commandes dépendent les uns des autres (première commande modifié l'environnement, par exemple, des variables, qui sont utilisés par les commandes décrites ci-dessous), vous devez les exécuter dans un délai d'un canal. Utiliser une syntaxe shell pour que, comme
&&
ou;
:Si vous avez besoin de continue de lire les commandes de sortie utilisation:
Vous pouvez également utiliser
ExtendedOutputStream
, qui contient à la fois la sortie standard stdout et stderr. Voir SSH.NET en temps réel de la sortie de commande de surveillance.Malheureusement, la mise en œuvre de "exec" canal SSH.NET ne permet pas de fournir une contribution à la commande. Pour ce cas d'utilisation, vous devrez recourir à la "coquille" de canal, jusqu'à ce que cette limitation est résolu.
OriginalL'auteur Martin Prikryl