Heim >Betrieb und Instandhaltung >Betrieb und Wartung von Linux >So implementieren Sie die automatische Interaktionsfunktion der Linux-Shell
Kürzlich habe ich bei der Installation einer bestimmten Software festgestellt, dass während des Installationsvorgangs einige Informationen eingegeben werden müssen, um mit dem nächsten Schritt fortzufahren. Wenn die Anzahl der Maschinen gering ist, können wir uns anmelden, um den Vorgang abzuschließen Der Installationsvorgang erfolgt auf einem einzelnen Computer, aber wenn die Anzahl der Computer einen bestimmten Punkt überschreitet und Sie sich erneut manuell anmelden, wird eine große Anzahl sich wiederholender Vorgänge generiert, was die effektive Lernfähigkeit nicht verbessert, aber auch erheblich Wie können also bestimmte Vorgänge, insbesondere Schritte mit interaktiven Funktionen, wie die Notwendigkeit der Eingabe eines Kontos und eines Passworts, automatisiert werden?
Ein Stapel neu gelieferter Maschinen, jeder Maschine ist nur eine Festplatte zugewiesen und wird entsprechend den Anforderungen bereitgestellt.
Für eine Festplatte gibt es normalerweise zwei Ideen zum Mounten von Partitionen in verschiedene Verzeichnisse:
Methode 1: Behandeln Sie die gesamte Festplatte als PV, integrieren Sie sie in ein VG-Volume und teilen Sie dann die Größe des LV-Volumes auf in verschiedene Größen Methode zwei, um sie verschiedenen Verzeichnissen zuzuweisen: Verwenden Sie fdisk, um die Festplatte direkt in die erforderliche Größe aufzuteilen, initialisieren Sie dann die Festplatte und schließen Sie die Montage ab
Hier wählen wir Methode zwei, um die interaktive Funktion zu demonstrieren, und die Das Implementierungsskript lautet wie folgt:
#!/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
Bei der Analyse des obigen Skripts haben wir festgestellt, dass ein Schlüsselwort EOF
verwendet wurde 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
ist END Of File. Da es sich um einen benutzerdefinierten Terminator handelt, können Sie unter Linux einen Alias festlegen, um
EOF
Im Allgemeinen wird es mit cat
verwendet, um mehrzeiligen Text auszugeben.🎜🎜🎜Verwenden Sie beispielsweise🎜Lösung:🎜🎜1. Überprüfen Sie zunächst, ob Expect auf diesem Computer installiert ist. Wenn es nicht installiert ist, müssen Sie es manuell installieren. Das entsprechende Funktionsskript für diesen Fall lautet wie folgt: 🎜rrreee🎜3. Bei der Analyse des obigen Skripts gibt es mehrere Punkte, die erklärt werden müssen🎜rrreee🎜 Die erste Zeile der Skriptdatei gibt den erwarteten Installationsort an. Weitere Informationen finden Sie im Befehl in 2. Sie gibt das Skript an Parser, der Shell ähnelt. Dies bedeutet, dass das Programm Expect zum Parsen verwendet. Daher müssen wir darauf achten, dass das Skriptsuffix in exp geändert wird Unterscheidet es vom Bash-Skript. sh🎜🎜set setzt den Variablenwert🎜🎜cat, und <code>>
, um ein interaktives Bash-Skript zu schreiben, wie unten gezeigt. 🎜#! /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🎜🎜🎜 🎜🎜Verwenden Sie diese drei angemessen und Sie können es vervollständigen. Entspricht der interaktiven Eingabe mit mehreren Texten, z. B. dem Ändern von Benutzerkennwörtern. Die beiden Kennwörter müssen wie folgt konsistent sein, um erfolgreich geändert zu werden: 🎜🎜 🎜🎜Wir haben das gelernt Schlüsselwort EOF oben, also versuchen wir, es zum Ändern des Passworts zu verwenden. Das Skript lautet wie folgt: 🎜#!/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🎜Tatsächliche Ergebnisse, Passwort erfolgreich geändert: 🎜🎜🎜🎜 Expect basiert auf der automatisierten Interaktionssuite von tcl. In einigen Szenarien, die eine interaktive Eingabe von Anweisungen erfordern, kann die interaktive Kommunikation automatisch über Skripteinstellungen durchgeführt werden. Der Interaktionsprozess besteht hauptsächlich aus den folgenden fünf Schritten: 🎜🎜0 Variablen definieren 🎜🎜1 Spawn zum Starten angegebenes Skript oder Befehl 🎜🎜2 passende Ergebnisschlüsselwörter erwarten 🎜🎜3 senden sendet angegebene Anweisungen für angegebene Schlüsselwörter 🎜🎜4 Ausführung abgeschlossen, Beenden 🎜🎜Aber leider ist das Betriebssystem nicht standardmäßig installiert, daher muss es vor der Verwendung installiert werden 🎜🎜Expect ist eine TCL-Anwendung zum Automatisieren und Testen interaktiver Anwendungen wie Telnet, FTP, Passwd, Fsck, Rlogin, Tip usw. Expect erleichtert einem Skript die Steuerung eines anderen Programms und die Interaktion mit diesem.🎜
set file [lindex $argv 0]
weist den ersten übergebenen Parameter der Datei zu, ähnlich dem zweiten, drei Parameter [lindex $argv 1] [lindex $argv 2]
usw. Verwenden Sie $file
für nachfolgende Aufrufe, genau wie bei Shell. Spezielle Parameter: 🎜🎜$argc
stellt die Anzahl der übergebenen Parameter dar, $argv0
stellt den Namen des Skripts dar 🎜🎜Spawn-Tabellenname ist das auszuführende Skript oder der Programmbefehl , wie ssh, scp usw.🎜格式: spawn [选项] [需要自动交互的命令或程序]
例如:spawn scp -rp $file $file2 root@192.168.31.89:/tmp
#<==执行scp命令(注意开头必须要有spawn, 否则无法实现交互)
需和spawn 配合使用 ,表示匹配spawn
指定的脚本或命令的输出结果
,如果与expect
后面的字符串匹配,就执行下面的send
命令,表示对结果响应反馈
有时命令的输出提示信息有可能会变化,所以可以在expect中使用模糊匹配,比如*
。
注意:匹配的动作也可以放在下一行,这样就不需要使用{}(大括号)了
在expect命令匹配指定的字符串后,发送指定的字符串给系统,这些命令可以支持一些特殊转义符号,例如:\r表示回车、\n表示换行、\t表示制表符等
从命令的拼写就可以看出命令的作用,即让Expect程序继续匹配的意思,如果需要一次匹配多个字符串,那么不同的匹配之间就要加上exp_continue,否则expect将不会自动输入指定的字符串。由于前面的都已经完成,最后一个不必加上exp_continue,它已经是最后一个了
功能类似于Shell中的exit,即直接退出脚本,还可以利用这个命令对脚本做一些关闭前提示等工作
打印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
Das obige ist der detaillierte Inhalt vonSo implementieren Sie die automatische Interaktionsfunktion der Linux-Shell. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!