Programmation Shell - Documentez ici l'interaction gratuite et attendez-vous à une interaction automatisée


1. Ici, le document est libre d'interaction

1. Vue d'ensemble

  • Utilisez la redirection d'E / S pour fournir une liste de commandes aux programmes interactifs ou aux commandes, telles que les commandes ftp, cat ou read
  • C'est un substitut à l'entrée standard, qui peut aider les développeurs de scripts à ne pas utiliser de fichiers temporaires pour construire des informations d'entrée, mais à générer directement un «fichier» sur place et à l'utiliser comme entrée standard pour les «commandes»
  • Ici, le document peut également être utilisé avec des programmes et des commandes non interactifs

2. Format de grammaire

命令 <<标记
...
内容    #标记直接是传入内容
...
标记

3. Questions nécessitant une attention particulière

  • Mark peut utiliser n'importe quel caractère légal (utilise généralement EOF)
  • La marque de fin doit être écrite dans la grille du haut sans aucun caractère devant
  • Il ne peut y avoir aucun caractère (y compris les espaces) après la balise de fin
  • Les espaces avant et après la balise d'ouverture seront omis

4. Exemple

4.1 Mode sans interaction pour réaliser les statistiques du nombre de lignes

  • Placez le contenu à compter entre les balises "EOF"
  • Passez le contenu directement à wc -l pour les statistiques
[root@localhost ~]# wc -l <<EOF
> xcf1
> xcf2
> EOF
2

marque

4.2 Recevoir une entrée et imprimer via la commande de lecture

  • La valeur d'entrée est la partie entre les deux balises EOF
  • Attribuer une valeur directement à la variable i
[root@localhost ~]# read i <<EOF
> hello xcf~
> EOF
[root@localhost ~]# echo $i
hello xcf~

marque

4.3 Définir le mot de passe de l'utilisateur via passwd

[root@localhost ~]# useradd xcf123
[root@localhost ~]# passwd xcf123 << EOF
123123
123123
EOF
更改用户 xcf123 的密码 。
新的 密码:无效的密码: 密码少于 8 个字符
重新输入新的 密码:passwd:所有的身份验证令牌已经成功更新。

marque

4.4 Prise en charge de la substitution de variables

  • Lors de l'écriture du fichier, la variable sera remplacée par la valeur réelle
  • Combinez ensuite la commande cat pour terminer l'écriture
[root@localhost shell]# vim zxc1.sh

#!/bin/bash

file="xcf1.txt"
i="chicken"
cat > $file <<EOF
I'd like some $i
EOF
[root@localhost shell]# . zxc1.sh 
[root@localhost shell]# ls
xcf1.txt  zxc1.sh
[root@localhost shell]# cat xcf1.txt 
I'd like some chicken

marque
marque

4.5 Attribuez une valeur à la variable dans son ensemble, puis imprimez la valeur de la variable via la commande echo

[root@localhost shell]# vim zxc2.sh

#!/bin/bash

name="OMG! xucheng come!"
myname=$(cat <<EOF
It's a beautiful day
Today is Sunday
School starts again tomorrow
$name ~
EOF
)
echo $myname
[root@localhost shell]# . zxc2.sh 
It's a beautiful day Today is Sunday School starts again tomorrow OMG! xucheng come! ~

marque
marque

4.6 Désactiver la fonction de substitution de variable

  • Cela affichera les caractères tels qu'ils sont
  • Sans aucune modification ni remplacement
    marque
    marque

4.7 Supprimer le caractère TAB avant chaque ligne

  • Pas très utile, sachant que cet usage permet de supprimer le caractère de tabulation dans chaque ligne
    marque
    marque

4.8 Commentaires sur plusieurs lignes

  • Le commentaire par défaut de Bash est "#", cette méthode de commentaire ne prend en charge que les commentaires sur une seule ligne
  • L'introduction de Here Document résout le problème des commentaires multilignes
  • ":" représente une commande vide qui ne fait rien
  • Le contenu de la zone de marque du milieu ne sera pas exécuté et sera ignoré par bash, de sorte que l'effet des commentaires de lots peut être obtenu
    marque
    marque

Deuxièmement, attendez-vous à une interaction automatisée

1. Vue d'ensemble

  • expect est un langage d'outil de programmation gratuit, couramment utilisé pour réaliser des tâches automatiques et interactives pour communiquer sans intervention humaine
  • expect a besoin du support du langage de programmation Tcl. Pour exécuter expect sur le système, Tcl doit être installé en premier
yum -y install tcl

yum -y install expect

2. Commandes de base

2.1 Interpréteur de script

  • Le fichier est d'abord introduit dans le script expect pour indiquer quel shell est utilisé
#!/usr/bin/expect

