expect脚本

#! /usr/bin/expect -f

set timeout 3

spawn sudo apt-get install rake

expect "*sudo] password*"

send "123456\r"

expect "*@ubuntu-Box:~$*"

spawn sudo apt-get install htop

expect "*sudo] password*"

send "123456\r"

interact

 

文件名:ev.expect   终端下执行:./ev.expect

 

================================================

 

1。首先确认expect的包要安置。

[[zhuying@SOR_SYS opt]$ rpm -qa | grep expect

如果没有则需要下载安装,我安装的是expect-5.42.1-1.x86_64.rpm和expect-devel-5.42.1-1.x86_64.rpm

安装过后会显示:

[[zhuying@SOR_SYS opt]$ rpm -qa | grep expect

expect-5.43.0-5.1

expect-devel-5.42.1-1

2.查看expect的路径,可以用

[zhuying@SOR_SYS opt]$ which expect

/usr/bin/expect

[zhuying@SOR_SYS opt]$ view autosu.sh

3。确定脚本有可执行权限

chmod +x autosu.sh

#!/usr/bin/expect -f//这个expect的路径就是用which expect 查看的结果

spawn su - oracle //切换用户 

expect "password:" //提示让输入密码 

send "99billzy \r"//输入oracle的密码 

interact //操作完成

这在root用户切换到oracle用户的时候特别的快,但是在其他用户切换到oracle的时候则需要等待一段时间!

另外需要注意的是:

不能按照习惯来用sh autosu.sh 来这行expect的程序,会提示找不到命令,如下:

autosu.sh: line 3: spawn: command not found

couldn't read file "password:": no such file or directory

autosu.sh: line 5: send: command not found

autosu.sh: line 6: interact: command not found

因为expect用的不是bash所以会报错。执行的时候直接./autosu.sh 就可以了。~切记!

 

来自:http://tomhibolu.iteye.com/blog/1214769

 

用的Ubuntu,本身没带expect,安装。

  sudo apt-get install expect

 

 

 

2 写脚本 sample.script

 

   下面是简单的一个例子,把登录名和密码都显式地写在脚本里。

#!/usr/bin/expect -f    

#auto ssh login    

  

set  timeout 20  

spawn ssh login_name@host_name  

expect “*password:”   

send “123456/r”   

interact  

      上面的脚本中,spawn命令激活一个Unix程序来进行交互式的运行。send命令向进程发送字符串。expect命令等待进程的某些字符串。 expect支持正规表达式并能同时等待多个字符串,并对每一个字符串执行不同的操作。expect还能理解一些特殊情况,如超时和遇到文件尾。

 

   如果希望脚本有一定的通用性,比如通过参数方式来输入用户名和主机地址。那么脚本可以象这样:

#!/usr/bin/expect -f     

#auto ssh login     

    

set  timeout 20    

   

set  login_name [lindex $argv 0]  

set  host_name [lindex $argv 1]    

   

spawn ssh $login_name@$host_name    

        

expect “*password:”    

   

send “123456/r”    

   

interact    

 

   这样执行的时候$argv 0 就是输入的第一个参数, $argv 1 就是输入的第二个参数

 

3  给脚本加上可执行权限

 

   chmod +x sample.script

 

   如果文件默认有其它权限,建议最好设置为只能自己读取,修改和执行

   chmod 700 sample.script

   接着就可以通过执行脚本进行远程登录了 ./sample.script

 

=====================================================

管理员往往有这样的需求,希望根据当前的具体情况来以不同的方式对一个命令进行响应。我们可以通过后面的例子看到expect可以实现非常复杂的条件响应,而仅仅通过简单的修改预处理脚本就可以实现。下面的例子是一个更复杂的expect-send例子:

  expect -re "\[(.*)]:"

  if {$expect_out(1,string)!="/bin/tcsh"} {

  send "/bin/tcsh" }

  send " "

  expect eof

  在这个例子中,第一个expect命令现在使用了-re参数,这个参数表示指定的的字符串是一个正则表达式,而不是一个普通的字符串。对于上面 这 个例子里是查找一个左方括号字符(其必须进行三次逃逸(escape),因此有三个符号,因为它对于expect和正则表达时来说都是特殊字符)后面跟有 零个或多个字符,最后是一个右方括号字符。这里.*表示表示一个或多个任意字符,将其存放在()中是因为将匹配结果存放在一个变量中以实现随后的对匹配结 果的访问。

  当发现一个匹配则检查包含在[]中的字符串,查看是否为/bin/tcsh。如果不是则发送/bin/tcsh给chsh命令作为输入,如果是则仅仅发送一个回车符。这个简单的针对具体情况发出不同相响应的小例子说明了expect的强大功能。

  在一个正则表达时中,可以在()中包含若干个部分并通过expect_out数组访问它们。各个部分在表达式中从左到右进行编码,从1开始(0包含有整个匹配输出)。()可能会出现嵌套情况,这这种情况下编码从最内层到最外层来进行的。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值