Rumah >Operasi dan penyelenggaraan >operasi dan penyelenggaraan linux >Bagaimana untuk melaksanakan fungsi interaksi automatik Shell Linux
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?
Sekumpulan mesin baharu telah dihantar, dan setiap mesin hanya diperuntukkan satu cakera jatuh diperuntukkan berdasarkan permintaan Bagaimana untuk partition dan mount?
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#!/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/fstabMenganalisis skrip di atas, kami mendapati bahawa kata kunci
EOF
<.>
EOF
EOF
cat
EOF //Tamat
Sebagai contoh, gunakan
dansecara interaktif Tulis skrip bash seperti yang ditunjukkan di bawah.
cat << EOF > script.sh #!/bin/bash printf "Hello\n" printf "Wordl!\n" EOF
cat、<code>>
Kami 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:
2 Jangkakan interaksi automatik
Kes keperluan 2
Sekumpulan mesin yang baru dihantar perlu diedarkan kepada setiap mesin. Bagaimana untuk mencapai ini?
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:0 Tentukan pembolehubah
1 spawn untuk memulakan skrip atau arahan yang ditentukan
2 jangkakan hasil yang sepadan kata kunci 3 hantarMenghantar arahan yang ditentukan untuk kata kunci yang ditentukan4 Pelaksanaan selesai, keluarTetapi malangnya, os tidak dipasang secara lalai, jadi ia perlu dipasang sebelum digunakanExpect 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 manual3 Menganalisis skrip di atas, terdapat beberapa perkara yang perlu dijelaskan# 检查是否安装了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/expect2 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" }
#!/usr/bin/expect
Tetapkan parameter pertama yang dihantar ke fail, sama seperti parameter kedua dan ketiga
, dsb. Gunakandalam 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, 否则无法实现交互)
需和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
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!