Chinaunix

标题: 使用expect批量查看多台机器的内存信息,如果密码不同,应该如何修改脚本呢? [打印本页]

作者: YuriGagarin    时间: 2014-01-08 17:36
标题: 使用expect批量查看多台机器的内存信息,如果密码不同,应该如何修改脚本呢?
本帖最后由 YuriGagarin 于 2014-01-09 06:55 编辑

我之前在农信社的机房工作,那里的领导曾经有一个需求,希望可以快速查看所有机器的配置信息,还有CPU、内存的运行状态等信息。机房的服务器在80台左右。
  前段时间我学了点expect脚本,便想利用这个脚本实现这个需求。昨天正式开始着手操作,感觉应该是遇到最后的问题了。
  批量查看多台机器的内存信息,如果多台机器的用户密码都一样的话,我还能完成。但是,如果密码不同,我就不知道脚本应该如何改了。
脚本1:
[root@M-SERVER fenfa_view]# cat iplist
192.168.1.179 redhat
192.168.1.180 redhat
192.168.1.181 123456
192.168.1.182 123456

脚本2:
[root@M-SERVER fenfa_view]# 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:
[root@M-SERVER fenfa_view]# cat -n lipeixue.exp
     1  #!/usr/bin/expect
     2  if { $argc != 2 } {
     3   send_user "usage: expect scp-expect.exp ip command\n"
     4   exit
     5  }
     6
     7  #define var
     8  set ip [lindex $argv 0]
     9  set command [lindex $argv 1]
    10  set password [lindex $argv 2]
    11  #set password "123456"
    12
    13  spawn ssh -P22 root@$ip $command
    14  expect {
    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
    21  exit
  我知道自己写的脚本3是有问题的。
  可我就是不知道是否应该在第10行加变量,还是在别的位置提取脚本1里的密码呢?
  我不知道,这密码应该如何提取了?
  请各位帮忙提点一下,谢谢。
作者: wenhq    时间: 2014-01-11 22:36
lz 写的有点复杂了。搜下论坛里有expect while 的脚本。。
作者: lijunling    时间: 2014-01-12 17:53
这个,就是你要用个文本或者数据库来保存这些机器的 IP 地址和密码,然后用你的脚本来调用就可以了,用 shell 也可以的,不一定非要用expect
作者: YuriGagarin    时间: 2014-01-12 21:18
回复 3# lijunling


谢谢楼上,已经陆续有朋友介绍一些思路,有些朋友也是用shell来修改,但我shell目前更不熟。
  正好自己刚学了点expect,也是想利用这个案例来强化一下自己的实践能力吧。
   
作者: YuriGagarin    时间: 2014-01-13 08:38
[root@M-SERVER fenfa_view]# 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

[root@M-SERVER fenfa_view]# cat lipeixue.exp
#!/usr/bin/expect
#define var
set ip [lindex $argv 0]
set password [lindex $argv 1]

spawn ssh -P22 root@$ip free -m
  expect "password"
  send "$password\r"
  expect eof
exit
[root@M-SERVER fenfa_view]# 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
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

作者: expert1    时间: 2014-02-27 11:11

安装个cacti监控,看图说话,领导最喜欢了。换个思路吧
作者: leiyu0815    时间: 2014-03-11 13:57
主要问题就是密码不通,那么加信任授权,然后就跳过密码这一环,就可以了。
用ssh就可以批量查看,不用expect了
回复 1# YuriGagarin


   
作者: YuriGagarin    时间: 2014-03-18 18:35
谢谢楼上2位,最近没有登录,所以也没有看到回复。
  自己的shell水平还是太低,自己再补补课,再研究这个问题吧。
作者: 小马猴    时间: 2014-04-18 19:37
当然是把密码也放到文件里,脚本读取就是了,我就是这样做的,很方便。
作者: alonerhu    时间: 2014-04-30 10:32
安装个nagios一类的集中监控,然后配个puppet/salt一类的集中管理,自己弄个脚本分发到各个机器上




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2