linux使用expect批量部署应用

前言:上一篇讲了cobbler,这篇来讲下expect。以前分发文件的时候都是用for循环依次去读ip。当然前提你还得先把ssh通道打通。虽然说expect不用提前做什么准备工作,只需要写两个脚本即可。但是个人认为没有ssh安全。因为使用expect的时候你得先把你的账户写到一个文件里面。且都是明文存储。至于能否加密什么的有待研究。而ssh大家都知道,互换秘钥相对来说安全一点。好了,不多说。来看看它具体应用吧。

#1 安装

[root@localhost ~]# yum install expect -y

#2 使用之命令执行

分两个步骤:

@1使用for循环读取服务器IP、密码列表并取值

@2命令执行

列:在两台服务器上执行"mkdir -p /tmp/`date +%Y%m%d`"

首先创建一个登陆脚本。

[root@localhost ~]# vim login.exp
#!/usr/bin/expect -f
set ip [lindex $argv 0 ]
set passwd [lindex $argv 1 ]
set command [lindex $argv 2]
set timeout 1
spawn ssh root@$ip
expect {
"yes/no" { send "yes\r";exp_continue }
"password:" { send "$passwd\r" }
}
expect "*#*" { send "$command\r" }
expect eof

然后创建一个执行脚本。

[root@localhost ~]# vim exec.sh
#!/bin/sh
CMD="$*"
for i in `awk '{print $1}' passwd.txt`
do
    j=`awk -v I="$i" '{if(I==$1)print $2}' passwd.txt`
    expect login.exp  $i  $j  "$CMD"
done

建立账户文件。(格式:IP 密码 中间加空格)

[root@localhost ~]# cat passwd.txt 
192.168.175.128 123456xx
192.168.175.129 123456xx
[root@localhost ~]#

来测试下:

[root@Sx4MK ~]# [root@localhost ~]# /bin/sh exec.sh "mkdir -p /tmp/`date +%Y%m%d`"
spawn ssh [email protected]
[email protected]'s password: 
Last login: Fri Dec 19 13:56:07 2014 from 192.168.175.130
[root@Sx4MK ~]# mkdir -p /tmp/20141219
[root@Sx4MK ~]# [root@localhost ~]#

验证一下。

[root@Sx4MK ~]# ifconfig eth0 | awk '/inet addr/ {print $2}' | cut -f2 -d ":"
192.168.175.128
[root@Sx4MK ~]# ls /tmp
20141219        orbit-root          pulse-eQxFW8on4dad  virtual-root.aBsUjs  virtual-root.DsVJFE  vmware-root
keyring-e1rFbt  pulse-dVLX9iw0mWPw  ssh-YVWNES1756      virtual-root.cDhcQC  virtual-root.S5Y5rX  yum.log
[root@Sx4MK ~]#

#3 使用之文件传输

同上。只不过需要修改两个脚本中的相关参数变量。

登录脚本(login.scp)。

#!/usr/bin/expect -f
set ip [lindex $argv 0 ]
set passwd [lindex $argv 1 ]
set src_file [lindex $argv 2]
set des_dir [lindex $argv 3]
set timeout 1
spawn scp -r $src_file root@$ip:$des_dir
expect {
"yes/no" { send "yes\r";exp_continue }
"password:" { send "$passwd\r" }
}
expect "#*"
expect eof

传输脚本(send.sh)。

#!/bin/sh
read -p "Please Enter insert Source File or DIR: " src_file
echo ======================================================
sleep 1
read -p "Please Enter insert Destination DIR: " des_dir
for i in `awk '{print $1}' passwd.txt`
do
    j=`awk -v I="$i" '{if(I==$1)print $2}' passwd.txt`
    expect login.scp  $i  $j $src_file $des_dir
done

账户文件(passwd.txt)保持不变。

然后来测试。

[root@localhost ~]# echo "Sx4MK 20141219" > test.txt
[root@localhost ~]# /bin/sh send.sh test.txt /root
spawn scp -r test.txt [email protected]:/root
[email protected]'s password: 
test.txt                                                                                                                     100%   15     0.0KB/s   00:00    
[root@localhost ~]#

验证一下。

[root@Sx4MK ~]# ls
anaconda-ks.cfg  install.log  install.log.syslog  test.txt  公共的  模板  视频  图片  文档  下载  音乐  桌面
[root@Sx4MK ~]# cat test.txt 
Sx4MK 20141219
[root@Sx4MK ~]# ifconfig eth0 | awk '/inet addr/ {print $2}' | cut -f2 -d ":"
192.168.175.128
[root@Sx4MK ~]#

你可能感兴趣的:(linux,expect,批量)