Expect是一个用来实现自动交互功能的软件套件 (Expect [is a] software suite for automating interactive tools)。使用它系统管理员可以创建脚本用来实现对命令或程序提供输入,而这些命令和程序是期望从终端(terminal)得到输入,一般来说这些输入都需要手工输入进行的。 Expect则可以根据程序的提示模拟标准输入提供给程序需要的输入来实现交互程序执行。

需要安装expect、tcl包:

yum install expect tcl

示例脚本:

 #!/usr/bin/expect、
set timeout
set username [lindex $argv ]
set password [lindex $argv ]
set host [lindex $argv ]
spawn ssh $username@$host
expect "assword:"
send "$password\r"
expect "#"
send "touch a.txt\r"
send "touch b.txt\r"
send "touch c.txt\r"
send "touch d.txt\r"
send "exit\r"
expect eof
exit
#interact

说明:

#!/usr/bin/expect

这一行告诉操作系统脚本里的代码用那一个shell来执行。这里的expect其实和linux下的bash、windows下的cmd是一类东西。

set timeout 10

设置超时时间的,计时单位是:秒。timeout -1 为永不超时

set username [lindex $argv 0]

set password [lindex $argv 1]

set host [lindex $argv 2]

$argv 参数数组,expect脚本可以接受从bash传递过来的参数.可以使用[lindex $argv n]获得,n从0开始,分别表示第一个,第二个,第三个....参数

spawn ssh $username@$host

spawn是进入expect环境后才可以执行的expect内部命令。它主要的功能是给ssh运行进程加个壳,用来传递交互指令。

expect "assword:"

这里的expect也是expect的一个内部命令, expect的shell命令和内部命令是一样的,但不是一个功能。这个命令的意思是判断上次输出结果里是否包含“password:”的字符串,如果有则立即返回,否则就等待一段时间后返回,这里等待时长就是前面设置的10秒 .

send "$password\r"

这里就是执行的交互动作,与手工输入密码的动作等效。

注意: 命令字符串结尾别忘记加上“\r”,如果出现异常等待的状态可以核查一下。

expect "]#"

登录成功后匹配的bash提示符。

send "touch a.txt\r"

send "touch b.txt\r"

send "touch c.txt\r"

send "touch d.txt\r"

在远程主机登录成功后执行的命令。

send "exit\r"

退出登录的远程终端的shell。

expect eof

exit

结束expect的交互。

interact

执行完成后保持交互状态,把控制权交给控制台,这个时候就可以手工操作了。如果没有这一句登录完成后会退出,而不是留在远程终端上。如果你只是登录过去执行

执行脚本方法:

./auto_ssh.sh $user $password $ipaddr

$user :登录远程终端的用户名

$password:远程终端用户的密码

$ipaddr:远程主机的IP地址

执行脚本:

 [root@host122 test]#./auto_ssh.sh  root    192.168.68.239
spawn ssh root@192.168.68.239
root@192.168.68.239's password:
Last login: Thu Oct :: from 192.168.68.232
[root@host129 ~]# touch a.txt
[root@host129 ~]# touch b.txt
[root@host129 ~]# touch c.txt
[root@host129 ~]# touch d.txt
[root@host129 ~]# exit
logout
Connection to 192.168.68.239 closed.

验证:

 [root@host129 ~]# ls -l
总用量
-rw-r--r-- root root 10月 : a.txt
-rw-r--r-- root root 10月 : b.txt
-rw-r--r-- root root 10月 : c.txt
-rw-r--r-- root root 10月 : d.txt

遇到下面的错误提示:

spawn: command not found

解决方法,给脚本加上执行权限,并且不要用sh auto_ssh.sh的方式执行:

Chmod +x auto_ssh.sh

./auto_ssh.sh