2.2 frayer

  • Spawn est généralement suivi d'une commande d'exécution Linux, ce qui signifie ouvrir une session, démarrer le processus et suivre les informations d'interaction suivantes
例: spawn passwd root          ##跟踪启动更改用户密码的进程

2,3 s'attendre

  • Jugez si le dernier résultat d'entrée contient la chaîne spécifiée, s'il y en a, retournez immédiatement, sinon, attendez le délai d'expiration et retournez
  • Peut uniquement capturer la sortie du processus démarré par spawn
  • Utilisé pour recevoir la sortie après l'exécution de la commande, puis correspondre à la chaîne attendue

2.4 envoyer

  • Envoyer une chaîne au processus pour simuler l'entrée utilisateur
  • Cette commande ne peut pas entrer automatiquement et saut de ligne, généralement ajouter \ r (retour chariot) ou \ n
  • première méthode
expect “密码” {
    
    send “abc123\r”}
##同一行send部分要有{}
  • Voie deux
expect “密码”
send “$abc123\r”
##换行send部分不需要有{}
  • Troisième voie
expect “支持多个分支

expect  {
    
            ##只要匹配了其中一个情况,就执行相应的send语句后退出该expect语句
"密码1 {send "abc123\r"}"
"密码2 {send "123123\r"}"
"密码3 {send "123123\r"}"
}

2.5 Terminateur

expect eof
  • Indique la fin de l'interaction, attend la fin de l'exécution et retourne à l'utilisateur d'origine, correspondant à spawn
  • Par exemple: basculer vers l'utilisateur root, le script expect attend par défaut 10 secondes. Après avoir exécuté la commande, il reviendra automatiquement à l'utilisateur d'origine après 10 secondes par défaut.
interact
  • Une fois l'exécution terminée, l'état interactif est conservé et le contrôle est transféré vers la console. Il restera au terminal cible. À ce stade, il peut être actionné manuellement. Les commandes après l'interaction ne fonctionneront pas. , Comme le passage à l'utilisateur root, sera toujours l'utilisateur root
  • Par exemple, ssh vers un autre serveur sera toujours sur le terminal du serveur cible au lieu de revenir au serveur d'origine
  • Remarque: Attendez-vous à eof et interagissez ne peut en choisir qu'un

2.6 ensemble

  • Le délai d'expiration par défaut attendu est de 10 secondes. Le délai d'expiration de la session peut être défini via la commande set. Si le délai d'expiration n'est pas limité, il doit être défini sur -1
##例:
set timeout 30

2.7 exp_continue

  • exp_continue est ajouté à un certain élément de jugement attendu, de sorte qu'une fois que l'élément est mis en correspondance, il peut continuer à correspondre à d'autres éléments dans la phrase de jugement attendu
  • exp_continue est similaire à l'instruction continue dans l'instruction de contrôle, ce qui signifie que expect continue d'exécuter les instructions vers le bas
  • L'exemple suivant déterminera s'il y a oui / non ou * mot de passe dans la sortie interactive. S'il correspond à oui / non, affichez yes et exécutez à nouveau le jugement; s'il correspond à * assword, affichez 123123 et terminez l'instruction expect
expect
"(yes/no)" {
    
    send "yes\r"; exp_ continue; }
"*password" {
    
    set timeout 300; send "123123\r";}

2.8 send_user

  • send_ user signifie commande echo, équivalente à echo

2.9 Paramètres de réception

  • Le script expect peut accepter les paramètres passés depuis la ligne de commande bash, et utiliser [lindex $ argv n] pour l'obtenir, où n commence à 0 et représente le premier, le deuxième, le troisième ...
  • Exemple:
set hostname [lindex $argv 0]
##相当于hostname=$1
set password [lindex $argv 1]
##相当于password=$2

3. attendez une exécution directe

  • Prenons l'exemple de SSH:
    • $ argv 0 représente la variable de position $ 1
    • $ argv 1 représente la variable de position $ 2
    • #! / usr / bin / expect est le chemin du fichier binaire Expect
[root@localhost shell]# vim zxc11.sh 

#!/usr/bin/expect
#设置超时时间
set timeout 20
#开启日志
log_file test.log
#显示信息
log_user 1
#定义变量
set hostname [lindex $argv 0]
set password [lindex $argv 1]
#追踪指令
spawn ssh root@${hostname}
#捕捉提示信息
expect {
    
    
        "connecting (yes/no)"
        {
    
    send "yes\r";exp_continue}
        "*password:"
        {
    
    send "${password}\r";}
}
#转交控制权
interact

marque

4. attendez une exécution intégrée

  • Intégrez le processus expect dans le Shell pour faciliter l'exécution et le traitement
  • Créer un utilisateur et définir un mot de passe
