第一部分:expect讲解
expect可以让我们实现自动登录远程机器,并且可以实现自动远程执行命令。当然若是使用不带密码的密钥验证同样可以实现自动登录和自动远程执行命令。但当不能使用密钥验证的时候,我们就没有办法了。所以,这时候只要知道对方机器的账号和密码就可以通过expect脚本实现登录和远程命令。
使用expect之前,需要先安装expect:
yum install -y expect

1. 自动远程登录,并执行命令,登陆另外一台机器,与机器交互的脚本,登陆自动输入密码
首先来看一个登录后不退出的脚本:
1. #! /usr/bin/expect
2. set host "192.168.11.102"
3. set passwd "123456"
4. spawn ssh root@$host #spawn 是一个语法
5. expect {
6. "yes/no" { send "yes\r"; exp_continue} #第一次登陆系统提示exp_continue往下走
7. "assword:" { send "$passwd\r" }
8. }
9. interact

再来看一个登陆后,执行命令然后退出的脚本:

1. #!/usr/bin/expect
2. set user "root"
3. set passwd "123456"
4.
5. spawn ssh $user@192.168.11.18
6.
7. expect {
8. "yes/no" { send "yes\r"; exp_continue}
9. "password:" { send "$passwd\r" }
10. }
11. expect "]*" #这里定位在输入状态*表示任意的字符root是显示#,其他用户显示$
12. send "touch /tmp/12.txt\r"
13. expect "]*"
14. send "echo 1212 > /tmp/12.txt\r"
15. expect "]*"
16. send "exit\r"

2. 我们还可以传递参数
1. #!/usr/bin/expect
2. set user [lindex $argv 0] #第一个是用户
3. set host [lindex $argv 1] #第二个是IP
4. set passwd "123456"
5. set cm [lindex $argv 2] #第三个cm是一个命令,用一个参数来体现
6.
7. spawn ssh $user@$host
8.
9. expect {
10. "yes/no" { send "yes\r"}
11. "password:" { send "$passwd\r" }
12. }
13. expect "]*"
14. send "$cm\r"
15. expect "]*"
16. send "exit\r"

执行 chmod +x 3.exp
./3.exp root 192.168.0.16 "ls /tmp/"

===============
rsync -av 1.expect
a代表带了很多很多的选项,包含权限软连接

把本地文件1.expect传到远程的机器上,如果远程机器的目录不存在,可以自动创建一层的目录,两层不行
rsync -av /tmp/shell/1.expect root@192.168.11.18:/tmp

rsync -av /tmp/shell/1.expect 192.168.11.18:/tmp 省略用户,登陆的是当前的用户

把远程机器的文件传到本地的机器上
rsync -av 192.168.11.18:/tmp/12.txt /tmp/12.txt

这个是自动把本地机器的文件同步到远程机器
3. 自动同步文件
1. #!/usr/bin/expect
2. set passwd "123456"
3. spawn rsync -av /tmp/12.txt root@192.168.11.18:/tmp
4. expect {
5. "yes/no" { send "yes\r"}
6. "password:" { send "$passwd\r" }
7. }
8. expect eof
9.

这个是自动把远程机器的文件同步到本地机器
3. 自动同步文件
1. #!/usr/bin/expect
2. set passwd "123456"
3. spawn rsync -av root@192.168.11.18:/tmp/12.txt /tmp/
4. expect {
5. "yes/no" { send "yes\r"}
6. "password:" { send "$passwd\r" }
7. }
8. expect eof
9.

4. 指定host和要同步的文件,把本地的文件传到远程机器
1. #!/usr/bin/expect
2. set passwd "123456"
3. set host [lindex $argv 0]
4. set file [lindex $argv 1]
5. spawn rsync -av $file root@$host:$file
6. expect {
7. "yes/no" { send "yes\r"}
8. "password:" { send "$passwd\r" }
9. }
10. expect eof

执行: ./4.expect 192.168.11.18 /tmp/12.txt
或者expect 4.expect 192.168.11.18 /tmp/12.txt

第二部分:构建文件分发系统
1. 需求背景
对于大公司而言,肯定时不时会有网站或者配置文件更新,而且使用的机器肯定也是好多台,少则几台,多则几十甚至上百台。所以,自动同步文件是至关重要的。

