Linux--使用expect进行自动交互
2015-10-09 11:53
369 查看
在linux下进行一些操作时,有时需要与机器进行一些交互操作,比如切换账号时输入账号密码,传输文件时输入账号密码登陆远程机器等,但有时候这些动作需要在shell脚本中进行,这个时候就可以使用expect来进行自动的交互操作,从而避免需要人工干预引起的脚本中断执行。
expect的核心命令:spawn expect send set
spawn 调用要执行的命令
expect 等待命令提示信息的出现,也就是捕捉用户输入的提示:
send 发送需要交互的值,替代了用户手动输入内容
set 设置变量值
interact 执行完成后保持交互状态,把控制权交给控制台,这个时候就可以手工操作了。如果没有这一句登录完成后会退出,而不是留在远程终端上。
expect eof 这个一定要加,与spawn对应表示捕获终端输出信息终止,类似于if....endif
(expect脚本必须以interact或expect eof结束,执行自动化任务通常expect eof就够了。)
例子:建一个scp.sh脚本,用来传输文件
执行./scp.sh就会使用账户xman,去登陆远程机器,这是终端会给出提示信息问是否继续Yes/No? 如果yes就输入密码,登陆成功后scp命令就开始传文件。其中expect{}里面的代码就是预判断终端输出的内容里是否有(yes/no)?,如果有就自动输入yes,(send "yes\n");然后再判断后面的输出里是否含有*password:",如果有就自动输入预置的密码1qaz2wsx。从而达到自动进行交互的目的。
除了用 expect <<! !方式(here document方式)在sh中调用expect外,当然也可以用expect -c "" 的方式在sh脚本里调用expect命令。
expect的核心命令:spawn expect send set
spawn 调用要执行的命令
expect 等待命令提示信息的出现,也就是捕捉用户输入的提示:
send 发送需要交互的值,替代了用户手动输入内容
set 设置变量值
interact 执行完成后保持交互状态,把控制权交给控制台,这个时候就可以手工操作了。如果没有这一句登录完成后会退出,而不是留在远程终端上。
expect eof 这个一定要加,与spawn对应表示捕获终端输出信息终止,类似于if....endif
(expect脚本必须以interact或expect eof结束,执行自动化任务通常expect eof就够了。)
例子:建一个scp.sh脚本,用来传输文件
#!/bin/sh svr="9.84.214.35" expect <<! spawn scp -r xman@$svr:/db2info.csv /tmp/db2info.txt expect { "(yes/no)?" { send "yes\n" expect "*assword:" {send "1qaz2wsx\n"} } "*assword:" { send "1qaz2wsx\n" } } expect "100%" expect eof !
执行./scp.sh就会使用账户xman,去登陆远程机器,这是终端会给出提示信息问是否继续Yes/No? 如果yes就输入密码,登陆成功后scp命令就开始传文件。其中expect{}里面的代码就是预判断终端输出的内容里是否有(yes/no)?,如果有就自动输入yes,(send "yes\n");然后再判断后面的输出里是否含有*password:",如果有就自动输入预置的密码1qaz2wsx。从而达到自动进行交互的目的。
除了用 expect <<! !方式(here document方式)在sh中调用expect外,当然也可以用expect -c "" 的方式在sh脚本里调用expect命令。
相关文章推荐
- CentOS 安装codeblocks
- Linux鸟哥私房菜学习笔记(一)
- Linux下查看进程的执行文件绝对路径
- centos 6.5 系统中iptables防火墙开放端口
- Linux安装PostgreSQL 9.4
- MySQL 调优基础(四) Linux 磁盘IO
- 如何在CentOS 7/6.5/6.4 下安装PostgreSQL
- Linux内核学习之路
- linux之sed用法整理
- linux之sed用法整理
- linux之sed用法整理
- linux之sed用法整理
- linux之sed用法整理
- linux之sed用法整理
- linux之sed用法整理
- linux之sed用法整理
- linux之sed用法整理
- linux之sed用法整理
- Linux C编程(1) vim及gcc命令
- Set Hostname on CentOS