shell 及相关 / 未分类 · 2013年4月25日

最最简单的expect 例子

自己有台虚拟在测试东西 ,以前用key登录好好的,今天发现竟然key无论如何配置还是要输入输入,气杀哥了, 后来,不小心想到有 expect 可以用 哈哈 搞怪了吧
1.自动登录
#!/usr/bin/expect -f
#当密码是2240时的自动登录
set timeout 30
spawn ssh -l root 192.168.21.210
expect "password:"
send "2240r"
#expect eof
interact

下面是讲解,对刚刚用expect 的人来说非常好呢
1. [#!/usr/bin/expect]
  这一行告诉操作系统脚本里的代码使用那一个shell来执行。这里的expect其实和linux下的bash、windows下的cmd是一类东西。
  注意:这一行需要在脚本的第一行。
  2. [set timeout 30]
  基本上认识英文的都知道这是设置超时时间的,现在你只要记住他的计时单位是:秒
  3. [spawn ssh -l username 192.168.21.210]
  spawn是进入expect环境后才可以执行的expect内部命令,如果没有装expect或者直接在默认的SHELL下执行是找不到spawn命令的。所以不要用 “which spawn“之类的命令去找spawn命令。好比windows里的dir就是一个内部命令,这个命令由shell自带,你无法找到一个dir.com 或 dir.exe 的可执行文件。
  它主要的功能是给ssh运行进程加个壳,用来传递交互指令。
  4. [expect “password:”]
  这里的expect也是expect的一个内部命令,有点晕吧,expect的shell命令和内部命令是一样的,但不是一个功能,习惯就好了。这个命令的意思是判断上次输出结果里是否包含“password:”的字符串,如果有则立即返回,否则就等待一段时间后返回,这里等待时长就是前面设置的30秒
  5. [send “2240r”]
  这里就是执行交互动作,与手工输入密码的动作等效。 写上你的密码 例如我的 2240
  温馨提示: 命令字符串结尾别忘记加上“r”,如果出现异常等待的状态可以核查一下。
  6. [interact]
  执行完成后保持交互状态,把控制权交给控制台,这个时候就可以手工操作了。如果没有这一句登录完成后会退出,而不是留在远程终端上。
2.su – 并ls #另一个例子
#!/usr/bin/expect -f
spawn su -
expect "Password:"
#expect ":"
send "2240r"
expect "#"
send "lsr"
interact

####################这里也是一个例子
使用expect命令
#! /usr/bin/expect
set timeout 30
spawn sudo apt-get update
expect “password for xxx:”
send “password\r”
interact
1. [#! /usr/bin/expect]
  这个跟bash shell 开头一样,是告诉系统使用那个解释器来解释脚本
  注意:这一行需要在脚本的第一行。
2. [set timeout 30]
  设置超时时间为30秒
3. [spawn sudo apt-get update]
  spawn是expect内部命令,如果没有装expect或者直接在默认的SHELL下执行是找不到spawn命令的。
  它主要的功能是给后面的”sudo apt-get update”运行进程加个壳,用来传递交互指令。
4. [expect “password for xxx:”]
  这里的expect也是expect的一个内部命令。
个命令的意思是判断上次输出结果里是否包含“password for xxx:”的字符串,如果有则执行下一步,否则就等待一段时间后返回,这里等待时长就是前面设置的30秒
在ubuntu下输入sudo命令,shell会提示
“[sudo]password for xxx”
这里的xxx就是你的登录名
5. [send “password\r” ]
  这里就是执行交互动作,与手工输入密码的动作等效。
  温馨提示: 命令字符串结尾加上“\r”,如果出现异常等待的状态可以核查一下。
6. [interact]
  执行完成后保持交互状态,把控制权从expect交会给shell,shell就可以执行sudo apt-get update。
没有这句的话,即使密码已经成功输入,也不会执行sudo命令,因为控制权还是expect手里,而expect是不能解释apt-get update 命令的。
expect学习笔记及实例详解