0620----Shell(三)

任务列表:

20.27 分发系统介绍
20.28 expect脚本远程登录
20.29 expect脚本远程执行命令
20.30 expect脚本传递参数
20.31 expect脚本同步文件
20.32 expect脚本指定host和要同步的文件
20.33 构建文件分发系统
20.34 批量远程执行命令
扩展:
shell多线程 http://blog.lishiming.net/?p=448
电子书 链接:http://pan.baidu.com/s/1mg49Taw 密码:yk4b
shell习题 http://www.apelearn.com/study_v2/chapter15.html#shll

分发系统介绍

如今一些比较大的企业,大都使用了负载均衡,而有时因为一些程序要更改,或者有些bug要修改,快速更新代码等,如果仅是几台server的话,很简单,把已经改好的程序拷过去,或者rsync远程推送,再或者网上NFS共享一下就可以了;但如果有几十台几百台,那样的方法会太繁琐,此时就可以用expect来批量实现分发任务。
expect:一个实现自动交互功能的软件套件,基于Tcl的一种脚本语言,具有简单的语法;
功 能 :实现自动登录远程机器,并自动执行命令;和shell脚本结合,可以实现完全自动化;
注 意:若是使用不带密码的密钥验证同样可以实现自动登录和自动远程执行命令。但当不能使用密钥验证的时候,我们就没有办法了。所以,这时只知道对方机器的账号和密码可以通过expect脚本实现登录和远程命令。

expect脚本远程登录

测试环境
linux-01 190.168.196.101
linux-02 190.168.196.103
linux-03 190.168.196.105

/usr/local/sbin/,创建一个expect脚本;
vim ex1.expect
脚本创建完成后需要赋予执行权限,chmod a+x ex1.expect

#!/usr/bin/expect
set host "192.168.196.103"
#远程登录的主机IP
set passwd "123456"
#远程登录主机用户的密码
spawn ssh root@$host
#远程登录
expect {
"yes/no" { send "yes\r"; exp_continue}
#假如第一次登陆,需要yse,\r表示回车,exp_continue表示继续执行
"password" { send "$passwd\r" } 
#输入密码
}
interact
#结束执行

在这里插入图片描述

expect脚本远程执行命令

vim ex2.expect
脚本创建完成后需要赋予执行权限,chmod a+x ex2.expect

#!/usr/bin/expect
set user "root" 
#设置用户为 root
set passwd "123456" 
#设置密码
spawn ssh [email protected]
#连接远程机器
expect { 
"yes/no" { send "yes\r"; exp_continue }
"password" { send "$passwd\r" }
}
expect "]*"
#遇到右侧方括号执行下面命令
send "touch /tmp/12.txt\r"
#在/tmp下创建12.txt;回车
expect "]*"
#上一语句执行完后,遇到右侧方括号,执行下面
send "echo 1212 > /tmp/12.txt\r"
#把1212写入12.txt,回车
expect "]*"
send "exit\r"
#输入exit,退出
interact

在这里插入图片描述
在这里插入图片描述

expect脚本传递参数

vim ex3.expect
脚本创建完成后需要赋予执行权限,chmod a+x ex3.expect

#!/usr/bin/expect
set user [lindex $argv 0]
#第一个参数
set host [lindex $argv 1] 
#第二个参数
set passwd "123456"
set cm [lindex $argv 2] 
#第三个参数
spawn ssh $user@$host
expect {
"yes/no" { send "yes\r" }
"password" { send "$passwd\r" }
}
expect "]*"
send "$cm\r"
expect "]*"
send "exit\r"
interact

./ex3.expect root 192.168.196.103 “pwd;ls”
参数中可以定义多个命令:如执行pwd、w、rm、ls -ld、vmstat 1等,需要用 “”,并且用 ; 隔开命令
在这里插入图片描述

expect脚本同步文件

在一台机器上把文件同步到其他机器上;使用的rsync服务。
vim ex4.expect
chomd a+x ex4.expect

#!/usr/bin/expect
set passwd "123456"
spawn rsync -av [email protected]:/tmp/12.txt /tmp/
expect {
"yes/no" { send "yes\r" }
"pass" { send $passwd\r }
}
expect eof 
#结束expect匹配。 

在这里插入图片描述

expect脚本指定host和要同步的文件

Vim ex5.expect
Chmod a+x ex5.expect

#!/usr/bin/expect
set passwd "123456"
set host [lindex $argv 0]
set file [lindex $argv 1]
spawn rsync -av $file root@$host:$file
expect {
"yes/no" { send "yes\r"}
"password:" { send "$passwd\r"}
}
expect eof

在这里插入图片描述

注意:
1、这里要同步的文件,必要要写绝对路径;
2、备份的时候,注意时间限制;可以设定 set timeout 定义超时时间(单位为 秒) -1 为永远不超时。

构建文件分发系统

需求背景:
对于大公司而言,肯定时不时会有网站或者配置文件更新,而且使用的机器肯定也是好多台,少则几台,多则几十甚至上百台。所以,自动同步文件是至关重要的。
实现思路:
首先要有一台模板机器,把要分发的文件准备好,然后只要使用expect脚本批量把需要同步的文件分发到目标机器即可。
核心命令:
rsync -av --files-from=list.txt / root@host:/ 注意:这里的都是根目录
使用rsync 的 --files参数,可以实现调用文件里面的列表,进行多个文件远程传输,进而实现文件分发文件分发系统的实现。

vim rsync.expect

#!/usr/bin/expect
set passwd "123456"
set host [lindex $argv 0]
set file [lindex $argv 1]
spawn rsync -avR --files-from=$file / root@$host:/
#上传文件的列表是$file,我们需要在list当中去定义; --file-from指定文件列表路径 -R表示同步时目标会级联创建目录
expect {
"yes/no" { send "yes\r"}
"password:" { send "$passwd\r" }
}
expect eof

因为实现分发系统,肯定是因为需要分发的机器数量过大,所以,定义好了 文件 的 list 列表文件以后, 还需要配置 ip 的列表文件
vim /tmp/ip.list

192.168.196.103
192.168.196.105

创建file.list 需要同步文件的列表
vim /tmp/file.list

/tmp/12.txt
/usr/local/sbin/shell/ex1.expect

创建一个rsync的shell脚本,脚本的目的:遍历所有的server和list中的文件可以同步到每台服务器。
vim rsync.sh

#!/bin/bash
for ip in `cat /tmp/ip.list`
do
echo $ip
./rsync.expect $ip /tmp/file.list
done

在这里插入图片描述

批量远程执行命令

当同步完代码后有可能需要批量地重启服务,因此还需要批量远程执行命令,类似于自动化。 这里是用expect编写执行命令的脚本并用shell脚本来批量调用它。
vim ex7.expect

#!/usr/bin/expect
set host [lindex $argv 0]
set passwd "123456"
set cm [lindex $argv 1]
spawn ssh root@$host
expect {
"yes/no" { send "yes\r" }
"password:" { send "$passwd\r" }
}
expect "]*"
send "$cm\r"
expect "]*"
send "exit\r"
expect eof

再新建exe.sh的shell脚本,用来调用exe.expect脚本
vim ex7.sh

#!/bin/bash
for ip in `cat ip.list`
#循环执行ip.list,注意ip清单是上个试验的;
do
echo $ip
./ex7.expect $ip "w;free -m;ls /tmp"
#调用exe的expect脚本,并传递参数;
done

赋予exe.expect可执行权,并进行测试
chmod a+x exe.expect
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_43945846/article/details/93084840