Rumah >Operasi dan penyelenggaraan >operasi dan penyelenggaraan linux >Bagaimana untuk melaksanakan fungsi interaksi automatik Shell Linux

Bagaimana untuk melaksanakan fungsi interaksi automatik Shell Linux

PHPz
PHPzke hadapan
2023-05-29 12:43:182469semak imbas

Latar belakang permintaan:

Baru-baru ini, semasa pemasangan perisian tertentu, saya mendapati bahawa saya perlu memasukkan beberapa maklumat sebelum meneruskan ke langkah seterusnya Apabila bilangan mesin kecil, kita boleh log masuk ke mesin tunggal untuk menyelesaikan pemasangan Walau bagaimanapun, apabila bilangan mesin melebihi tahap tertentu, operasi log masuk manual akan menghasilkan sejumlah besar operasi berulang, yang tidak akan meningkatkan keupayaan pembelajaran yang berkesan, tetapi juga akan menjana ketidakpastian dan menyebabkan ketidakpastian. penurunan dalam kecekapan kerja. Jadi bagaimana pula dengan mengautomasikan operasi tertentu, terutamanya langkah dengan fungsi interaktif, seperti keperluan untuk memasukkan akaun dan kata laluan?

1. Input berbilang teks EOF

Kes Keperluan 1

Sekumpulan mesin baharu telah dihantar, dan setiap mesin hanya diperuntukkan satu cakera jatuh diperuntukkan berdasarkan permintaan Bagaimana untuk partition dan mount?

Analisis keperluan:

Untuk cakera, untuk melekapkan partition pada direktori yang berbeza, biasanya terdapat dua idea:

Kaedah 1: Rawat keseluruhan cakera sebagai PV, Integrate ia menjadi volum VG, dan kemudian bahagikannya ke dalam direktori yang berbeza mengikut saiz volum LV yang berbeza Kaedah 2: Gunakan fdisk untuk membahagikan cakera secara terus kepada saiz yang diperlukan, kemudian mulakan cakera dan lengkapkan pemasangan

Penyelesaian

Di sini kami memilih kaedah 2 untuk menunjukkan fungsi interaktif Skrip pelaksanaan adalah seperti berikut:

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

Menganalisis skrip di atas, kami mendapati bahawa kata kunci

EOF<.>

    ialah singkatan END Of File, yang bermaksud terminator tersuai, EOF tidak ditetapkan mengikut kehendak Linux untuk mewakili EOF
  • EOF

  • biasanya digunakan dengan
  • untuk mengeluarkan teks berbilang baris :

    EOFcat

  • .... //Apa yang perlu dimasukkan

EOF //Tamat

Sebagai contoh, gunakan

dan

secara interaktif Tulis skrip bash seperti yang ditunjukkan di bawah.

cat << EOF > script.sh
#!/bin/bash
 
printf "Hello\n"
printf "Wordl!\n"
EOF

cat、<code>>

Menggunakan ketiga-tiga ini secara rasional, anda boleh melengkapkan input interaktif berbilang teks yang sepadan, seperti menukar kata laluan pengguna Dalam keadaan biasa , anda perlu Masukkan kata laluan dua kali berturut-turut, dan kedua-dua kata laluan mesti konsisten untuk berjaya menukar kata laluan, seperti berikut:

Bagaimana untuk melaksanakan fungsi interaksi automatik Shell Linux

Bagaimana untuk melaksanakan fungsi interaksi automatik Shell LinuxKami mempelajari kata kunci EOF di atas, jadi mari cuba gunakannya untuk menukar kata laluan. Skripnya adalah seperti berikut:

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

Hasil sebenar, kata laluan telah berjaya ditukar:

Bagaimana untuk melaksanakan fungsi interaksi automatik Shell Linux

2 Jangkakan interaksi automatik

Kes keperluan 2

  Sekumpulan mesin yang baru dihantar perlu diedarkan kepada setiap mesin. Bagaimana untuk mencapai ini? Bagaimana untuk melaksanakan fungsi interaksi automatik Shell Linux

Analisis keperluan:

Kata laluan yang biasa digunakan untuk menyalin fail dari jauh adalah scp atau rsync Walau bagaimanapun, anda perlu memasukkan kata laluan apabila memindahkan ke setiap mesin juga mungkin perlu memasukkan YA dan masukkan cap jari mesin. Maklumatnya adalah seperti berikut:

Expect ialah suite interaksi automatik berdasarkan tcl Dalam sesetengah senario yang memerlukan input interaktif arahan, komunikasi interaktif boleh dilakukan secara automatik melalui tetapan skrip. Proses interaksi terutamanya mempunyai lima langkah berikut:

0 Tentukan pembolehubah

1 spawn untuk memulakan skrip atau arahan yang ditentukan Bagaimana untuk melaksanakan fungsi interaksi automatik Shell Linux

2 jangkakan hasil yang sepadan kata kunci

3 hantarMenghantar arahan yang ditentukan untuk kata kunci yang ditentukan

4 Pelaksanaan selesai, keluar

Tetapi malangnya, os tidak dipasang secara lalai, jadi ia perlu dipasang sebelum digunakan

Expect ialah aplikasi tcl untuk mengautomasikan dan menguji aplikasi interaktif seperti telnet, ftp, passwd, fsck, rlogin, tip, dll. Expect memudahkan skrip untuk mengawal atur cara lain dan berinteraksi dengannya .

Penyelesaian:

1 Periksa dahulu sama ada jangkakan dipasang pada mesin Jika tidak, anda perlu memasangnya secara manual
# 检查是否安装了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 pembangunan skrip, rujukan untuk skrip kes ini adalah seperti berikut:

[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 Menganalisis skrip di atas, terdapat beberapa perkara yang perlu dijelaskan

#!/usr/bin/expect

Barisan pertama fail skrip. menentukan lokasi pemasangan jangkakan untuk butiran, sila rujuk arahan dalam 2 untuk menentukan penghurai skrip dan Shell Begitu juga, ini bermakna program menggunakan penghuraian Jangka, yang berbeza daripada skrip bash umum, jadi ia perlu diperhatikan. bahawa biasanya kita akan menukar akhiran skrip jangkaan kepada exp untuk membezakannya daripada skrip bash sh

tetapkan nilai pembolehubah yang ditetapkan

Tetapkan parameter pertama yang dihantar ke fail, sama seperti parameter kedua dan ketiga

, dsb. Gunakan

dalam panggilan seterusnya, sama seperti shell. Parameter khas:

mewakili bilangan parameter yang diluluskan,

mewakili nama skrip set file [lindex $argv 0][lindex $argv 1] [lindex $argv 2]nama jadual bertelur ialah skrip atau arahan atur cara yang akan dilaksanakan, seperti ssh , scp, dsb. $file

格式: 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

实战结果:

Bagaimana untuk melaksanakan fungsi interaksi automatik Shell Linux

小试牛刀

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

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

Atas ialah kandungan terperinci Bagaimana untuk melaksanakan fungsi interaksi automatik Shell Linux. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:yisu.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam