Maison > Article > Opération et maintenance > Exemples pour expliquer la commande expect pour implémenter l'interaction automatisée Shell
Dans cet article, nous utiliserons un exemple pour expliquer la commande expect afin de réaliser une interaction automatisée Shell. Nous pouvons implémenter des fonctions de flux de contrôle simples via Shell, telles que le bouclage, le jugement, etc. L'article suivant vous présente principalement les informations pertinentes sur l'utilisation de la commande expect pour réaliser une interaction automatisée du shell. L'article le présente en détail à travers un exemple de code. Les amis dans le besoin peuvent s'y référer.
Contexte
Il existe de nombreux scénarios dans les scripts Linux pour les opérations à distance, tels que la connexion à distance SSH, la copie à distance SCP, le transfert de fichiers SFTP, etc. Ces commandes impliqueront la saisie d'un mot de passe de sécurité. L'utilisation normale de la commande nécessite la saisie manuelle du mot de passe et l'acceptation de la vérification de sécurité. Afin de réaliser des opérations à distance automatisées, nous pouvons emprunter la fonctionnalité d'expect.
expect est un langage d'outil de programmation gratuit utilisé pour réaliser des tâches de communication automatiques et interactives sans intervention humaine. Expect évolue constamment. Au fil du temps, ses fonctions deviennent de plus en plus puissantes et il est devenu un puissant assistant pour les administrateurs système. Expect nécessite la prise en charge du langage de programmation Tcl. Pour exécuter Expect sur le système, Tcl doit d'abord être installé.
L'installation de Expect
expect est créée sur la base de Tcl, nous devons donc d'abord installer Tcl avant d'installer Expect.
(1) Installation Tcl
Page d'accueil : http://www.tcl.tk
Adresse de téléchargement : http://www. tcl .tk/software/tcltk/downloadnow84.tml
1. Téléchargez le package de code source
wget http://nchc.dl.sourceforge.net/sourceforge/tcl/tcl8.4.11-src.tar.gz
2. Décompressez le package de code source
tar xfvz tcl8.4.11-src.tar.gz
3. Configuration de l'installation
cd tcl8.4.11/unix ./configure --prefix=/usr/tcl --enable-shared make make install
Remarque :
1 Une fois l'installation terminée, entrez le répertoire racine du code source tcl et copiez tclUnixPort.h sous le. sous-répertoire unix vers le sous-répertoire générique middle.
2. Ne supprimez pas encore le code source tcl, car il est toujours nécessaire pour le processus d'installation prévu.
(2) installation attendue (nécessite la bibliothèque Tcl)
Page d'accueil : http://expect.nist.gov/
1. Package source
wget http://sourceforge.net/projects/expect/files/Expect/5.45/expect5.45.tar.gz/download
2. Décompressez le package source
tar xzvf expect5.45.tar.gz
3. Configuration d'installation
cd expect5.45 ./configure --prefix=/usr/expect --with-tcl=/usr/tcl/lib --with-tclinclude=../tcl8.4.11/generic make make install ln -s /usr/tcl/bin/expect /usr/expect/bin/expect
attendez
attendez-vous Le noyau est le spawn, l'attente, l'envoi et la définition.
spawn appelle la commande à exécuter
attendez-vous à ce que les informations d'invite de commande apparaissent, c'est-à-dire pour capturer l'invite de saisie de l'utilisateur :
send envoie des valeurs qui nécessitent une interaction, remplaçant la saisie manuelle de l'utilisateur
set définit les valeurs des variables
interagir une fois l'exécution terminée Maintenir l'état interactif et donner le contrôle à la console À ce stade, vous pouvez opérer manuellement. S'il n'y a pas de phrase de ce type, il se fermera une fois la connexion terminée, au lieu de rester sur le terminal distant.
expect eof Ceci doit être ajouté et correspond à spawn pour indiquer la fin des informations de sortie du terminal de capture, similaire à if....endif
expect Le script doit se terminer par Interactive ou Expect eof. Attendez-vous à ce que eof soit généralement suffisant pour effectuer des tâches automatisées.
Autres paramètres
Définir l'attente pour ne jamais expirer, définir le délai d'attente -1
Définir l'attente 300 Deuxième délai d'attente, si aucun contenu attendu n'apparaît après plus de 300, quittez le délai d'attente 300
attendez-vous à la syntaxe d'écriture
attendez-vous à utiliser la syntaxe tcl
Une commande Tcl se compose de mots séparés par des espaces. Parmi eux, le premier mot est le nom de la commande et les autres sont des paramètres de commande
cmd arg arg arg
$foo
[cmd arg]
"quelques trucs"
{quelques trucs>
login.exp est dédié à la connexion à distance, utilisation rapide : login.exp "exclude" "${remote_ip}" "${remote_user}" "${remote_passwd}" "${remote_command}"
L'avez-vous appris ? J'espère qu'après avoir lu cet article, vous aurez une compréhension plus approfondie de l'interaction de l'automatisation du shell.
#!/usr/bin/expect -f ########################################################## # 通过SSH登陆和执行命令 #参数:1.Use_Type [check/execute] # 2.SSHServerIp # 3.SSHUser # 4.SSHPassword # 5.CommandList [多个命令间以;间隔] #返回值: # 0 成功 # 1 参数个数不正确 # 2 SSH 服务器服务没有打开 # 3 SSH 用户密码不正确 # 4 连接SSH服务器超时 ########################################################## proc usage {} { regsub ".*/" $::argv0 "" name send_user "Usage:\n" send_user " $name Use_Type SSHServerIp SSHUser SSHPassword CommandList\n" exit 1 } ## 判断参数个数 if {[llength $argv] != 5} { usage } #设置变量值 set Use_Type [lindex $argv 0] set SSHServerIp [lindex $argv 1] set SSHUser [lindex $argv 2] set SSHPassword [lindex $argv 3] set CommandList [lindex $argv 4] #spawn ping ${SSHServerIp} -w 5 #expect { # -nocase -re "100% packet loss" { # send_error "Ping ${SSHServerIp} is unreachable, Please check the IP address.\n" # exit 1 # } #} set timeout 360 set resssh 0 #定义变量标记ssh连接时是否输入yes确认 set inputYes 0 set ok_string LOGIN_SUCCESS if {$Use_Type=="check"} { #激活ssh连接,如果要需要输入yes确认,输入yes,设置inputYes为1,否则输入ssh密码 spawn ssh ${SSHUser}@${SSHServerIp} "echo $ok_string" } else { spawn ssh ${SSHUser}@${SSHServerIp} "$CommandList" } expect { -nocase -re "yes/no" { send -- "yes\n" set inputYes 1 } -nocase -re "assword: " { send -- "${SSHPassword}\n" set resssh 1 } #-nocase -re "Last login: " { # send -- "${CommandList}\n" #} $ok_string {} -nocase -re "Connection refused" { send_error "SSH services at ${SSHServerIp} is not active.\n" exit 2 } timeout { send_error "Connect to SSH server ${SSHUser}@${SSHServerIp} timeout(10s).\n" exit 4 } } #如果输入了yes确认,输入ssh密码 if {$inputYes==1} { expect { -nocase -re "assword: " { send -- "${SSHPassword}\n" set resssh 1 } } } #如果出现try again或者password:提示,说明输入的用户密码错误,直接退出。 if {$resssh==1} { expect { -nocase -re "try again" { send_error "SSH user:${SSHUser} passwd error.\n" exit 3 } -nocase -re "assword:" { send_error "SSH user:${SSHUser} passwd error.\n" exit 3 } eof {} } } send_error -- "$expect_out(buffer)" #-nocase -re "No such user" { # send_error "No such user.\n" # exit 5 # } #exitRecommandations associées :
Script de fonction d'enregistrement et de lecture de production Linux Shell
Python réalise la fonction simple de remplacement du shell sed
Méthode FTP du shell Linux pour télécharger des fichiers en fonction de la date
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!