0、前言
expect实现自动交互。如,scp,ssh,ftp、root等需要输入密码的交互需求;
例如ssh命令远程登录其他主机,会要求输入密码
(ps:有时候有的机器登录也不需要密码)
#!/bin/sh
echo "start"
expect -c "
expect "hello"
send "world\n"
expect eof
"
echo "end"
send "world\n"-------------->此处使用\n 或者 \r都是可以的。
1、expect的命令
命令 | 含义 |
spawn | 调用要执行的命令 |
expect | 等待命令提示信息的出现(捕捉用户提示信息) |
send | 发送需要交互的信息来替代手工输入 |
set | 设置变量的值 |
interact | 执行完成后保持交互状态,把控制权交给控制台,这个时候就可以手工操作了。如果没有这一句登录完成后会退出,而不是留在远程终端上。 |
expect eof | 与spawn对应,表示捕捉终端输出信息终止 |
说明:
1)interact 和expect eof 二者写一个就行,二者区别参考本文。
2)写与不写interact 或expect eof 的区别:
- 不写的话,假使从服务器192.168.1.1 通过ssh登录到 服务器192.168.1.2 ,登录密码自动输入后,立马又退回到1.1服务器;
- 写上的话,登录密码自动输入后,就保持在1.2服务器终端上,可以正常在1.2服务器上操作了。
3)spawn 后面对应的是命令
4)expect “password” ------------------>注意字符串要加引号,引号中是包含的字符串就行,不用写全;
5)send "mima\r" ------------------->发送的字符串要加引号,并且一定要加 \r ,表示回车,否则一直在等待send的内容。
6)等待时间设置
#!/usr/bin/expect ----------->第一行告诉操作系统脚本里的代码使用那一个shell来执行
set timeout -1 ----------->设置expect永不超时
set timeout 10 ------------>设置expect10s超时,如果超过10s,没有expect内容出现,则会退出
expect 默认的时间是10s, 这个地方可以根据需求更改。
2、查看本机是否装了expect
命令:which expect
如果装了,会显示expect 的目录
没有装的话,看第二步。
3、expect的安装(需要能够上网)
系统为RHEL/CentOS:
sudo yum install expect
系统为Debian/Ubuntu:
sudo apt-get install expect
装好目录在/usr/bin/expect
4、expect单独使用
#!/usr/bin/expect
set timeout 30
spawn ssh test@192.168.1.1
expect "password:"
send "pass\r"
expect eof
单独使用expect 第一行写的是 #!/usr/bin/expect
expect "password:" -------->判断上次输出结果里是否包含“password:”的字符串,如果有则立即返回,否则就等待一段时间后返回,这里等待时长就是前面设置的30秒
5、expect在shell中的嵌套使用参考本文