linux使用shell脚本利用expect工具实现SCP传输文件到多台服务器
1、安装expect
yum install expect
2、设置服务器地址,用户名,密码,源路径,目标路径
新建文件host.txt添加如下内容
192.168.0.135 root 密码 源路径 目标路径
192.168.0.136 root 密码 源路径 目标路径
192.168.0.137 root 密码 源路径 目标路径
# 实例
192.168.128.133 root root /usr/local/shell/test1.txt /usr/local
3、添加expect执行脚本: cpExeShell.sh
用于读取服务器账号配置的host.txt进行调用执行scp登录传输 密码 + 服务器IP
#!/usr/bin/expect -f
set HOST [lindex $argv 0]
set USERNAME [lindex $argv 1]
set PASSWD [lindex $argv 2]
set source [lindex $argv 3]
set target [lindex $argv 4]
spawn scp -r $source $USERNAME@$HOST:$target
expect {"(yes/no)?"
{send "yes\n"
expect "*assword:" { send "$PASSWD\r" }
}
"*assword:"
{send "$PASSWD\r"
}
}
expect eof
expect是一个阻塞的switch,spawn执行一个命令后,expect会匹配返回值,并执行相应的操作。
expect格式
expect {"string" #-re可以正则匹配字符串{command}status{command}}
(注意,expect右边必须有值,把括号写在下一行会报错!)
其中command可以是tcl语法命令,如puts,也可以是expect命令,如send,exp_continue,exit等等;而status是指expect的状态信息,如timeout,connected。
set 赋值,sethost [lindex $argv0] 就是将参数0赋值给变量host,其中,[] 括起命令,执行括号内命令后返回结果,lindex是取列表中的某个参数,$argv则是参数列表。while { } {command} while循环,和bash类似,while后面要留一个空格,右括号后面再留一个空格,我就是在这里遇到了莫名的报错。。
4、添加shell脚本执行expect脚本:exeScp.sh
#!/bin/bash
dir=/home
while read line
do
host=`echo $line| awk '{print $1}'`
username=`echo $line | awk '{print $2}'`
passwd=`echo $line | awk '{print $3}'`
source=`echo $line | awk '{print $4}'`
target=`echo $line | awk '{print $5}'`
$dir/cpExeShell.sh $host $username $passwd $source $target
done < $dir/host.txt
5、赋予sh文件执行权限
chmod +x *.sh
6、执行
./exeScp.sh
说明:此处有三个文件均在home文件夹下,如需要发送其它文件夹到目标服务器,只需更改或增加host.txt文件中内容即可。(一般复制到home目录因为这个目录对外有可执行权限)
文件保留:
host.txt
192.168.128.133 root root /usr/local/shell/test1.txt /usr/local
cpExeShell.sh
#!/usr/bin/expect -f
set HOST [lindex $argv 0]
set USERNAME [lindex $argv 1]
set PASSWD [lindex $argv 2]
set source [lindex $argv 3]
set target [lindex $argv 4]
spawn scp -r $source $USERNAME@$HOST:$target
expect {"(yes/no)?"
{send "yes\n"
expect "*assword:" { send "$PASSWD\r" }
}
"*assword:"
{send "$PASSWD\r"
}
}
expect eof
exeScp.sh
#!/bin/bash
dir=/usr/local/shell
while read line
do
host=`echo $line| awk '{print $1}'`
username=`echo $line | awk '{print $2}'`
passwd=`echo $line | awk '{print $3}'`
source=`echo $line | awk '{print $4}'`
target=`echo $line | awk '{print $5}'`
$dir/cpExeShell.sh $host $username $passwd $source $target
done < $dir/host.txt
最终确定
192.168.128.133 root /usr/local/shell/qianyan-dbs-2021-01-14-17-42-04592.war /usr/local/qianyan-testshi1.war
192.168.128.136 root /usr/local/shell/qianyan-dbs-2021-01-14-17-42-04592.war /usr/local/qianyan-testshi111.war
#!/usr/bin/expect -f
set HOST [lindex $argv 0]
set USERNAME [lindex $argv 1]
#set PASSWD [lindex $argv 2]
set source [lindex $argv 2]
set target [lindex $argv 3]
spawn scp $source $USERNAME@$HOST:$target
expect eof
#expect eof 表示交互结束,退回到原用户
#!/bin/bash
dir=/usr/local/shell
while read line
do
host=`echo $line| awk '{print $1}'`
username=`echo $line | awk '{print $2}'`
#passwd=`echo $line | awk '{print $3}'`
source=`echo $line | awk '{print $3}'`
target=`echo $line | awk '{print $4}'`
$dir/cpExeShell.sh $host $username $source $target
if [ $? -eq 0 ]; thenecho "succeed"
elseecho "failed"
fi
done < $dir/host.txt
补充:
shell脚本中判断上一个命令是否执行成功
shell中使用符号“$?”来显示上一条命令执行的返回值,如果为0则代表执行成功,其他表示失败。
结合if-else语句实现判断上一个命令是否执行成功。
经过验证,该方法也适用于make命令,并不仅仅限于shell 命令。
if [ $? -eq 0 ]; thenecho "succeed"
elseecho "failed"
fi
shell中的比较符号如下:
-eq 等于
-ne 不等于
-gt 大于
-lt 小于
ge 大于等于
le 小于等于
linux expect详解
expect是一个自动化交互套件,主要应用于执行命令和程序时,系统以交互形式要求输入指定字符串,实现交互通信。
expect自动交互流程:
spawn启动指定进程—expect获取指定关键字—send向指定程序发送指定字符—执行完成退出.
expect常用命令总结:
spawn 交互程序开始后面跟命令或者指定程序
expect 获取匹配信息匹配成功则执行expect后面的程序动作
send exp_send 用于发送指定的字符串信息
exp_continue 在expect中多次匹配就需要用到
send_user 用来打印输出 相当于shell中的echo
exit 退出expect脚本
eof expect执行结束 退出
set 定义变量
puts 输出变量
set timeout 设置超时时间
interact 允许用户交互
linux使用shell脚本利用expect工具实现SCP传输文件到多台服务器相关推荐
- Linux环境Shell脚本上传下载阿里云OSS文件
为什么80%的码农都做不了架构师?>>> Linux环境Shell脚本上传下载阿里云OSS文件 背景 工作中由于我们项目生成的日志文件比较重要,而本地磁盘空间有限存储不了多久, ...
- linux shell脚本 静态检查工具 shellcheck 简介
简介 shellcheck 是一款实用的 shell脚本静态检查工具. 首先,可以帮助你提前发现并修复简单的语法错误,节约时间.每次都需要运行才发现写错了一个小地方,确实非常浪费时间. 其次,可以针对 ...
- linux 的动画脚本,shell脚本动画小工具
shell脚本动画小工具 看gif图: shell脚本版 脚本内容如下: #!/usr/bin/env bash ## ---------------------------------------- ...
- Linux系统shell脚本、python脚本编写
GPU排队脚本 python脚本 GPU排队脚本 ---- GPU一旦空闲触发脚本执行程序 参考: GPU排队脚本(python脚本) cmd = 'bash run.sh' 该句设置要执行的pyth ...
- Linux常用Shell脚本珍藏
我们在运维中,尤其是linux运维,都知道脚本的重要性,脚本会让我们的 运维事半功倍,所以学会写脚本是我们每个linux运维必须学会的一门功课,这里收藏linux运维常用的脚本.如何学好脚本,最关键的 ...
- linux du -sh 脚本,Linux之shell脚本(2)
Linux之shell脚本(2) 一.printf命令: printf是一个把从标准输入的字符按照你所要求的格式输出到标准输出即屏幕的命令.在很多时候,我们可能需要将自己的数据给他格式化输出的. 1. ...
- Linux之shell脚本(2)
Linux之shell脚本(2) 一.printf命令: printf是一个把从标准输入的字符按照你所要求的格式输出到标准输出即屏幕的命令. 在很多时候,我们可能需要将自己的数据给他格式化输出的. 1 ...
- linux循环处理脚本命令,后端开发必须掌握的Linux命令[Shell脚本篇]
Shell脚本相关命令 介绍 一句话说明shell脚本是个啥 shell脚本就是将多个shell指令汇集到一起去完成一个复杂的功能 类似windows下的批处理文件 一般以sh为文件后缀 语法 程序结 ...
- linux经典脚本实例,Linux常用Shell脚本珍藏
[实例简介] Linux常用Shell脚本珍藏 (2)编写任务定时器: C代码☆ 1. echo 00 1 *k */bin/sh /usr/bin/fileback">:/root/ ...
最新文章
- 赠 看穿一切的var_dump
- “埃尼阿克”背后的6个女孩
- 数据分析精华经验分享,看看冠军是如何炼成的?
- 小米手环五怎么和微信连接不上服务器,小米手环怎么连接手机微信
- 线性及非线性方程组的解法
- dataframe 众数的方法_学习数据分析数据方法论 [描述性统计分析]
- 指定locale为en_US
- Android学习笔记之AndroidManifest.xml文件解析(摘自皮狼的博客)
- qq android qav,33 BK.QQAVManager 音视频管理
- Spring源码下载---导入到Idea
- Android开发 -使用腾讯TBS浏览服务 X5webview控件
- 解决idea的程序包错误:程序包XXX不存在的问题
- 显示器接口_显示器接口 - CNZHIQIANG
- 联通发布“沃云”品牌 推出云计算产品
- qrcode增加二维码中心图片
- 安费诺面试经验(已面试,等通知)
- java吸血鬼_4位吸血鬼数字的java实现思路与实例讲解
- 深度揭秘Xshell后门事件:入侵感染供应链软件的大规模定向攻击
- jekenis+maven(nodejs)+svn自动化部署(前后端)
- 易科 Exact Globe Next 销售订单 请求日期(ETD)比发货日期提前5天
热门文章
- ue4集合类型_UE4.22 Subsystem分析
- ubuntu 串口 树莓派_linux系统(ubuntu)烧录安装树莓派及远程连接树莓派
- CentOS 7 LNMP环境搭建 Zabbix3.4
- Redis(十五)Redis 的一些常用技术(Spring 环境下)
- 打造IE6的position:fixed整理篇
- javaJavaScript DOM
- 在Java代码(非JSP及Action,Servlet,Controller)中获得WebRoot的物理路径
- 前端工程师---软必备
- DataTable:执行DataTable.Select(条件)返回DataTable的解决方法
- ASP经典分页类(改良后的分页类主要是显示属性)