Ubuntu16.04利用expect模拟键盘输入实现自动化交互
在Linux的日常使用中,经常会有自动化交互的需要,如SSH,手动的操作繁琐、效率地下,使用expect工具可以模拟键盘输入,实现自动输入、自动交互。
1,安装
sudo apt install expect
图 1
2,命令介绍
1. spawn: 指定和某个命令的进程进行交互,默认是和标准输入输出交互
2. expect : 等待进程的反馈,可以指定一个正则表达式字符串;
3. send : 向指定进程发送字符串,用于模拟键盘输入,加上'\n'表示Enter键。 通常与expect 结合使用, 表示等到期望的结果之后,再进行发送send指定的字符串;
4. interact: 停止自动交互,进入人工交互模式
5. 变量设置: set name value
变量引用: $name
3,具体使用
expect的使用类似Python,其实expect和Python都是解释器,Python是对Python语言编写的.py文件进行解释,而expect是对由expect确定的规则而编写的脚本.sh进行解释、执行。
示例一:使用 sudo turn-wifi-into-wifimode yes 打开友善之臂ARM板NanoPi-NEO2的WiFi的AP模式
交互过程:
[email protected]:~$: sudo turn-wifi-into-wifimode yes
Enter wireless name [default: friendlyelec-wifiap]: WIFILEE #输入 sudo turn-wifi-into-wifimode yes命令后进行ap模式WiFi名的输入。
Enter password [default: 123456789]: 1234567890Lee #输入完AP模式WiFi名后,进行WiFi密码的输入。
Enter password again: 1234567890Lee #再次确认密码
图 2 脚本以及说明 test-expect.sh
执行命令:expect test-expect.sh wififname wifipassword (命令行传参,传入WiFi名和WiFi密码)
示例二:ssh远程访问
图3 ssh交互过程
图4 ssh利用expect自动交互脚本
执行命令:expect test-expect.sh 192.168.1.100 pi pi (命令行传参)
4,补充
1.这儿的脚本对应的解释器是expect,行首是#!/usr/bin/expect,一般脚本是#!/bin/bash,这点不同于bash shell脚本。但是,经测试按照一般shell脚本的写法也执行正常;
2.命令行传参也不同普通脚本:
普通的基于bash的shell脚本传参为:
$0:Shell本身的文件名;
$1~$n 脚本后面的命令行参数。$1是第1参数、$2是第2参数……
而expect脚本的命令行传参:expect则将脚本的执行参数保存在数组$argv中,而且在脚本中一般将其赋值给变量:set 变量名 [lindex $argv 参数号数]。此外,$argc为命令行参数的个数。[lrange $argv 0 0]表示第1个参数(或者[lindex $argv 0]),[lrange $argv 0 4]为第一个到第五个参数。与其他不同的是,$argv不包含脚本名字本身。
注意:$argv0和[lrange $argv 0 0]是不一样的。argv0是一个默认的变量名,而[lrang $argv 0 0]得到的是表argv的0个元素。
3.expect和send搭配使用。