第四部分shell编程5项目二分发系统
第一部分: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项目二分发系统的更多相关文章
- 一、Vim编辑器 二、用户和组管理 三、软件的安装(jdk,mysql) 四、Shell编程
一.Vim编辑器的使用 1. vim编辑器的运行模式 编辑模式:等待用户编辑命令的输入 插入模式:编辑文本内容 命令模式:执行命令 2. 使用 :vim 文件名 3. 查看当前vim编辑器介绍:vim ...
- Shell编程-项目部署(一)
由于实际工作中经常用到需要部署项目,比较麻烦,今天记录下如何利用shell脚本完成自动部署的工作,毕竟不是专业的运维出身,写的不好,还请勿喷_^o^_ 今天以部署Django项目为演示,进行部署项目, ...
- 7-1 shell编程基础之二
shell编程基础之二 算数运算 bash中的算术运算:help let +, -, *, /, %取模(取余), **(乘方),乘法符号有些场景中需要转义 实现算术运算: (1) let var=算 ...
- shell编程-项目部署(二)
上节我们讲了项目部署的准备工作,现在具体讲下代码部署 首先梳理下思路,大致是这样: 获取代码 打包代码 传输代码 关闭应用 解压文件 放置文件(备份老文件,放置新的文件) 开启应用 最后检查下 OK, ...
- SHELL编程笔记(二)之shell流程控制
Shell控制流程结构 本章内容有: 退出状态 While.for和until loops循环 If then else语句 脚本中动作 菜单 条件控制语句 If then els ...
- linux shell编程学习笔记(二) --- grep命令
Linux系统中grep命令是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹 配的行打印出来.grep全称是Global Regular Expression Print,表示全局正则表达 ...
- shell编程-项目部署(优化篇)
在实际工作中小编遇到了一个问题那就是当我去操作部署脚本的时候,另一个人也可以操作,这怎么能行啊,后来小编就觉得重新优化下代码,给它加一个进程锁 老规矩,先梳理下思路: 同一时间内,脚本只能够允许一个人 ...
- Shell 编程(实例二)
创建一个脚本,为指定硬盘创建分区 1.列出当前系统所有磁盘,让用户选择,如果选择quit则退出脚本:如果选择错误,则重新选择 2.当用户选择完成后,询问是否继续 3.抹除选择磁盘上的分区,为其创建三个 ...
- shell编程题(二)
计算1-100之和 #!/bin/bash `;do #符号不是单引号 是 1左边的符号 sum=$[$i + $sum ] done echo $sum #!/bin/bash i= n=1 #定义 ...
随机推荐
- python爬虫#数据存储#JSON/CSV/MYSQL/MongoDB/
Json数据处理 JSON支持数据格式: 对象(字典).使用花括号. 数组(列表).使用方括号. 整形.浮点型.布尔类型还有null类型. 字符串类型(字符串必须要用双引号,不能用单引号). 多个数据 ...
- C# 截取屏幕图像
#region 截取屏幕图像 private static Bitmap GetScreenCapture() { Rectangle tScreenRect = , , Screen.Primary ...
- swig与python
当你觉得python慢的时候,当你的c/c++代码难以用在python上的时候,你可能会注意这篇文章.swig是一个可以把c/c++代码封装为python库的工具.(本文封装为python3的库) 文 ...
- JavaScript---通过正则表达式验证表单输入
验证输入的name只能是数字或字母或下划线 js <script type="text/javascript"> function submitOn(){ var f ...
- 友晶Altera Cyclone V GX Starter Kit开发板使用ADC-第一篇
1. 拿到板子在,做工很好,属于GX系列,GX应该是高速收发器 2. 去探究下GX是什么用途,大约有6个型号,这个板子是5CGXFX5,有77 LE逻辑单元,这个收发器不知道是什么?6个 3.125G ...
- 三 Hive 数据处理 自定义函数UDF和Transform
三 Hive 自定义函数UDF和Transform 开篇提示: 快速链接beeline的方式: ./beeline -u jdbc:hive2://hadoop1:10000 -n hadoop 1 ...
- SpringBoot入门(二)——起步依赖
本文来自网易云社区 在前一篇我们通过简单几步操作就生成了一个可以直接运行的Web程序,这是因为SpringBoot代替我们做了许多工作,概括来讲可以分为起步依赖和自动配置.这一篇先来看看起步依赖. 项 ...
- Siki_Unity_1-1_Unity零基础入门_打砖块
1-1 Unity零基础入门 打砖块 任务1:素材源码 www.sikiedu.com/course/77 任务2:Unity介绍 王者荣耀,球球大作战等游戏都是用unity开发的 跨平台的游戏引擎 ...
- linux学习总结----mongoDB总结
dbhelper.py 用户登录和注册(加密算法) 加密导包 import hashlib 或者使用Md5 加密 MongoDB ->JSON service mysql start servi ...
- 原生js实现轮播图原理
轮播图的原理1.图片移动实现原理:利用浮动将所有所有照片依次排成一行,给这一长串图片添加一个父级的遮罩,每次只显示一张图,其余的都隐藏起来.对图片添加绝对定位,通过控制left属性,实现照片的移动. ...