Chinaunix首页 | 论坛 | 博客
  • 博客访问: 86495
  • 博文数量: 26
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 250
  • 用 户 组: 普通用户
  • 注册时间: 2015-08-12 22:31
文章分类

全部博文(26)

文章存档

2016年(26)

我的朋友

分类: 系统运维

2016-06-26 22:57:38

    今天的有人问?如何批量在远程主机上执行命令,把执行完命令的内容放到本地?
其实能实现这种功能的方法有很多,比如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) |
给主人留下些什么吧!~~