Maison >Opération et maintenance >exploitation et maintenance Linux >Comment implémenter la fonction d'interaction automatique de Linux Shell

Comment implémenter la fonction d'interaction automatique de Linux Shell

PHPz
PHPzavant
2023-05-29 12:43:182469parcourir

Contexte de la demande :

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 ?

1. Saisie multi-texte EOF

Cas d'exigence 1

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.

Analyse des besoins :

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

Solution

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

Comment implémenter la fonction dinteraction automatique de Linux Shell

Comment implémenter la fonction dinteraction automatique de Linux Shell

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

Comment implémenter la fonction dinteraction automatique de Linux Shell

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

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

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

Comment implémenter la fonction dinteraction automatique de Linux Shell

2. Expect 自动交互

需求案例 2

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

需求分析:

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

Comment implémenter la fonction dinteraction automatique de 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 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>

    EOFGénéralement, il sera utilisé avec cat pour générer du texte multiligne.

🎜L'utilisation est la suivante :🎜
🎜🎜Par exemple, utilisez cat, 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
🎜Comment implémenter la fonction d'interaction automatique de Linux Shell🎜🎜 Comment implémenter la fonction d'interaction automatique de Linux Shell🎜🎜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 : 🎜🎜. Comment implémenter la fonction d'interaction automatique de Linux Shell🎜🎜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 : 🎜🎜 Linux Shell automatiquement Comment implémenter la fonction interactive🎜🎜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 : 🎜🎜Comment implémenter la fonction d'interaction automatique de Linux Shell🎜🎜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🎜🎜set file [lindex $argv 0] attribue le premier paramètre transmis au fichier, similaire au second, trois paramètres [lindex $argv 1] [lindex $argv 2]
etc. Utilisez $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

实战结果:

Comment implémenter la fonction dinteraction automatique de 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

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!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer