[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