[Shell]-9-使用expect实现交互自动化
引言
这篇文章主要讲解如何在Bash Shell中使用expect实现交互自动化,可以实现无需手动输入的脚本自动化指令输入。
文章目录
0×0.Expect安装
首先可以使用下面的命令确定系统中是否安装了expect软件包:
#命令如果没有输出,说明没有安装 www@qingsword.com:~$ ls /usr/bin | grep expect #Ubuntu安装方法 www@qingsword.com:~$ sudo apt install expect #CentOS安装方法 www@qingsword.com:~$ sudo yum install expect -y #Arch安装方法 www@qingsword.com:~$ sudo pacman -S expect
0×1.Expect四个常用指令
Expect中最关键的四个命令是send、expect、spawn、interact。
send:用于向进程发送字符串
expect:从进程接收字符串
spawn:启动新的进程
interact:允许用户交互
spawn跟随一个需要启动的进程(程序),并允许随后的expect和send与这个启动的进程(程序)进行交互。
0×2.在Shell中嵌入Expect
下面演示创建一个expect脚本,实现自动登录远程ssh,执行命令:
#编辑一个expect脚本 www@qingsword.com:~$ vim Expect-ssh.sh #输入下面的内容,第一句告诉系统使用expect解释器 #!/usr/bin/expect set username [lindex $argv 0] #接受脚本后携带的第一个参数赋值给username变量,以此类推 set ipaddress [lindex $argv 1] set password [lindex $argv 2] spawn ssh $username@$ipaddress #创建ssh进程连接到远程服务器 expect { #服务器返回yes/no结尾的字符串时,自动输入yes并且回车 "*yes/no" { send "yes\r" ; exp_continue } #exp_continue参数告诉解释器,继续执行这个expect分之下的其它语句 "*password" { send "$password\r" } #服务器返回password结尾的字符串时,发送密码回车 } expect { "*password" { send "$password\r" } #如果不是第一次登录,直接发送密码 } expect { "*@*" { send "ls\r" } #登录成功后,发送ls命令回车 } send "pwd\r" #发送pwd命令回车 interact #想保持ssh链接状态,等待用户输入 #如果不想保持链接,可以使用expect eof替换interact #携带用户名,ip地址与密码三个参数执行 www@qingsword.com:~$ except Expect-ssh.sh root 192.168.80.176 123
如果是bash脚本需要嵌入Expect,请看下面的实例:
#创建一个bash脚本,嵌入expect www@qingsword.com:~$ vim bash-expect.sh #输入下面的内容 #!/bin/bash /usr/bin/expect <<-EOF #调用expect spawn ssh root@192.168.80.176 #创建ssh进程 expect { 第一次登录的匹配方式 "*yes/no" { send "yes\r" ; exp_continue } "*password:" { send "123\r" } } expect { "*password:" { send "123\r" } } expect { #登录进去后,发送命令 "*#" { send "touch hello_expect.txt\r" } } expect eof #结束接收expect EOF #执行后,会自动登录并且创建hello_expect.txt文件 www@qingsword.com:~$ bash bash-expect.sh