任务列表:
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来控制执行命令的主机