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
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
- Pourquoi ma question ici unix.stackexchange.com/questions/458801/… a été marqué comme doublon? Je pense que ' est différent car je veux être promu pour entrer le nom dutilisateur et pas seulement le mot de passe.
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.
spawn ssh [email protected] ls -la>Ls
?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 parexpect "prompt#"