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. 每天一个linux 命令:which

    我们经常在linux要查找某个文件,但不知道放在哪里了,可以使用下面的一些命令来搜索:        which  查看可执行文件的位置.       whereis 查看文件的位置.         ...

  2. ruby 资料整理

    http://blog.csdn.net/maingalaxy/article/details/46013393 http://blog.csdn.net/dzl84394/article/detai ...

  3. php中的字符串和正则表达式

    一.字符串类型的特点 1.PHP是弱类型语言,其他数据类型一般都可以直接应用于字符串函数操作. 1: <?php //输出345 //输出345 //先查找hello常量,若没找到,将hello ...

  4. 2014上海网络赛 HDU 5053 the Sum of Cube

    水 #include <stdio.h> #include <stdlib.h> #include<math.h> #include<iostream> ...

  5. 5.1 CUDA atomic原子操作

    和许多多线程并行问题一样,CUDA也存在互斥访问的问题,即当一个线程改变变量X,而另外一个线程在读取变量X的值,执行原子操作类似于有一个自旋锁,只有等X的变量在改变完成之后,才能执行读操作,这样可以保 ...

  6. HDU-4669 Mutiples on a circle 环形DP

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4669 题意:给一串数字连乘一个环,求连续的子串中组成的新的数字能被K整除的个数. 首先容易想到用DP来 ...

  7. Struts2 + Spring + Hibernate 通用 Service 和 DAO

    我在 Struts2 + Spring + Hibernate  项目开发中总结出了一个Service 和 DAO ,可以用于处理任何的pojo(bean).使用这两个Service 和 DAO 可以 ...

  8. 最清晰的ios消息推送机制教程

    研究了一下Apple Push Notification Service,实现的很简单,很环保.原理如下 财大气粗的苹果提供了一堆服务器,每个ios设备和这些服务器保持了一个长连接,ios版本更新提示 ...

  9. 一步一步学android控件(之十五) —— DegitalClock & AnalogClock

    原本计划DigitalClock和AnalogClock单独各一篇来写,但是想想,两个控件的作用都一样,就和在一起写一篇了. DegitalClock和AnalogClock控件主要用于显示当前时间信 ...

  10. 代码自动生成工具MyGeneration之一(程序员必备工具)

    代码自动生成工具MyGeneration之一(程序员必备工具) 转 分类: C#2008-08-06 18:12 16064人阅读 评论(12) 收藏 举报 工具数据库相关数据库stringbrows ...