使用expect批量查看多台机器的内存信息,如果密码不同,应该如何修改脚本呢?
本帖最后由 YuriGagarin 于 2014-01-09 06:55 编辑我之前在农信社的机房工作,那里的领导曾经有一个需求,希望可以快速查看所有机器的配置信息,还有CPU、内存的运行状态等信息。机房的服务器在80台左右。
前段时间我学了点expect脚本,便想利用这个脚本实现这个需求。昨天正式开始着手操作,感觉应该是遇到最后的问题了。
批量查看多台机器的内存信息,如果多台机器的用户密码都一样的话,我还能完成。但是,如果密码不同,我就不知道脚本应该如何改了。
脚本1:
# cat iplist
192.168.1.179 redhat
192.168.1.180 redhat
192.168.1.181 123456
192.168.1.182 123456
脚本2:
# cat view_client_info.sh
#!/bin/sh
. /etc/init.d/functions
for ip in `cut -d " " -f1 iplist`
do
expect lipeixue.exp $ip free -m
done
脚本3:
# cat -n lipeixue.exp
1#!/usr/bin/expect
2if { $argc != 2 } {
3 send_user "usage: expect scp-expect.exp ip command\n"
4 exit
5}
6
7#define var
8set ip
9set command
10set password
11#set password "123456"
12
13spawn ssh -P22 root@$ip $command
14expect {
15 -timeout 2
16 "yes/no" {send "yes\r";exp_continue}
17 "*password" {send "password\r"}
18 timeout {puts "timeout";return}
19}
20#expect eof
21exit
我知道自己写的脚本3是有问题的。
可我就是不知道是否应该在第10行加变量,还是在别的位置提取脚本1里的密码呢?
我不知道,这密码应该如何提取了?
请各位帮忙提点一下,谢谢。 lz 写的有点复杂了。搜下论坛里有expect while 的脚本。。 这个,就是你要用个文本或者数据库来保存这些机器的 IP 地址和密码,然后用你的脚本来调用就可以了,用 shell 也可以的,不一定非要用expect 回复 3# lijunling
谢谢楼上,已经陆续有朋友介绍一些思路,有些朋友也是用shell来修改,但我shell目前更不熟。
正好自己刚学了点expect,也是想利用这个案例来强化一下自己的实践能力吧。
# cat view_client_info.sh
#!/bin/sh
. /etc/init.d/functions
for ip in `cut -d " " -f1 iplist`
do
password=`grep $ip iplist|cut -d " " -f2`
expect lipeixue.exp ${ip} ${password}
done
# cat lipeixue.exp
#!/usr/bin/expect
#define var
set ip
set password
spawn ssh -P22 root@$ip free -m
expect "password"
send "$password\r"
expect eof
exit
# sh view_client_info.sh
spawn ssh -P22 root@192.168.1.183 free -m
ssh: connect to host 192.168.1.183 port 22: No route to host
send: spawn id exp6 not open
while executing
"send "$password\r""
(file "lipeixue.exp" line 8)
spawn ssh -P22 root@192.168.1.182 free -m
root@192.168.1.182's password:
total used free shared buffers cached
Mem: 1010 67 943 0 8 40
-/+ buffers/cache: 17 992
Swap: 2303 0 2303
经过朋友的帮助,问题算是得到初步解决。但我还想再进一步,如何才能把因为主机没有开机,或者无法连接到主机产生的输出去掉,然后再输出1个简单点的输出说明呢?
就是想把如下部分删除,或者只要这里的第1行“No route to host”也行。
ssh: connect to host 192.168.1.183 port 22: No route to host
send: spawn id exp6 not open
while executing
"send "$password\r""
(file "lipeixue.exp" line 8)
:mrgreen:
安装个cacti监控,看图说话,领导最喜欢了。换个思路吧 主要问题就是密码不通,那么加信任授权,然后就跳过密码这一环,就可以了。
用ssh就可以批量查看,不用expect了
回复 1# YuriGagarin
谢谢楼上2位,最近没有登录,所以也没有看到回复。
自己的shell水平还是太低,自己再补补课,再研究这个问题吧。 当然是把密码也放到文件里,脚本读取就是了,我就是这样做的,很方便。 安装个nagios一类的集中监控,然后配个puppet/salt一类的集中管理,自己弄个脚本分发到各个机器上
页:
[1]