保障4-0620-任务打卡

任务列表:
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

20.27 分发系统介绍

需求背景:

  • 对于大公司而言,肯定时不时会有网站或者配置文件更新,而且使用的机器肯定也是好多台,少则几台,多则几十甚至上百台。所以,自动同步文件是至关重要的。

实现思路

  • 首先要有一台模板机器,把要分发的文件准备好,然后只要使用expect脚本批量把需要同步的文件分发到目标机器即可。
  • 要求清楚被同步机器的IP和密码。

核心命令

  • rsync -av --files-from=list.txt /root@host:/

分发系统需要安装expec

 yum install -y expect
  • makepasswd这个命令就来源于expect安装包。
  • expec也是一种脚本语言,和shell很像。
  • expec可以远程执行文件和传输数据,并且不需要输入密码。

20.28 expect脚本远程登录

1,自动远程登录脚本

 #! /usr/bin/expect
set host "192.168.133.132"
set passwd "123456"
spawn ssh root@$host
expect {
"yes/no" { send "yes\r"; exp_continue}
"password:" { send "$passwd\r" }
}
interact
  • expect变量赋值:set 变量名 “变量值”
  • /root/.ssh/known_hosts是登陆保存文件。如果清空,会要求曾经登录过的用户再次输入口令。
  • 当提示语句中包含yes/no时,发送yes。否则执行下一条语句。
  • 当提示语句中包含passwdord时,发送$passwd的变量值。
  • /r表示回车
  • 文件应当有执行权限,直接输入文件名就可以运行了。
  • interact会使脚本执行完成后继续停留在终端。
  • 以expect eof结尾则会在短暂的停留后离开终端。
  • 不以这两处方法结尾则会直接退出终端。

20.29 expect脚本远程执行命令

#!/usr/bin/expect
set user "root"
set passwd "123456"
spawn ssh $user@192.168.133.132
expect {
"yes/no" { send "yes\r"; exp_continue}
"password:" { send "$passwd\r" }
}
expect "]*"
send "touch /tmp/12.txt\r"
expect "]*"
send "echo 1212 > /tmp/12.txt\r"
expect "]*"
send "exit\r"
  • 执行命令使用expect 作为开头。
  • expect执行之前都有一个查找“内容”的行为。
  • 执行动作是向终端发送“shell命令”。所以远程执行命令的格式如下:
expect "匹配的内容"
send "shell命令"
  • 当匹配到相应的行就会执行。

20.30 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"
  • set user [lindex $argv 0]就是把expect命令的第一个参数赋予user。
  • 这个脚本的结果为:
脚本名称 用户名 主机IP 执行命令

用这种方式就可以远程执行命令了。

  • 多条命令使用分号“;”隔开。
  • 默认执行超过十秒会自动退出终端。
  • 使用set timeout 秒来控制系统等待这行命令的执行时间。永久等待时间为设为-1。
  • 设定超时间仅对那些一直在前台工作的命令有效(比如w命令)。对于后台执行的命令无效(比如传输文件)。

20.31 expect脚本同步文件

#!/usr/bin/expect
set passwd "123456"
spawn rsync -av root@192.168.133.132:/tmp/12.txt /tmp/
expect {
"yes/no" { send "yes\r"}
"password:" { send "$passwd\r" }
}
expect eof
  • 这里传输文件需要时间,所以结尾要加expect eof来等待命令结束。
  • 如果不加eof则会立即退出导致文件传输无法完成。

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

#!/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
  • file参数一定要写绝对路径

20.33 构建文件分发系统

核心思想:以sh的循环命令来生成expect的ip参数。

1,rsync.sh 内容

#!/bin/bash
for ip in `cat ip.list`
do
 echo $ip
 ./rsync.expect $ip file-list.txt
done
  • 将expect作为sh的一个模块来执行文件传输。
  • ip.list内容
    192.168.133.132
    192.168.133.133
  • 这时应该制做一个file-list.txt用来控制传输哪些文件。

2,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:/
expect {
"yes/no" { send "yes\r"}
"password:" { send "$passwd\r" }
}
expect eof
  • --files-from=会调用$file变量的值。这里的file变量的值就是file-list.txt文件。

20.34 批量远程执行命令

exe.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"

exe.sh 内容

#!/bin/bash
for ip in `cat ip.list`
do
 echo $ip
 ./exe.expect $ip "w;free -m;ls /tmp"
done

核心思路和分发系统类似

  • 同样以ip.list来控制执行命令的主机
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值