第一部分: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

第四部分shell编程5项目二分发系统的更多相关文章

  1. 一、Vim编辑器 二、用户和组管理 三、软件的安装(jdk,mysql) 四、Shell编程

    一.Vim编辑器的使用 1. vim编辑器的运行模式 编辑模式:等待用户编辑命令的输入 插入模式:编辑文本内容 命令模式:执行命令 2. 使用 :vim 文件名 3. 查看当前vim编辑器介绍:vim ...

  2. Shell编程-项目部署(一)

    由于实际工作中经常用到需要部署项目,比较麻烦,今天记录下如何利用shell脚本完成自动部署的工作,毕竟不是专业的运维出身,写的不好,还请勿喷_^o^_ 今天以部署Django项目为演示,进行部署项目, ...

  3. 7-1 shell编程基础之二

    shell编程基础之二 算数运算 bash中的算术运算:help let +, -, *, /, %取模(取余), **(乘方),乘法符号有些场景中需要转义 实现算术运算: (1) let var=算 ...

  4. shell编程-项目部署(二)

    上节我们讲了项目部署的准备工作,现在具体讲下代码部署 首先梳理下思路,大致是这样: 获取代码 打包代码 传输代码 关闭应用 解压文件 放置文件(备份老文件,放置新的文件) 开启应用 最后检查下 OK, ...

  5. SHELL编程笔记(二)之shell流程控制

    Shell控制流程结构 本章内容有:   退出状态   While.for和until loops循环   If then else语句   脚本中动作   菜单 条件控制语句 If then els ...

  6. linux shell编程学习笔记(二) --- grep命令

    Linux系统中grep命令是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹 配的行打印出来.grep全称是Global Regular Expression Print,表示全局正则表达 ...

  7. shell编程-项目部署(优化篇)

    在实际工作中小编遇到了一个问题那就是当我去操作部署脚本的时候,另一个人也可以操作,这怎么能行啊,后来小编就觉得重新优化下代码,给它加一个进程锁 老规矩,先梳理下思路: 同一时间内,脚本只能够允许一个人 ...

  8. Shell 编程(实例二)

    创建一个脚本,为指定硬盘创建分区 1.列出当前系统所有磁盘,让用户选择,如果选择quit则退出脚本:如果选择错误,则重新选择 2.当用户选择完成后,询问是否继续 3.抹除选择磁盘上的分区,为其创建三个 ...

  9. shell编程题(二)

    计算1-100之和 #!/bin/bash `;do #符号不是单引号 是 1左边的符号 sum=$[$i + $sum ] done echo $sum #!/bin/bash i= n=1 #定义 ...

随机推荐

  1. Java学习笔记二十一:Java面向对象的三大特性之继承

    Java面向对象的三大特性之继承 一:继承的概念: 继承是java面向对象编程技术的一块基石,因为它允许创建分等级层次的类. 继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方 ...

  2. MCUXpresso release build 时提示GFLIB等函数未引用的问题

    MCUXpresso release build 时提示 GFLIB 等函数未引用的问题 最近在使用 MCUXpresso 编译工程时选择 Debug(Debug build) 能顺利编译,但是选择 ...

  3. Java语法糖 : try-with-resources

    先了解几个背景知识 什么是语法糖 语法糖是在语言中增加的某种语法,在不影响功能的情况下为程序员提供更方便的使用方式. 什么是资源 使用之后需要释放或者回收的都可以称为资源,比如JDBC的connect ...

  4. JAVA8 Stream API的使用

    /** * @auther hhh * @date 2018/12/31 12:48 * @description Stream流:用来处理数组.集合的API * 1.不是数据结构,没有内部存储(只是 ...

  5. 网易云音乐API

    网易云音乐API使用 封装了一些api调用 ZZRRegion/StNetease

  6. 牛客小白月赛4C——病菌感染

    链接:https://www.nowcoder.com/acm/contest/134/C 来源:牛客网 #include <bits/stdc++.h> using namespace ...

  7. java四种访问权限

    java有四种访问权限,它们各自的范围如下图所示 当下列访问修饰符修饰字段和方法时: private 任意位置的子类不可以访问从父类继承的private字段和方法.这里所说的访问包括通过super关键 ...

  8. JDBC与Java数据库编程基础

    一.JDBC 概述 1.什么是JDBC 称为Java数据库连接,它是一种用于数据库访问的应用程序API,由一组用Java语言编写的类和接口组成,有了JDBC就可以用同一的语法对多种关系数据库进行访问, ...

  9. stylus , another css processor

    1. install from npm sudo npm install stylus 2. create a styl file named step1.styl border-radius() { ...

  10. P3379 【模板】最近公共祖先(LCA)

    P3379 [模板]最近公共祖先(LCA) 题目描述 如题,给定一棵有根多叉树,请求出指定两个点直接最近的公共祖先. 输入输出格式 输入格式: 第一行包含三个正整数N.M.S,分别表示树的结点个数.询 ...