这里为大家简单介绍一下expect的使用,之前在网上搜索expect的相关资料,意外地发现了autoexpect这个东东,相信会超出你的期望,至少对我是这样。
春节放假的时候,被要求修改部门所有主机的密码,我们大概有100多台主机,如果一台台上去改,实在是太累也没有任何成就感,因此想到用expect来解决问题:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#!/usr/bin/expect --
set timeout -1
if { [llength $argv] < 3} {
puts "usage: $argv0 ip oldpasswd newpasswd"
exit 1
}
spawn /usr/local/bin/ssh [lindex $argv 0] -p36000 -lroot
expect "assword: "
send "[lindex $argv 1]/r"
expect "#"
send "passwd/r"
expect "New password:"
send "[lindex $argv 2]/r"
expect "Re-enter new password:"
send "[lindex $argv 2]/r"
expect "#" {send "exit/r"}
expect eof
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
简单解释一下:expect是基于TCL脚本的一种脚本语言,可以使需要人工交互的一些工作自动化。expect中最重要的几个关键字就是spawn, expect, send, lindex 。
spawn 用于生成一个子进程运行命令
expect 用于期待一个字符串的出现
send 就是模拟人工输入一个字符串
lindex 可以在数组中选择某个元素
上面的脚本基本上就是创建一个ssh进程,尝试登录到指定IP,当ssh提示输入密码时,把oldpasswd发送过去,然后期待提示符"#"的出现,以此类推就可以完成所有工作。
把上面脚本保存到chg_pwd.exp,然后加上可执行权限,就可以用./chg_pwd.exp 172.16.24.57 old new修改密码了,然后写个shell脚本就可以批量修改密码了,如:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#!/bin/bash
filename=$1
while read internalip
do
./chg_pwd.exp $internalip $2 $3
done < $filename
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
一种语言再简单,也需要学习。然而autoexpect甚至可以自动生成expect脚本。
运行autoexpect -p就进入autoexpect创建的shell中,然后输入的命令交互都被记录下来,最后输入exit退出,expect脚本被保存在script.exp中。
下面的例子演示了通过ssh登录到一台主机然后退出。
rong@dev:~$ autoexpect -p ssh 172.16.24.57 -lroot -p36000
autoexpect started, file is script.exp
root's password:
Last login: Thu Feb 24 2005 20:00:32 +0800
Linux 2.4.20.
You have mail.
root@platform57:~# exit
logout
autoexpect done, file is script.exp
rong@dev:~$
只要再次执行 ./script.exp,就可以重复刚才运行的命令。
效果就象先录音然后回放一样。
下面是有关使用expect的几个实例地址
http://fanqiang.chinaunix.net/a4/b8/20010912/1000001278.html
http://blog.chinaunix.net/u2/82938/showart_1829277.html
http://linux.sheup.com/linux/linux5439.htm
http://hi.baidu.com/face2u/blog/item/2dd08613ec2274d8f7039e2e.html