1、什么是交互式语言?
在脚本中写入与系统交互时可能出现的询问语句,然后将要回答的答案也写入脚本中,实现自问自答,从而实现脚本的人机交互。
expect 是自动应答命令用于交互式命令的自动执行
spawn 是 expect 中的监控程序,其运行后会监控命令提出的交互问题
send发送问题答案给交互命令
"\r"表示回车
exp_continue 标示当问题不存在时继续回答下面的问题
expect eof 标示问题回答完毕退出 expect 环境
interact标示问题回答完毕留在交互界面
set NAME [ lindex $argv n ]定义变量
2、案例
第一步:安装该软件
yum install -y expect.x86_64
查看这个软件的编译器:
编写脚本登录:
#!/usr/bin/expect
set ip 192.168.13.134 //定义登录的主机IP
set pass westos //定义登录密码
spawn ssh root@$ip //开启一个程序,远程登录$IP
expect { //里面放入登录过程系统的交互过程及回答答案
"(yes/no)?" { send "yes\r";exp_continue } //exp_continue是因为有时候我们第二遍登录的时候没有这个询问是否的语句的时候,就要执行continue
"password:" { send "$pass\r" }
}
interact //进入交互界面
expect{}语句:
expect {
“登录过程中提示的字符”(注意这里有空格) {(注意这里有空格) send "要回答的答案 \r " (注意这里也有空格)}
需求1:A远程登录到server1并执行一些命令,然后自动退出。
脚本:
#!/usr/bin/expect
set ip 192.168.13.134
set pass westos
spawn ssh root@$ip
expect {
"(yes/no)?" { send "yes\r";exp_continue }
"password:" { send "$pass\r" }
}
#interact //关闭交互式界面,因为这次是在脚本里面输入要执行的代码
expect {
"#" { send "touch /mnt/666\r"; //看到"#",就执行接下来的命令 ,各命令之间用;隔开
send "ll -d /mnt/ > /mnt/666\r";
send "exit\r" } //最后退出登录
}
expect eof //关闭expect
执行结果:其实是将命令在本机命令行自动输入,然后自己回答。一下整个过程全是自动:
[root@server1 shells]# expect -f expect1.sh
spawn ssh root@192.168.13.134
root@192.168.13.134's password:
Last login: Wed Nov 11 13:16:05 2020 from 192.168.13.129
mount: /dev/sr0 is write-protected, mounting read-only
mount: /dev/sr0 is already mounted or /var/www/html/rhel7.5 busy
/dev/sr0 is already mounted on /var/www/html/rhel7.5
[root@server2 ~]# touch /mnt/666
[root@server2 ~]# ll -d /mnt/ > /mnt/666
[root@server2 ~]# exit
logout
Connection to 192.168.13.134 closed.
我们去登录的目标主机下看看命令是否执行成功:
[root@server2 mnt]# ls |grep 666
666
[root@server2 mnt]# cat 666
drwxr-xr-x. 10 root root 4096 11月 11 13:18 /mnt/