今天的有人问?如何批量在远程主机上执行命令,把执行完命令的内容放到本地?
其实能实现这种功能的方法有很多,比如python、perl或者运维自动化的工具saltstatck等都能实现这种简单的功能,
今天我们不要上述几种,只用expect程序来实现。
先简单介绍一下,expect是什么?!
expect是一个自动化的交互式应用如Telnet,FTP,passwd,fsck、rlogin、尖端的工具,希望真的让这东西琐碎等。expect对测试这些相同的应用程序也是有用的。通过添加TK,你也可以把X11 GUI交互应用。
希望可以做简单的种种,有什么比登天还难的任务。你会发现,expect是一个绝对宝贵的工具-使用它,你将能够自动化任务,你从来没有想过之前-你将能够快速,轻松地做这个自动化。
上述都是官方的解释,我的理解是在需要远程执行命令的的时候,需要登录远程主机,而当你登录远程主机的时候与需要输入密码,这个是shell命令所无法完成的,必须手动来输入密码。有人该说了,不是可以做ssh互信任嘛,但是尤其是在生产环境中,为了安全起见,不可能让你在所有的机器上都做ssh互信任的!这个时候,expect就派上用场了。
行了,废话不多说,先来一个实实在在的生产环境的下常用的一个案例。这里我们稍作改动,我们要实现的是批量在远程主机上执行命令,然后把执行的内容放到本地。
实验环境:四台主机 :
192.168.1.150(本地主机)
192.168.1.151
192.168.1.152
192.168.1.153
1,需要建一个主机列表的文件ip_list.txt
[root@localhost ~]# cat ip_list.txt
192.168.1.151
192.168.1.154
192.168.1.153
192.168.1.152
2,需要写一个expect的脚本
[root@localhost ~]# cat expect.sh
#!/usr/bin/expect -f
set remote_ip [ lindex $argv 0 ]
set password 123456
set timeout 10
##### login remote hosts and execute command #####
spawn ssh root@$remote_ip
expect {
"*yes/no" { send "yes\r";exp_continue}
"*password:" {send "$password\r"}
}
expect "*#"
send "hostname >/root/`hostname`.txt\r"
send "exit\r"
##### scp remote files to localhost #####
spawn scp root@$remote_ip:/root/`hostname`.txt /root
expect {
"*yes/no" { send "yes\r";exp_continue}
"*password:" {send "$password\r"}
}
send "exit\r"
##### rm -f romote files #####
spawn ssh root@$remote_ip
expect {
"*yes/no" { send "yes\r";exp_continue}
"*password:" {send "$password\r"}
}
expect "*#"
send "rm -f /root/`hostname`.txt\r"
send "exit\r"
expect eof
3,可以把expect的这段在shell脚本中进行引用。
[root@localhost ~]# cat counter.sh
#!/bin/bash
while read line
do
/root/expect.sh $line
done
时间仓促,水平有限,有待完善,欢迎不吝赐教!
阅读(1573) | 评论(0) | 转发(0) |