2. 实现思路
首先要有一台模板机器,把要分发的文件准备好,然后只要使用expect脚本批量把需要同步的文件分发到目标机器即可。
3. 核心命令
rsync -av --files-from=list.txt / root@host:/ #必须从根目录开始查找,list.txt可以写绝对路径,能找到这个文件就可以,就是路径拼接

=====
执行
rsync -av --files-from=list.txt / 192.168.11.16:/

先在一个文件list.txt里面创建好文件列表
/bin/shell/1.sh
/tmp/12.txt

====

4. 文件分发系统的实现
5.expect
1. #!/usr/bin/expect
2. set passwd "123456"
3. set host [lindex $argv 0]
4. set file [lindex $argv 1]
5. spawn rsync -av --files-from=$file / root@$host:/ #代表同步的文件列表
6. expect {
7. "yes/no" { send "yes\r"}
8. "password:" { send "$passwd\r" }
9. }
10. expect eof

11. #下面可以省略,用shell代替了
12. cat ip.list
13. 192.168.11.18
14. 192.168.11.19
15. ......

先实现一个机器分发
for ip in 192.168.11.16; do expect 5.expect $ip ./list.txt ; done

如果是分发多个
for ip in `cat ip.txt`; do expect 5.expect $ip ./list.txt ; done
=======================

执行的脚本

rsync.sh
1. #!/bin/bash
2. for ip in `cat ip.list`
3. do
4. echo $ip
5. ./5.expect $ip list.txt
6. done
7.

=====================

5. 命令批量执行脚本
exe.expect
1. #!/usr/bin/expect
2. set host [lindex $argv 0]
3. set passwd "123456"
4. set cm [lindex $argv 1]
5.
6. spawn ssh root@$host
7.
8. expect {
9. "yes/no" { send "yes\r"}
10. "password:" { send "$passwd\r" }
11. }
12. expect "]*"
13. send "$cm\r"
14. expect "]*"
15. send "exit\r"

ip.txt 里面有192.168.11.16 多个可以有循环

for ip in `cat ip.txt`; do ./exe.expect $ip "w;ls -dl /tmp; touch /root/aming123.txt"; done

==============
执行的脚本

exe.sh
1. #!/bin/bash
2. for ip in `cat ip.list`
3. do
4. echo $ip
5. ./exe.expect $ip 'w;free -m;ls /tmp"
6. done

ssh 192.168.11.16

最新文章

  1. 怎样把windows中安装的程序列出来?
  2. 输入 cc -c 指令出现问题
  3. 【LeetCode】6. ZigZag Conversion 锯齿形转换
  4. hdu 1491 Octorber 21st
  5. strcpy,memcpy,内存块重叠
  6. HDOJ 4696 Answers 乱搞
  7. Silverlight客户端调用WCF服务难题解疑
  8. asp.net mvc4 easyui datagrid 增删改查分页 导出 先上传后导入 NPOI批量导入 导出EXCEL
  9. Jquery的一些取值
  10. Unity3d 网络编程(二)(Unity3d内建网络各项參数介绍)
  11. 【Nginx】显示器port管理
  12. 网页 HTML表单
  13. 201521123018 《Java程序设计》第6周学习总结
  14. 同一台电脑同时装Oracle客户端和服务端
  15. KS检验统计量的扩展应用(CMap)
  16. Javascript书籍推荐----(步步为赢)
  17. 5G 时代,可能是什么样呢?
  18. 四、Python数据类型(二)
  19. mysql中使用存储过程方法中的注意事项
  20. spring学习 十五 spring的自动注入

热门文章

  1. u-boot.2012.10makefile分析,良心博友汇总
  2. shell之lvm
  3. [BZOJ3563&3569]DZY Loves Chinese
  4. 佛山Uber优步司机奖励政策(12月21日到12月27日)
  5. CF 1042 E. Vasya and Magic Matrix
  6. hive中的优化问题
  7. cakephp中find('list')的使用
  8. HBase 数据的多版本特性潜在的意外
  9. Python汉诺塔问题递归算法与程序
  10. .NET中发送邮件的实现