用expect做自动应答脚本的更多相关文章

  1. 用expect做自动运行脚本

    下面的脚本演示了在Ubuntu上安装expect,写一个切换用户的expect脚本,并运行脚本看到效果的过程. root@guserver:~# apt-get install expect godu ...

  2. expect 实现自动交互脚本

    1. 说明 在编写脚本时,可能会遇到需要在另一台主机上执行一个命令,或者在本机拷贝另一台主机内的一个文件.如果两台主机之间没有做互信,就会牵扯到用户输入密码的交互过程,这对编写自动脚本来说, 就行不通 ...

  3. shell脚本--expect自动应答

    expect自动应答  TCL语言 需求1:远程登录到A主机,什么事情也不做 #! /usr/bin/env expect # 开启一个程序 spawn ssh root@192.144.213.11 ...

  4. expect自动应答

    expect脚本 1. expect简介 expect是一个用来处理交互的命令.借助Expect,我们可以将交互过程写在一个脚本上,使之自动化完成. expect(自动应答) 基于TCL(Tool C ...

  5. linux自动交互工具expect,tcl安装和安装包,以及自动互信脚本

    linux自动交互工具expect,tcl安装,以及自动互信脚本 工作中需要对几十台服务器做自动互信,无意中发现expect命令,研究一番. 在网上找了许多资料也没有安装成功,摸索着总算成功了.现分享 ...

  6. [转帖]自动交互式脚本--expect

    自动交互式脚本--expect https://www.cnblogs.com/zhuiluoyu/p/4873869.html 我们经常会遇到一些需要与服务器程序打交道的场景,比如,从登陆某个服务器 ...

  7. 做了一个简易的git 代码自动部署脚本

    做了一个简易的git 代码自动部署脚本 http://my.oschina.net/caomenglong/blog/472665 发表于2个月前(2015-06-30 21:08)   阅读(200 ...

  8. 使用expect实现自动登录的脚本

    使用expect实现自动登录的脚本,网上有很多,可是都没有一个明白的说明,初学者一般都是照抄.收藏.可是为什么要这么写却不知其然.本文用一个最短的例子说明脚本的原理. 脚本代码如下: ######## ...

  9. 使用expect实现自动交互,shell命令行自动输入,脚本自动化,变量引用,expect spawn执行带引号命令,expect 变量为空,不生效,不能匹配通配符*,函数,数组

    背景 有需求,在允许命令或者脚本跳出交互行,需要进行内容输入,但需要人手动输入,不是很方便,此时可以通过expect来实现自动互动交互. expect是一个自动交互功能的工具,可以满足代替我们实际工作 ...

随机推荐

  1. 分享两个模拟get和post方法的工具类,让应用能够与服务器进行数据交互

    很久没有码字了,今天跟大家分享一个模拟get和post方法的工具类,在安卓应用中很多都需要跟服务器进行数据交互,这需要两方面的配合,首先服务器端会给应用提供一些数据交互的接口,可是怎样在应用中去调用呢 ...

  2. 相当管用了 mstha插件

    http://www.i-magical.com/2010/04/feizhuliu-kill-virus-mshta-exe/ 非主流杀毒 – mshta.exe Vincent | Apr 23, ...

  3. Windows下Android SDK Manage下载速度缓慢的解决方法

    在SDK Manager下Tools->Options打开了SDK Manager的Settings,选中“Force https://… sources to be fetched using ...

  4. Sublime Text 2结合VS2010配置C C++编译

    本文参考以下文章 特此谢谢 http://www.cnblogs.com/akira90/archive/2013/01/02/2842571.html 因遇到错误,浪费一个小时才解决 一.利用VS2 ...

  5. 获取本机IP地址和MAC地址

    unit NetFunc; interface uses SysUtils, Windows, dialogs, winsock, Classes, ComObj, WinInet, Variants ...

  6. hdoj 2203 亲和串

    亲和串 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...

  7. IOS应用安全(五):高级Runtime分析和操作

    在前一篇文章,我们学习如何安装Cycript在你的苹果设备,hook进程获取其相关属性信息.这一篇文章,我们将介绍高级的runtime分析技术,在应用运行时获取或者修改指定class的信息(方法.实例 ...

  8. 写的非常好的文章 C#中的委托,匿名方法和Lambda表达式

    简介 在.NET中,委托,匿名方法和Lambda表达式很容易发生混淆.我想下面的代码能证实这点.下面哪一个First会被编译?哪一个会返回我们需要的结果?即Customer.ID=5.答案是6个Fir ...

  9. eclipse快捷键补充

    编辑相关快捷键 注释          Ctrl + / 快速修复    Ctrl + 1 删除当前行 Ctrl + d 格式化文档 Ctrl + Shift + f 插入空行    Shift + ...

  10. 精彩,sinox.org官网贴满winxp死亡大字报

    sinox杀死windowxp不可避免,不用说,微软还自己掐死他!!! 中国人会升级正版 windows7吗?昨天也许会,但今天不会了,因为 sinox大字报出来了! 这下举国皆知了. 换装sinox ...