Maison >Opération et maintenance >exploitation et maintenance Linux >Comment implémenter la fonction d'interaction automatique de Linux Shell
Récemment, lors de l'installation d'un certain logiciel, j'ai constaté que certaines informations doivent être saisies lors du processus d'installation pour passer à l'étape suivante. Lorsque le nombre de machines est petit, nous pouvons nous connecter pour terminer le processus. opération d'installation sur une seule machine, mais lorsque le nombre de machines dépasse un certain point, si vous vous reconnectez manuellement, un grand nombre d'opérations répétitives seront générées, ce qui n'améliorera pas les capacités d'apprentissage efficaces, mais générera également grandement incertitude et provoquer une diminution de l'efficacité du travail Alors, comment automatiser certaines opérations , notamment les étapes avec des fonctions interactives, comme la nécessité de saisir un compte et un mot de passe ?
Un lot de machines nouvellement livrées, chaque machine ne se voit attribuer qu'un seul disque. Maintenant, le disque est partitionné et monté selon les exigences.
Pour un disque, il existe généralement deux idées pour monter des partitions dans des répertoires différents :
Méthode 1 : Traitez l'intégralité du disque comme un PV, intégrez-le dans un volume VG, puis divisez la taille du volume LV en différentes tailles Deuxième méthode pour les attribuer à différents répertoires : utilisez fdisk pour diviser directement le disque dans la taille requise, puis initialisez le disque et terminez le montage
Ici, nous choisissons la deuxième méthode pour démontrer la fonction interactive, et la Le script d'implémentation est le suivant :
#!/bin/bash fdisk /dev/sdb <<EOF n p 1 wq EOF mkfs.xfs /dev/sdb1 && mkdir -p /data && mount /dev/sdb1 /data echo '/dev/sdb1 /data xfs defaults 0 2' >> /etc/fstab
En analysant le script ci-dessus, nous avons constaté qu'un mot-clé EOF
a été utilisé EOF
EOF
是END Of File的缩写,表示自定义终止符.既然自定义,那么EOF就不是固定的,可以随意设置别名,在linux按ctrl-d就代表EOF.
EOF
一般会配合cat
能够多行文本输出.
其用法如下:
.... //需要输入的内容
EOF //结束
例如使用 cat、和<code>>
以交互方式编写bash脚本,如下所示。
cat << EOF > script.sh #!/bin/bash printf "Hello\n" printf "Wordl!\n" EOF
合理 利用这三个,即可以完成对应多文本交互输入,例如修改用户密码,正常情况下,需要连续输入两次密码,两次密码一致才能修改成功,如下:
上面我们学会了EOF 这个关键字,那么我们试试通过它来修改密码。脚本如下:
#!/bin/bash cat << EOF| passwd 新密码 新密码,与上述需一致 EOF # or 不使用管道符 passwd << EOF 新密码 新密码,与上述需一致 EOF
实战结果,成功修改密码:
新交付了一批机器,需要给每台机器分发文件,如何实现?
远程拷贝文件常用密令是scp 或者 rsync ,但是在给每台机器传输时需要若输入密码,有的机器可能还需要输入YES,录入机器指纹信息,如下:
Expect 是在tcl基础上的一个自动化交互套件, 在一些需要交互输入指令的场景下, 可通过脚本设置自动进行交互通信. 其交互流程主要有以下5步:
0 定义变量
1 spawn启动指定脚本或命令
2 expect匹配结果关键词
3 send针对指定关键词发送指定指令
4 执行完成, 退出
但可惜的是os默认没有安装,因此需要先安装才能使用
Expect is a tcl application for automating and testing interactive applications such as telnet, ftp, passwd, fsck, rlogin, tip, etc. Expect makes it easy for a script to control another program and interact with it.
1. 先检查本机是否安装了expect ,如果没有安装,需要手动安装
# 检查是否安装了expect: [root@localhost ~]# rpm -qi expect Name : expect Version : 5.45 Release : 14.el7_1 Architecture: x86_64 Install Date: Fri 05 Aug 2022 07:26:04 AM CST Group : Development/Languages .... # 如果没有安装, 使用yum安装expect ,通常会顺带把依赖包tcl 也安装了: [root@localhost ~]# yum install -y expect # -y 其实也是安装过程中一个交互,发现没,只是作为参数传入了 [root@localhost ~]# yum install -y tcl # 如果上述命令提示已安装tcl了,此步可以忽略 # 查看expect的安装路径: [root@localhost ~]# which expect /usr/bin/expect
2 .对应功能脚本开发,本案例脚本参考如下:
[root@test01 ~]# cat scp.exp #! /usr/bin/expect set file [lindex $argv 0] set file2 [lindex $argv 1] spawn scp -rp $file $file2 root@192.168.31.89:/tmp expect { "(yes/no)" {send "yes\r";exp_continue} "*password:*" {send "Password\r"} } expect eof exit -onexit { send_user "bye \n" }
3. 分析上述脚本,有几个点需要说明
#!/usr/bin/expect
脚本文件的第一行指明expect 安装位置,具体可以参考2 中命令查看,指明脚本解析器,和Shell类似,表示程序使用Expect解析,这里与一般bash 脚本不同,因此需要注意,通常我们会将expect脚本后缀修改成exp来和bash 脚本 sh区别
set file [lindex $argv 0]
将传入的第一个参数赋给file ,类似第二、三个参数[lindex $argv 1] [lindex $argv 2]
等,后续调用时使用 $file
,和shell 一样。特殊参数:
$argc
表示传参的个数,$argv0
EOF
est END Of File L'abréviation représente un terminateur personnalisé puisqu'il est personnalisé, EOF n'est pas fixe. Sous Linux, appuyez sur ctrl-d pour représenter EOF. li>EOF
Généralement, il sera utilisé avec cat
pour générer du texte multiligne.
🎜🎜Par exemple, utilisezcat, et <code>>
pour écrire un script bash de manière interactive comme indiqué ci-dessous. 🎜#! /usr/bin/expect set time 30 set ip [lindex $argv 0] spawn ssh root@$ip uptime expect { "*yes/no" { send "yes\r"; exp_continue } "*password:" { send "$password\r" } } expect eof🎜🎜🎜 🎜🎜Utilisez ces trois raisonnablement et vous pouvez le compléter. Correspond à une saisie interactive multi-texte, telle que la modification des mots de passe des utilisateurs. Dans des circonstances normales, vous devez saisir le mot de passe deux fois de suite. Les deux mots de passe doivent être cohérents pour être modifiés avec succès, comme suit : 🎜🎜. 🎜🎜Nous avons appris le mot-clé EOF ci-dessus, essayons donc de l'utiliser pour changer le mot de passe. Le script est le suivant : 🎜#!/bin/bash ip="192.168.31.89" username="root" password="123456" cmd=" df -PTh|grep ^/dev" # 指定执行引擎 expect <<EOF set time 30 spawn ssh $username@$ip $cmd expect { "*yes/no" { send "yes\r"; exp_continue } "*password:" { send "$password\r" } } expect eof EOF🎜Résultats réels, mot de passe modifié avec succès : 🎜🎜🎜🎜2. Attendez-vous à une interaction automatique🎜🎜Cas d'exigence 2🎜🎜 Un lot de machines nouvellement livrées doit distribuer des fichiers à chaque machine. Comment y parvenir ? 🎜🎜Analyse des exigences : 🎜🎜Les mots de passe couramment utilisés pour la copie à distance de fichiers sont scp ou rsync, mais vous devez saisir un mot de passe lors du transfert vers chaque machine. Certaines machines peuvent également devoir saisir OUI et saisir les informations d'empreinte digitale de la machine, comme suit : 🎜🎜🎜🎜Attendez-vous est basé sur tcl Suite d'interactions automatisées, dans certains scénarios qui nécessitent une saisie interactive d'instructions, peut effectuer automatiquement une communication interactive via les paramètres de script. Le processus d'interaction comprend principalement les cinq étapes suivantes : 🎜🎜0 Définir des variables 🎜🎜1 spawn pour démarrer le spécifié. script ou commande 🎜🎜2 attendre les mots-clés du résultat correspondant🎜🎜3 envoyer envoie les instructions spécifiées pour les mots-clés spécifiés🎜🎜4 Exécution terminée, quitter🎜🎜Mais malheureusement, os n'est pas installé par défaut, il doit donc être installé avant de pouvoir être utilisé 🎜🎜Expect est une application TCL permettant d'automatiser et de tester des applications interactives telles que telnet, ftp, passwd, fsck, rlogin, tip, etc. Expect permet à un script de contrôler facilement un autre programme et d'interagir avec lui.🎜🎜Solution :🎜🎜1. Vérifiez d'abord si Expect est installé sur cette machine. S'il n'est pas installé, vous devez l'installer manuellement🎜rrreee🎜2. Développement de script de fonction correspondant, le script de référence de ce cas est le suivant. suit :🎜rrreee🎜3. En analysant le script ci-dessus, plusieurs points doivent être expliqués🎜rrreee🎜 La première ligne du fichier de script indique l'emplacement d'installation attendu. Pour plus de détails, veuillez vous référer à la commande en 2. Elle indique. l'analyseur de script, qui est similaire à Shell. Cela signifie que le programme utilise Expect pour analyser. Ceci est différent du script bash général, vous devez donc faire attention. Habituellement, nous utiliserons le suffixe de script. exp pour le distinguer du script bash sh🎜🎜set définit la valeur de la variable🎜🎜etc. Utilisezset file [lindex $argv 0]
attribue le premier paramètre transmis au fichier, similaire au second, trois paramètres [lindex $argv 1] [lindex $argv 2]$file
pour les appels suivants, comme pour le shell. Paramètres spéciaux : 🎜🎜$argc
représente le nombre de paramètres passés,$argv0
représente le nom du script 🎜🎜spawn table name est le script ou la commande du programme à exécuter , comme ssh, scp etc🎜格式: spawn [选项] [需要自动交互的命令或程序]
例如:
spawn scp -rp $file $file2 root@192.168.31.89:/tmp
#<==执行scp命令(注意开头必须要有spawn, 否则无法实现交互)expect
需和spawn 配合使用 ,表示匹配
spawn
指定的脚本或命令的输出结果
,如果与expect
后面的字符串匹配,就执行下面的send
命令,表示对结果响应反馈有时命令的输出提示信息有可能会变化,所以可以在expect中使用模糊匹配,比如
*
。注意:匹配的动作也可以放在下一行,这样就不需要使用{}(大括号)了
send
在expect命令匹配指定的字符串后,发送指定的字符串给系统,这些命令可以支持一些特殊转义符号,例如:\r表示回车、\n表示换行、\t表示制表符等
exp_continue
从命令的拼写就可以看出命令的作用,即让Expect程序继续匹配的意思,如果需要一次匹配多个字符串,那么不同的匹配之间就要加上exp_continue,否则expect将不会自动输入指定的字符串。由于前面的都已经完成,最后一个不必加上exp_continue,它已经是最后一个了
exit
功能类似于Shell中的exit,即直接退出脚本,还可以利用这个命令对脚本做一些关闭前提示等工作
send_user
打印Expect脚本信息,类似Shell里的echo. 例如打印变量信息,验证数据传入是否正常
在掌握expect 基本使用方式后,我们写一个批量查看机器负载信息的小脚本,加强记忆
#! /usr/bin/expect set time 30 set ip [lindex $argv 0] spawn ssh root@$ip uptime expect { "*yes/no" { send "yes\r"; exp_continue } "*password:" { send "$password\r" } } expect eof实战结果:
小试牛刀
在学习完以上两个方法,我们试着写一个脚本,结合上述两种方式,批量查看各机器目录挂载情况,并列举出来,参考脚本如下:
#!/bin/bash ip="192.168.31.89" username="root" password="123456" cmd=" df -PTh|grep ^/dev" # 指定执行引擎 expect <<EOF set time 30 spawn ssh $username@$ip $cmd expect { "*yes/no" { send "yes\r"; exp_continue } "*password:" { send "$password\r" } } expect eof EOF
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!