Jai besoin décrire un script qui sexécute sur un PC avec Centos 7 et se connecte à un autre PC avec Centos 7 en utilisant ssh, exécutez une commande de console, par exemple « ls -la » et enregistrez la sortie de celui-ci dans un fichier pour pouvoir analyser ultérieurement cette sortie.

Jai écrit le script EXPECT suivant:

ssh_connection.exp:

#!/usr/bin/expect -f set timeout 120 spawn ssh [email protected] expect "assword:" send "PASSWORD\r" expect "prompt#" sleep 5 puts "Executing ls -la" send "ls -la\r" sleep 10 puts "Executing ps -af" puts "ps -af\r" sleep 10 puts "Closing the ssh session\r" send "exit\r" 

Ce script se connecte correctement via ssh à la machine avec IP = 129.0.0.10 et affiche à lécran les messages qui apparaît sur « met »: Exécution de ls -la Exécution de ps -af Fermeture de la session ssh

Cependant, il naffiche pas le résultat de lexécution des commandes que jenvoie avec send:

ls -la ps -af 

Quel est le problème avec ce script?

Comment puis-je enregistrer la sortie des commandes précédentes dans un fichier pour pouvoir lanalyser plus tard avec un bash un script ou un programme C?

Commentaires

  • Il suffit dutiliser un sta Commande ndard ssh avec des clés ssh et un heredoc
  • Il semble que vous compliquez trop les choses. Vous navez pas besoin dutiliser expect pour automatiser les choses via ssh.
  • avez-vous essayé une commande comme spawn ssh [email protected] ls -la>Ls?
  • Exécutez votre script avec expect -d ssh_connection.exp et voyez où se trouvent les problèmes. La première chose que je ' recommande est de remplacer tous les dormeurs par expect "prompt#"

Réponse

Vous navez pas besoin dutiliser expect pour ce faire. Le ssh peut prendre des arguments supplémentaires des commandes que vous souhaitez exécuter via la connexion SSH.

Étape # 1

Configurez une paire de clés SSH (google it), puis copiez le SSH clé vers le serveur distant. Pour ce faire, je « recommanderais dutiliser ssh-copy-id. Voir ma réponse à cette U & LQ & A intitulée: Comment copier correctement clés privées des serveurs distants à ma machine locale pour que je puisse me connecter en utilisant ssh .

Étape # 2

Maintenant, avec la possibilité de SSH sur un serveur en place à laide dune clé , votre problème ci-dessus se transforme en ceci:

$ ssh [email protected] "ls -la; ps -af" 

Vous pouvez être sophistiqué et utiliser ici des documents (heredocs aka . here-docs) pour améliorer encore cette technique.

$ ssh [email protected] <<EOF > ls -la > ps -af > EOF 

ou placez les commandes dans un fichier et transmettez-les à ssh:

$ ssh [email protected] < my.cmds 

Commentaires

Réponse

Merci,

Jai modifié mon script en remplaçant la ligne:

spawn ssh [email protected]

avec cet autre, comme vous me le dites:

spawn ssh [email protected] « ls -la; ps -af »

Maintenant, je vois la sortie des commandes à lécran et je peux rediriger vers un fichier.

Ensuite, jai essayé dadapter ce script pour exécuter une commande sur une autre machine qui est un commutateur de type Cisco (ce nest pas Cisco, mais il est compatible).

Le script avec lequel je me connecte au commutateur en utilisant ssh est:

** #! / usr / bin / expect -f

set timeout 120

spawn ssh [email protected] « show vlan 500 »

expect « assword: »

envoyer linvite « PASSWORD \ r »

expect  » # « 

sleep 5

met » Closing the ssh session \ r « 

send » exit \ r « **

Cela ne fonctionne pas sur le commutateur et jobtiens cette erreur:

spawn ssh [email protected] show vlan 501

mot de passe [email protected] « :

imish: option non valide – » c « 

Essayez` imish –help « pour plus informations.

send: spawn id exp6 not open

while executing 

« send » exit \ r «  »

(file "./ssh_script_v3.exp" line 7) 

Je dois donc utiliser le script expect qui envoie la commande en utilisant « send »:

! / usr / bin / expect

spawn ssh [email protected]

expect « assword: »

send « user \ r »

expect « > »

sleep 5

envoyer « sh vlan 500 \ r »

sleep 5

envoyer « exit \ r »

Maintenant, je nobtiens aucune erreur, mais rien ne saffiche à lécran.

Jai lu que ceci se produit parce que les systèmes Linux et UNIX tamponnent automatiquement leur sortie lorsquils sont exécutés de manière non interactive. Je pense quExpect peut faire croire aux programmes quils sexécutent de manière interactive au moyen de « unbuffer », mais je ne sais pas comment utiliser « unbuffer » avec « send ». Mes tentatives pour faire cela ne fonctionnent pas.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *