我想在某台测试服务器上集中监控一些服务器的磁盘空间。但是又不想配置主机信任关系,怕不安全,公司不允许。因此想通过shell脚本中嵌套expect方式来实现。
expect是交互性很强的脚本语言,可以帮助运维人员实现批量管理成千上百台服务器操作,是一款很实用的批量部署工具!
expect依赖于tcl,而linux系统里一般不自带安装tcl,所以需要手动安装。
下载:expect-5.43.0.tar和tcl8.4.11-src.tar
下载地址:https://pan.baidu.com/s/1kVyeLt9
提取密码:af9p
将expect和tcl的软件包下载放到/usr/local/src目录下
(1)解压tcl,进入tcl解压目录,然后进入unix目录进行编译安装
[root@xw4 src]# tar -zvxftcl8.4.11-src.tar.gz
[root@xw4 src]# cd tcl8.4.11/unix
[root@xw4 unix]# ./configure
[root@xw4 unix]# make && make
(2)安装expect
[root@xw4 src]# tar -zvxfexpect-5.43.0.tar.gz
[root@xw4 src]# cd expect-5.43.0
[root@xw4 expect-5.43.0]# ./configure--with-tclinclude=/usr/local/src/tcl8.4.11/generic--with-tclconfig=/usr/local/lib/
[root@xw4 expect-5.43.0]# make &&make install
(3)安装完成后进行测试
[root@xw4 ~]# expect
expect1.1>
expect1.1>
比如我想在10.192.203.102机器上ssh访问10.0.9.121
我需要在10.192.203.102上修改/etc/hosts文件,添加要访问地址的IP及主机名对应关系:
10.0.9.121 ocp
否则后面ssh会报错:
reverse mapping checking getaddrinfo forbogon [10.0.9.121] failed - POSSIBLE BREAK-IN ATTEMPT!
cat c.sh
IpGroup=('10.0.9.121' '10.0.9.122')
for ip in ${IpGroup[@]}
do
/usr/local/bin/expect <<-EOF
set timeout 3
spawn ssh oracle@$ip
expect {
"*yes/no" { send "yes\r"; exp_continue }
"*password:" { send "oracle\r" }
}
expect "*#"
send "df -h\r"
expect "*#"
send "exit\r"
interact
expect eof
EOF
done
脚本内容介绍:
/*
set timeout n命令将expect命令的等待超时时间设置为n秒,在n秒内还没有获取到其期待的命令,expect 为false,脚本会继续向下执行;
spawn command命令会fork一个子进程去执行command命令,然后在此子进程中执行后面的命令;
send命令的一般用法为 send"string",它们会我们平常输入命令一样向命令行输入一条信息,当然不要忘了在string后面添加上 \r 表示输入回车;
send "oracle\r"表示输入用户的密码
interact:执行到此命令时,脚本fork的子进程会将操作权交给用户,允许用户与当前shell进行交互;
*/
#给脚本赋予执行权限
chmod +x c.sh
#调用脚本
sh c.sh
--本篇文章参考了:http://www.cnblogs.com/kevingrace/p/5900303.html
http://www.cnblogs.com/zhenbianshu/p/5867440.html
http://bbs.chinaunix.net/thread-2320506-1-1.html