#! /bin/bash
user=$1
password=$2
#非交互命令放在expect外面
useradd $user
#开始免交换执行
/usr/bin/expect <<-EOF
#expect开始标志,-去掉制表符
spawn passwd $user
#开启-一个进程跟踪passwd命令,expect只能捕捉该进程信息
expect "新的*"
send "$ {password}\r" .
expect "重新*"
send "$ {password} \r"
expect eof
EOF
  • Prenons l'exemple de SSH:
#!/bin/bash
  hostname=$1
  password=$2
  /usr/bin/expect<<-EOF
  spawn ssh root@${hostname}
  expect {
      "(yes/no)"
      {send "yes\r";exp_continue}
      "*password"
      {send "$password\r"}
  }
  expect "*]#"
  send "exit\r"
  expect eof
EOF		'Expect结束标志,EOF前后不能有空格'

5. Réalisez la connexion automatique SSH

[root@localhost shell]# vim zxc12.sh 

#!/usr/bin/expect
set timeout 15
set hostname [lindex $argv 0]
set password [lindex $argv 1]
spawn ssh root@${hostname}
expect {
    
    
        "connection refused" exit
        #连接失败情况,比如对方ssh服务关闭
        "Name or service not known" exit
        #找不到服务器,比如输入的IP地址不正确
        "to continue"{
    
    send "yes\r";exp_continue}
        "password:"{
    
    send "${password}\r";}
}
interact
#携带interact参数表示登录成功后将控制台交给用户,否则登录完成后将退出
exit

marque

6. Créer un disque sans interaction

  • Ajoutez d'abord manuellement un disque à l'état désactivé de la machine virtuelle, puis mettez-le sous tension
    marque
  • Scripting
[root@localhost ~]# vim disk.sh


#!/bin/bash

disk=$1

/usr/bin/expect <<-EOF

spawn fdisk $disk

expect "命令" {
    
    send "n\r"}
expect "Select" {
    
    send "\r"}
expect "分区" {
    
    send "\r"}
expect "起始" {
    
    send "\r"}
expect "Last" {
    
    send "\r"}
expect "命令(输入 m 获取帮助):" {
    
    send "w\r"}
expect eof
EOF
partprobe
mkfs.xfs $disk -f &> /dev/null

if [ $? -eq 0 ]
    then
    echo -e "\033[31m 磁盘格式化完成 \033[0m"
    mkdir $disk.1
    mount $disk $disk.1
    df -h
    else
    echo "格式化失败,脚本有bug"
fi
  • Vérifiez si les packages mentionnés au début de cet article sont installés
[root@localhost ~]# rpm -q tcl
tcl-8.5.13-8.el7.x86_64
[root@localhost ~]# rpm -q expect
expect-5.45-14.el7_1.x86_64
  • Exécuter le script
[root@localhost ~]# sh disk.sh /dev/sdb$1
spawn fdisk /dev/sdb
欢迎使用 fdisk (util-linux 2.23.2)

更改将停留在内存中,直到您决定将更改写入磁盘。
使用写入命令前请三思。

Device does not contain a recognized partition table
使用磁盘标识符 0x1f0887af 创建新的 DOS 磁盘标签。

命令(输入 m 获取帮助):n
Partition type:
   p   primary (0 primary, 0 extended, 4 free)
   e   extended
Select (default p): 
Using default response p
分区号 (1-4,默认 1)
起始 扇区 (2048-41943039,默认为 2048)
将使用默认值 2048
Last 扇区, +扇区 or +size{
    
    K,M,G} (2048-41943039,默认为 41943039)
将使用默认值 41943039
分区 1 已设置为 Linux 类型,大小设为 20 GiB

命令(输入 m 获取帮助):w
The partition table has been altered!

Calling ioctl() to re-read partition table.
正在同步磁盘。
Warning: 无法以读写方式打开 /dev/sr0 (只读文件系统)。/dev/sr0 已按照只读方式打开。
 磁盘格式化完成 
文件系统        容量  已用  可用 已用% 挂载点
/dev/sda2        20G  3.8G   17G   19% /
devtmpfs        1.9G     0  1.9G    0% /dev
tmpfs           1.9G     0  1.9G    0% /dev/shm
tmpfs           1.9G  9.0M  1.9G    1% /run
tmpfs           1.9G     0  1.9G    0% /sys/fs/cgroup
/dev/sr0        4.3G  4.3G     0  100% /mnt
/dev/sda1       6.0G  174M  5.9G    3% /boot
/dev/sda3        10G   37M   10G    1% /home
tmpfs           378M  8.0K  378M    1% /run/user/42
tmpfs           378M     0  378M    0% /run/user/0
/dev/sdb         20G   33M   20G    1% /dev/sdb.1

Je suppose que tu aimes

Origine blog.csdn.net/weixin_51486343/article/details/111826792
conseillé
Classement