Heim >Betrieb und Instandhaltung >Betrieb und Wartung von Linux >So implementieren Sie die automatische Interaktionsfunktion der Linux-Shell

So implementieren Sie die automatische Interaktionsfunktion der Linux-Shell

PHPz
PHPznach vorne
2023-05-29 12:43:182468Durchsuche

Nachfragehintergrund:

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?

1. EOF-Multitext-Eingabe

Anforderungsfall 1

Ein Stapel neu gelieferter Maschinen, jeder Maschine ist nur eine Festplatte zugewiesen und wird entsprechend den Anforderungen bereitgestellt.

Anforderungsanalyse:

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

Lösung

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 &#39;/dev/sdb1 /data xfs defaults 0 2&#39; >> /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

So implementieren Sie die automatische Interaktionsfunktion der Linux-Shell

So implementieren Sie die automatische Interaktionsfunktion der Linux-Shell

合理 利用这三个,即可以完成对应多文本交互输入,例如修改用户密码,正常情况下,需要连续输入两次密码,两次密码一致才能修改成功,如下:

So implementieren Sie die automatische Interaktionsfunktion der Linux-Shell

上面我们学会了EOF 这个关键字,那么我们试试通过它来修改密码。脚本如下:

#!/bin/bash
 
cat << EOF| passwd 
新密码
新密码,与上述需一致
EOF
 
# or 不使用管道符
 
passwd << EOF
新密码
新密码,与上述需一致
EOF

实战结果,成功修改密码:

So implementieren Sie die automatische Interaktionsfunktion der Linux-Shell

2. Expect 自动交互

需求案例 2

  新交付了一批机器,需要给每台机器分发文件,如何实现?

需求分析:

远程拷贝文件常用密令是scp 或者 rsync ,但是在给每台机器传输时需要若输入密码,有的机器可能还需要输入YES,录入机器指纹信息,如下:

So implementieren Sie die automatische Interaktionsfunktion der Linux-Shell

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 设置变量值

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

  • EOFIm Allgemeinen wird es mit cat verwendet, um mehrzeiligen Text auszugeben.🎜
🎜Die Verwendung ist wie folgt:🎜
🎜🎜Verwenden Sie beispielsweise 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
🎜So implementieren Sie die automatische Interaktionsfunktion von Linux Shell🎜🎜 So implementieren Sie die automatische Interaktionsfunktion von Linux Shell🎜🎜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: 🎜🎜 So implementieren Sie die automatische Interaktionsfunktion von Linux Shell🎜🎜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: 🎜🎜 Linux Shell automatisch So implementieren Sie die interaktive Funktion“ />🎜🎜2. Erwarten Sie eine automatische Interaktion🎜🎜Anforderungsfall 2🎜🎜  Ein Stapel neu gelieferter Maschinen muss Dateien an jede Maschine verteilen. Wie erreicht man das? 🎜🎜Anforderungsanalyse: 🎜🎜Üblicherweise verwendete Passwörter für das Remote-Kopieren von Dateien sind scp oder rsync. Bei der Übertragung auf jeden Computer müssen Sie jedoch möglicherweise auch JA und die Fingerabdruckinformationen des Computers eingeben : 🎜🎜<img src=🎜🎜 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.🎜
🎜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🎜🎜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, 否则无法实现交互)

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

实战结果:

So implementieren Sie die automatische Interaktionsfunktion der Linux-Shell

小试牛刀

在学习完以上两个方法,我们试着写一个脚本,结合上述两种方式,批量查看各机器目录挂载情况,并列举出来,参考脚本如下:

#!/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!

Stellungnahme:
Dieser Artikel ist reproduziert unter:yisu.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen